[컴퓨터네트워크] P2P 프로토콜
P2P 프로토콜
:peer 는 서버가 없는 구조를 지칭한다
순수 P2P 구조
- no always-on server (P2P에서는 alwayas on server가 없다)
- 피어들끼리 직접 통신(많은 피어들이 직접 연결하여 통신한다)
- 피어들끼리 가끔씩 연결되어 IP 주소 교환 ( 피어들은 항상 연결되는 게 아니고 가끔씩 연결될 수 있다)
피투피 구조를 잘 만들기 위해서는 파일을 어떻게 배포하고 파일을 어떻게 찾는지가 주요 이슈가 된다.
피투피 모델에 대해 파일 배포방식으로 비교를 해보자
Server-Clinet 방식과 P2P 방식에서
1개의 서버가 N개의 피어에게 파일을 배포할때 얼마나 오래 걸릴까?
클라이언트-서버 방식
-서버가 N개의 파일을 순서대로 보내는 시간 N*F/U_s time
- i 번째 클라이언트가 다운받는 시간 F/d_i time to download
만약 아주 많은 클라이언트가 접속했다면 클라이언트-서버 모델에선 파일 다운 속도가 굉장히 오래 걸릴 수 있다.
피투피 방식
- 서버는 1개의 파일을 업로드하는 시간: F/U_s time
- i번째 클라이언트는 F/d_i time
- 전체적으로 N*F bits 업로드
업로드하는 쪽에서 N이 등장하였다. N 이 등장하면 분자도 커지고 분모도 커지게 된다. N이라는 숫자에 따라 선형적으로 증가하진 않는 다는 의미이다.
BitTorrent
P2P의 예시로 BitTorrent 가 있다. 피투피는 모든 클라이언트들이 파일을 전송하고 다운받는다. 따라서 peer list 들을 관리해야한다.
빗토렌트는 여러 버전이 있는데 파일을 큰 덩어리가 아닌 아주 작은 조각으로 본다는 특징이 있다. 파일을 256KB chunks 의 작은 조각으로 분할하여 피어들끼리 교환할 수 있도록 한다. 피어들은 자유롭게 가입, 탈퇴가 가능하다.
특징
- 파일을 256kb의 덩어리로 쪼갠다
- torrent에 있는 peer들이 file 덩어리를 보내고 받는다.
- Tracker : torrent에 참여하는 peer들을 추적한다
- Torrent : 파일 덩어리를 교환하는 peer들의 그룹
- torrent에 조인하는 peer
- 처음엔 아무것도 없지만 점차 시간이 지날 수록 다른 peers의 chunk가 축적된다
- tracker에 등록해서 peer의 목록을 가져오고, peers("neighbors")의 하위 집합에 연결한다.
- 다운로드 하는 동안 peer는 chunks를 다른 peers에게 업로드한다.
- peer는 chunk를 교환하는 peers를 바꿀 수 있다.
- 만약 peer가 전체 파일을 갖게 되면, 그것은 떠날 수도, torrent에 남아 있을 수도 있다.
송수신은 청크라는 단위로 한다. 따라서 청크 자체의 리스트도 관리를 해야한다. 어느것을 먼저 받아야할지의 문제이다.
수신 청크들
- 어느 시간에나, 다른 peer는 파일 chunk의 다른 부분을 가지고 있다.
- 주기적으로 피어는 이웃들에게 그들이 가지고 있는 chunk 목록을 요청한다.
- 피어는 가장 드문(?) missing(없는?) chunk부터 peers에게 요청한다.(rarest first)
송신 청크들 : tit-for-tat
- 피어가 4개 이웃에게 chunk를 전송한다.
- 다른 peers는 Alice에게 질식한다(choked) ; 그녀로부터 chunks를 받지 못함
- 10초마다 상위 4개를 재평가한다.
- 30초마다 무작위로 다른 peer을 골라서 chunks를 보낸다
- Optimistically unchoke this peer
- 새로 선택한 peer가 top 4에 join 할 수 있다.
다음을 파일을 어떻게 찾을 지에 대한 문제이다.
우리가 원하는 파일이 어느 피어들에게 저장되어있는지 찾기위해
DHT(Distrivuted Hash Table) 자료구조를 사용한다.
DHT
해시를 이용하긴 하지만 분산되어 있다. 해시테이블을 분산하여 만든 것이다.
- (key, value) 쌍으로 찾게 된다. / key : content , value: IP 주소 / 피어들은 DB에 키로 물어보고 DB 는 키에 매칭되는 IP 주소 값을 반환한다.
- 피어는 (key, value) 를 삽입할 수 있다.
- 각 피어는 정수 식별자로 할당한다. [0, 2^n-1] / 각 식별자는 n bit 로 표시
- 각 키는 특정 범위내의 정수여야한다. 정수 키값을 얻기 위해서는 원래 키값에 대해서 해슁한다. key = h("Led Zeppelin LV")
(키, 밸류) 페어를 피어들에게 어떻게 할당할지에 관한 이슈
- 규칙: 키를 가장 가까운 ID 를 가진 피어에게 할당함 (가장 가까운이란 키의 가장 인접한 이웃이라는 의미이다)
ex) n = 4 / peers : 1,3,4,5,8,10,12,14
key = 13, then successor peer = 14
key = 15, then successor peer = 1
각 노드는 인접 노드만 알고있다. 피어들은 오버레이 네트워크 상에서 인접노드로 서로 서로 연결되어 있다. 아래는 예시에 대한 그림이다.
노드끼리 지름길을 설정할 수도 있다. 지름길을 통해 더 빨리 파일을 찾을 수 있다.
SKype
스카이프도 P2P 케이스에 속한다. VolP 특성상 사용자간 P2P 통신이다.
전용 응용 프로토콜(VolP프로토콜) 을 사용한다.
계층적 구조를 가진다. (수퍼노드 존재)
정리
P2P 프로토콜은 클라이언트-서버 프로토콜에 비해 성능이 우월하나 관리(피어구조, 파일찾기)가 힘들다. 피어들이 자유롭게 조인, 탈퇴를 할 수 있어서 안정적이라고 할 수는 없다.