[네트워크] 2-6. P2P architecture

kkado·2023년 4월 11일
0

네트워크

목록 보기
10/49

⚠️ 들어가기 앞서
경북대학교 컴퓨터학부 COMP0414-001 컴퓨터망 과목을 공부하며 정리한 글입니다.


1. P2P?

P2P, 즉 Peer to peer 통신 구조는 서버, 클라이언트의 구조가 아닌, 모두 동등한 지위를 가지는 피어(Peer)들이 서로 직접 연결되어 메시지를 주고받는 구조를 의미한다.

앞서 언급한 내용이므로 간단히만 짚고 넘어간다. 이번 장에서는 보다 구체적인 P2P 구현을 알아보고자 한다.


2. P2P File distribution

한 서버 컴퓨터가 가지고 있는 F 크기의 파일을 N 명의 피어들에게 모두 뿌려주고 싶다고 하자.

server-client architecture

먼저 서버-클라이언트의 구조부터 살펴보면, 서버-컴퓨터의 TCP 연결이 N명의 사용자들 각각에 대해 수립되어야 한다.
파일의 크기를 업로드 속도로 나눈 F/u 가 하나의 파일 복사본을 전달하는 시간이 될 것이다. 이를 N명에게 모두 해 주어야 하므로 서버의 입장에서 클라이언트들에게 파일을 전달하는 시간은 NF/u 다.

이번에는 클라이언트의 입장에서 살펴보면 각각 서버로부터 파일을 전송받을 것인데 클라이언트마다 대역폭이 상이해 받는 시간에 차이가 있을 수 있다. 이 때 가장 느린 클라이언트가 파일 수신이 완료되는 시점까지의 시간은 파일 크기 F를 minimum download rate d 로 나눈 F/d 이다.

이렇게 서버와 클라이언트의 관점에서 각각 구한 소요 시간에서 더 큰 값이 바로 한 서버 컴퓨터가 가지고 있는 F 크기의 파일을 N 명의 피어들에게 모두 뿌려주는데 걸리는 시간이다.

p2p architecture

이번에는 p2p 구조를 살펴보자.

  • 먼저 파일을 갖고 있는 서버 컴퓨터는 최소 하나의 복사본을 업로드해야 한다. 그 시간은 앞서 구했던 F/u 이다.
  • 그리고 각 클라이언트는 파일 사본을 무조건 다운로드 해야한다. 앞서 구했듯 F/d 시간이 소요된다.
  • 그리고 전체 집합체에서 NF bit만큼을 다운로드해야 하는데 이 때 max upload rate는 u + ∑u 이다.

여기서 구한 세 가지 시간 중 가장 큰 시간이 바로 한 서버 컴퓨터가 가지고 있는 F크기의 파일을N 명의 피어들에게 모두 뿌려주는데 걸리는 시간 이다.

즉, server-client는 N개의 파일을 올릴 때, 서버가 순차적으로(capacity만큼씩) 다 올려야하고, P2P에서는 peers들이 1개 이상씩 올려서 N개가 되면 되니까, P2P의 file distribution time이 더 짧다.

클라이언트의 수에 따라 두 구조의 minimum distribution time은 대략 이런 식으로 나타나고, 그래프를 보면 클라이언트-서버 구조는 linear 하게 증가하지만 p2p 구조는 피어 수가 많아지면 많아질수록 증가폭이 감소하는 로그함수 형태를 띠고 있다.


3. BitTorrent, DHT

p2p 파일 공유는 서버의 개념 없이 사용자와 사용자가 직접 연결되어 파일을 주고 받는다고 하였다. 그럼 이러한 궁금증이 발생한다.

내가 찾고자 하는 파일을 누가 가지고 있는지 어떻게 알까? 수많은 사용자들에게 일일이 다 물어보아야 하는건가?

어떤 파일을 누가 가지고 있는지에 대한 정보를 중앙에서 관리하면 p2p이긴 한데 서버의 개념이 사용되었다고 볼 수 있다.
그렇다면 중앙에서 관리하지 않으면서 내가 찾는 파일을 누가 가지고 있는지 알아낼 수 있는 방법이 없을까...

라는 생각에서 등장한 것이 Distributed Hash Table DHT 이다.

먼저 해시(Hash) 함수에 대해서 간단히 알고 넘어가자면 특정 값을 집어넣었을 때 특정한 값이 튀어나오는 말 그대로 함수 이다.

DHT는 다음과 같이 구현된다.

  • 각 호스트의 IP 주소를 각각 해시 함수에 집어넣어서 나온 인덱스를 기록한다.
  • 각 호스트가 가지고 있는 파일들을 각각 해시 함수에 집어넣어서 나온 인덱스를 기록한다.
  • 어떤 호스트가 어던 파일을 찾고자 할 때 인덱스를 꼬리물기 하면서 탐색한다.

좀 더 자세한 설명은 여기 를 참고!

아무튼 이런 방식으로 p2p 파일 공유를 완료할 수 있다. 자기가 파일 공유를 다 받으면 자신도 공유자가 되어 다른 사람에게 파일을 제공할 수 있다.


BitTorrent의 세부 구현 사항

피어들을 서로 데이터(chunk)를 추고 받는다. 어떤 사람이 전체 파일을 다운로드 완료했으면, 다시 그 사람도 제공자가 되어 다른 피어들에게 파일을 제공해 줄 수 있다.

tracker

트래커는 토렌트 네트워크 상에 참여하고 있는 피어들의 리스트를 가지고 있다.
어떤 사용자가 새로 네트워크에 들어오면 피어의 리스트를 새 사용자에게 준다. 사용자는 그 리스트 상에 있는 피어들에게 본인들이 가지고 있는 파일 청크 리스트를 요청할 수 있다.

rarest first

rarest first란, 어떤 청크를 요청할지 결정할 때 가장 적은 복사본을 가진 청크를 찾아서 먼저 요청하는 기술이다.

이 방법을 통해, 가장 적은 복사본을 가진 청크가 더 빠르게 재분배되며, 토런트 내 각 청크의 복사본 수를 균등하게 유지하는 것을 목표로 한다.

tit-for-tat

각각의 사용자는 청크를 보내줄 피어들을 고를 때, tit-for-tat 이라는 방법을 사용한다.

사용자는 현재 나에게 가장 많은 chunk를 보내주고 있는 4명의 피어 사용자에게 우선적으로 chunk를 보낸다.

"니가 많이 주면 나도 많이 줄게" 하는 give and take 방식이라고 이해하면 될 것 같다.

그리고 10초마다 가장 많은 chunk를 보내고 있는 피어를 재평가하여 매번 갱신한다. 나머지 피어들은 chunk를 받지 못해 choked 된 상태이다.
또한 30초마다 매 30초마다 앨리스는 무작위로 하나의 피어를 선택하고 chunk를 보내준다. 이 피어는 optimistically unchoked 되었다고 한다.


profile
베이비 게임 개발자

0개의 댓글