Network

[컴퓨터네트워크] P2P 프로토콜

우당탕탕코딩일기 2023. 10. 2. 11:46

 

 

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이라는 숫자에 따라 선형적으로 증가하진 않는 다는 의미이다. 

클라이언트 서버에서는 N이 증가함에 따라 선형적으로 증가하지만 P2P는 선형적으로 증가하지 않는다. 따라서 N 이 커지게 되면 클라이언트-서버 방식보다 P2P 방식이 성능이 뛰어날 수 있다.

 

 

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 프로토콜은 클라이언트-서버 프로토콜에 비해 성능이 우월하나 관리(피어구조, 파일찾기)가 힘들다. 피어들이 자유롭게 조인, 탈퇴를 할 수 있어서 안정적이라고 할 수는 없다. 

728x90