Computer Network — 6. P2P

김희규
6 min readOct 19, 2018

--

이 글은 2018년 2학기 아주대학교 Paul Rajib 교수님의 Computer Network 수업을 듣고 작성한 수업노트입니다. 부족한 내용이나 오류가 있을 수 있습니다.

P2P Architecture

P2P(Peer to Peer) 구조는 네트워크 상의 피어(Peer — P2P 구조에서 네트워크 통신을 하는 기기)들이 서버없이 서로간에 연결되어 통신하는 구조를 의미한다.

한 피어는 다른 몇몇 피어를 알 뿐 네트워크 상의 모든 피어를 알지는 못한다. 또 피어의 IP주소는 변경될 수 있고 갑자기 사라져버릴 수도 있다. 순수한 P2P 구조에선 서버가 존재하지 않는다.

DHT

DHT(Distributed Hash Table)는파일을 공유하는 P2P 네트워크에서 다른 피어들로부터 파일을 얻기 위해서 사용되는 데이터 구조이다. 해시 알고리즘을 이용해서 파일정보(이름, 크기 등)을 해싱하고 그 파일을 어떤 피어가 갖고있는지 정보를 나타낸다.

각각의 피어는 자신을 나타내는 고유한 ID값을 가지는데, 해시한 값과 피어의 ID을 Key-Value로 갖게 된다. 파일 해시값이 28이고 피어 ID가 1이면 (Key, Value)는 (28, 1)이다. 이런 해시 쌍을 테이블 구조로 관리해서 한 피어가 다른 피어가 어떤 파일을 갖고 있는지에 대한 정보를 저장하게된다.

한 피어가 P2P 네트워크에서 파일을 찾을 때, 이 피어는 자신이 아는 다른 피어에게 파일의 해시값을 통해 파일을 소유하고있는지 물어본다. 물어본 피어가 파일이 없을 경우 그 피어 역시 자신이 알고있는 또다른 피어에게 물어본다. 그 피어가 파일을 갖고 있을 수 있고, 혹은 그 파일을 갖고 있는 다른 피어를 알 수도 있다. 그렇다면 그 정보를 처음에 물어봤던 피어에게 알려준다. 그렇게 처음의 피어는 어떤 피어가 파일을 갖고 있는지 알게된다.

위 예시에서 13피어는 mmcn.mp4를 찾기위해 25피어에게 묻고, 25피어는 32피어에게 다시 묻는다. 32피어는 1피어가 해당 파일을 갖고있단 정보를 13피어에게 직접 알려준다. 13피어는 다시 1피어에게 파일을 달라는 요청을 하게된다.

이렇게 파일을 구한 13피어는 1피어의 정보를 알려준 32피어에게 자신이 파일을 갖게 되었다는 정보를 알려주게되고, 32피어는 13피어가 파일을 갖게 되었다는 정보를 자신의 DHT에 저장하게된다.

Circular DHT

피어가 주변 피어에게 물어보면 그 피어들은 또 다른 피어에게 물어보고… 이런 과정이 반복되면 네트워크 상에서 엄청나게 많은 조회트래픽이 생성된다(3명에게 물어보면 그 3명이 9명에게 물어보고 9명이 27명…81명…). 이렇다보니 이런 수많은 트래픽이 발생되는 걸 막기 위해 고안된 방식이 Circular DHT이다.

Circular DHT는 피어들이 ID대로 정렬된 후 원형으로 연결되어 자신의 앞(Successor), 뒤(Predecesor)의 DHT를 갖는 구조이다. 위 사진에서 12피어는 앞인 13피어와 뒤인 1피어의 DHT만 갖게 된다. 또 몇몇 지름길(shortcut)들의 정보도 갖게 된다.

이 상태에서 12피어가 어떤 파일을 찾으려고 할 때 여러 피어에게 물어보는 게 아닌 한쪽 방향의 피어에게 계속해서 물어보면서 최종적으로 정보를 알고 있는 피어에게 도달한다. 일부 지름길을 사용해서 더 멀리있는 피어에게 빠르게 물어볼 수도 있다.

피어의 추가/삭제

갑작스럽게 피어가 네트워크에서 사라질 수도 있고, 새로운 피어가 들어올 수도 있다.

피어가 갑작스럽게 사라진다면 원형으로 연결된 네트워크가 끊기게된다. 이를 방지하기위해 한 피어는 앞, 뒤 그 너머의 피어를 하나씩 더 알고있어야 한다. 위 예시에서 피어5가 갑작스럽게 사라졌고, 그렇다면 피어 4는 앞 너머의 피어인 피어 8을 새로운 앞 피어로 저장하게 된다.

새로운 피어가 추가될 땐 우선 네트워크 속한 한 피어에게 자신이 추가되고 싶다고 알린다(JOIN 요청). 원형 구조에서 피어의 ID순으로 정렬되어야 하기 때문에 이 요청을 받은 15피어는 다른 피어에게 추가요청을 포워딩(넘겨줌)한다. 이 요청이 새로 추가되려고 하는 6피어가 위치할 피어에게 도달했을 때(위 사진의 경우 5피어), 5피어가 5피어와 8사이에 추가될 수 있다고 6피어에게 메시지를 보낸다(JOIN-ACK). 이렇게 6피어가 5피어와 8피어 사이에 들어가게 된다. 또 주변의 피어들도 앞, 뒤 피어의 정보를 갱신하게 된다.

BitTorrent Algorithm

순수한 P2P 네트워크는 서버가 없어야 하지만, 실제로 서버가 없을 경우 다른 피어를 찾기가 매우 힘들다. 따라서 대부분의 P2P 서비스들은 처음에는 서버를 통해 피어를 찾고 이후에 P2P통신을 하는 하이브리드 방식을 사용한다. 파일 공유를 위해 주로 사용하는 BitTorrent 서비스도 이와 비슷한 방식이다.

BitTorrent는 한 파일을 공유하는 그룹을 스웜(Swarm)이라고 한다. 이 스웜 안에서 피어들이 파일을 공유하는데 이 피어들의 정보를 알고있는 트래커(Tracker)가 스웜을 관리한다. 새로운 피어가 파일을 공유하기 위해 스웜에 참여하려면 트래커에게 요청해야한다. 그러면 트래커는 스웜에 이 피어를 추가시켜주고 피어들간의 통신을 할 수 있다.

BitTorrent에선 한 파일을 여러 조각으로 쪼개서 피어들이 일부 조각만 갖고 있거나 전체를 갖고 있다. 전체를 가진 피어를 시더(Seeder)라고 하고 그렇지 않은 피어를 리처(Leecher)라고 한다. 트래커는 스웜 안에서 어떤 피어가 시더고 어떤 조각을 갖고 있는지 알고 있다. 트래커를 통해 다른 피어들로부터 파일 조각들을 모아서 온전한 파일 하나로 합쳐서 파일을 다운로드할 수 있게 된다. 또 피어 자신도 다른 피어의 요청이 오면 파일 조각을 건내주고, 이런 자신의 상태를 트래커와 공유한다.

우리가 토렌트 서비스를 이용할 때 쓰는 토렌트 파일(.torrent)에는 파일의 정보와 해싱 알고리즘, 트래커들의 주소 등이 적혀있다. 이 정보들을 통해 토렌트 서비스는 트래커를 통해 스웜에 들어가 다른 피어들과 자료를 공유하게 된다.

--

--

김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.