목차
2023학년도 2학기 충남대학교 이영석 교수님의 컴퓨터네트워크 수업 정리자료입니다.
📁 P2P
P2P란 peer to peer 프로토콜의 약자로,
p2p 구조에 대해 간략하게 보여주고 있음.
peer라는 단어 뜻은 기본적으로 동료, 상대방 이런 뜻.
전통적으로 컴네는 서버를 중심으로 클라이언트들이 접속하는 상태를 사용하지만, peer는 서버가 없는 구조를 지칭. 항상 서버가 접속 가능하다(always on) 상태를 가지고 있지만, p2p에서는 always on 상태가 없음.
그러면 서버가 없이 어떻게 통신이 가능한가?
많은 피어들이 서로 직접적으로 연결되어 통신함. 피어들은 가끔씩 연결될 수가 있음. peer라는건 우리가 사용하는 컴퓨터가 될 수 있는데, 이런 피어들은 가끔씩 접속이 되고, 접속이 안된 상태가 많음. peer들은 항상 연결된게 아니라 가끔씩 연결된 상태일 수 있다.
이런 조건에서 p2p 구조를 잘 만들기 위해서는 '파일 배포 방법'과 '파일 찾는 방법'이 중요.
p2p 방식과 클라이언트 서버 모델을 비교해보자.
p2p가 나온 배경은 클라이언트 서버 모델보다 성능을 개선시키자는 목표가 컸다.
1개의 서버가 N개의 피어에게 파일을 배포할 때 얼마나 오래 걸릴까?
위 질문에 대한 답을 클라이언트 서버 모델과 p2p 방식 각각 구해보면 장단점을 파악할 수 있다.
가정 1. 서버가 파일을 처음에 업로드할때의 bandwidth : u_s
가정 2. 피어가 파일을 업로드할때의 bandwidth : u_i
가정 3. 피어가 다운로드 받는 대역폭 : d_i
가정 4. 파일의 크기 : F
🌱 대역폭(bandwidth)이란?
대역폭이란 특정한 기능을 수행할 수 있는 주파수의 범위로, 헤르츠 단위로 측정된다. 정보이론, 무선통신, 신호처리, 분광학 등 여러 분야에서 중요한 개념이며, 한 가지로 정확하게 정의하기 힘든 개념이다.
컴퓨터 네트워크 분야 내에서는 "초당 전송될 수 있는 최대량"을 의미한다.
1. 클라이언트 서버 방식에서 파일을 배포하는 시간
서버가 N명의 클라이언트에게 F라는 파일을 전송한다고 하자.
서버가 보내는 파일의 개수만큼 대역폭을 사용해야함. 이게 뭔 개소리야?
서버가 파일을 업로드할때 사용되는 대역폭은 us이므로, F 크기를 가진 파일을 업로드 할때 드는 시간은 F/us이다.
파일이 순서대로 전송된다고 가정하면 총 전송 시간은 N * F/us가 된다.
그럼 이 파일이 도착한 곳은 어디임? ..
i번째 클라이언트가 다운받는 시간은 마찬가지로 F/di.
이때, 서버가 파일을 업로드하는 시간과 대역폭이 가장 작은 클라이언트가 파일을 다운받는 시간 중 "최댓값"을 구해야함.
서버의 파일 업로드와 클라이언트의 파일 다운로드가 "동시"에 진행되기 때문에, 둘 중 최댓값을 구하면 이 시간이 서버가 N명의 클라이언트에게 F라는 파일을 전송하는 시간이 된다.
중요한 점은, 대부분의 시간이 서버가 업로드하는 시간에 걸릴텐데, 클라이언트의 수인 N이 중요함. N은 계속 증가할 것이기 때문에 N이 굉장히 커지면 이 최댓값이 N에 좌우가 될 것. 아주 많은 클라이언트가 접속될 때 파일을 다운받는 속도, 즉 시간이 굉장히 오래 걸릴 수가 잇음.
❓ 서버의 파일 업로드부터 클라이언트의 다운로드까지의 정확한 경로가 어떻게됨?
2. p2p 방식에서 파일을 배포하는 시간
서버가 파일을 업로드하는 시간과 클라이언트가 다운받는 시간이 비슷하다.
서버가 파일을 한번만 업로드해도 되지만, 클라이언트는 클라이언트 서버 모델과 같은 시간이 걸린다.
서버가 초기에 파일을 배포하게 되면 여러 클라이언트들이 파일의 조각을 가지게 되고, 이 조각을 활용해서 상대편 peer에게 파일을 전송한다.
결국 N번의 파일을 업로드하긴 해야하기 때문에,(N명이 다운받아야하니까) 서버가 한번 업로드하는 시간과, 나머지 피어들이 업로드하는 시간 중 최댓값이 총 시간이 됨.
F/us는 서버가 한번 업로드하는 시간.
F/min(di)는 각 클라이언트가 다운받는 시간 중 가장 큰 시간.
NF/(us+sum(ui)) F파일을 N번 업로드한 시간. 서버가한번, 나머지 피어들.
마지막 수식은, 피어들이 많아질수록 N도 증가하겠지만 분모도 증가하게됨.
즉 클라이언트 서버 방식과 다르게 N의 값에 따라 linear하게 증가하지 않음.
이 과정에서 클라이언트 서버 방식과 p2p 방식의 성능에 차이가 발생한다.
위 그래프로 결과를 확인해보자.
클라이언트의 대역폭 : u
클라이언트가 파일을 다운로드 받는 평균 시간 : 1시간(상수 조건)
서버의 대역폭이 클라이언트 대역폭의 10배
위 전제조건 하에서 클라이언트의 수 N이 증가할 때 최소 파일 분배 시간이 어떻게 증가하는지를 확인할 수 있음.
클라이언트 서버 방식은 N에 의해 linear하게 증가하지만 p2p방식은 그렇지 않다. N의 수가 아주 적을때는 두 방식의 성능이 크게 차이나지 않지만, N이 커질수록 p2p방식의 파일분배시간이 훨씬 적게 걸리는 것을 볼 수 있다.
즉 p2p 방식이 클라이언트 서버보다 성능이 뛰어날 수 있다.
📁 BitTorrent
실제 p2p가 어떻게 구현되어있는가를 BitTorrent 사례로 확인해보자.
BitTorrent는 파일을 배포하는 어플리케이션이며, private한 자체 프로토콜을 가지고있다.
모든 피어들이 파일을 전송하고 다운받는 p2p 방식이 기반.
중요한것은, p2p 구조를 관리해야하는 과정이 실제 구현시에 필요한데, peer list를 관리해야함.
즉 어떤 피어가 피어투피어 연결에 접속중인지를 알고있어야 어떤 피어가 어떤 파일의 조각을 가지고있으니 연결할 수 있음을 공유할 수 있음.
이를 관리하는 서버가 필요하고, 이게 tracker.
torrent란 피어들의 그룹을 지칭함. 파일의 조각들을 공유해서 교환할 수 있는 피어들의 그룹.
내가 원하는 파일들을 가지고 있는 피어들의 그룹.
BitTorrent의 가장 대표적인 버전은 다음과 같은 특징이 있다.
1. 파일을 하나의 큰 덩어리로 전송하는 것이 아니라 아주 작은 조각(256KB chunks)로 분할하여 피어들끼리 통신하여 주고받는다.
2. 다운받으면서 업로드를 동시에 하는 방식으로 모든 피어들이 서로 참여하여 기여하게끔 한다.
3. 피어들은 참여/탈퇴를 자유롭게 할 수 있다. 파일을 다운받기만 하고 컴퓨터를 꺼도 기본적으로 접속해서 일부 조각을 받게되면 받자마자 공유하게끔 한다.
Chunk라는 단위로 송수신.
가장 작은 조각을 이용해서 다른 chunk를 송수신
chunk 자체의 list도 관리를 해야함. 어느 chunk부터 받아야하는지. 대부분은 조각 중에 자주 연결돼서 받을수없는 청크부터 수신하게끔 한다.
피어들은 참여/탈퇴가 자유로우므로 피어가 갑자기 없어질 수 있음. 그래서 피어는 청크를 하나가 아닌 4개의 이웃에게 전송하도록 함.
주기적으로 30초마다 다른 피어를 선택해서 청크를 전송하게끔 함.
📁 Distributed Hash Table(DHT)
내가 다운로드받고 싶은 파일이 어느 피어들에 저장되어있는지를 찾아야함.
서버 클라이언트에서는 간단하다. 서버가 다 가지고있기 때문에 클라이언트는 요청만 하면 됨.
p2p에서는 피어들에게 흩어져있기 때문에 동적으로 움직인느 분산 데이터 베이스임. 그 데이터베이스에서 파일을 찾아야하기 때문에 Hash Table을 이용한다. 이때 DHT라는것은 이 해쉬테이블을 분산화한것.
DHT는 (key, value) 쌍으로 이루어져있다.
key : 내용
value : 피어의 IP 주소.
파일을 요청하게 되면 어떤 피어가 가지고 있는지 IP주소를 받을 수 있는 것.
피어들은 DB의 key로 질의하고, DB는 key에 매칭되는 값을 반환한다.
새로 생성된 피어는 (key, value)를 DB에 삽입할 수 있다. 이런 방식으로 DB가 유지됨.
📁 DHT Identifiers
피어들을 찾아야한다.
일반적으로 n비트를 이용한 정수 식별자로 피어들의 id를 부여하여 피어를 구분한다.
정수 키값을 얻기 위해서는 원래 key값에 대해 해슁을 한다.
위에서 (key, value) 쌍의 key는 내용을 나타낸다고 했는데, 이때 내용이 "hello World"라고 가정하자.
그럼 정수 키값은 h("hello World")와 같이 "hello Wolrd"라는 컨텐츠에 해슁을 한 값이 된다.
key 값을 이용해서 피어를 연결시켜야한다. 어떤 피어가 이웃 피어이고, 이웃 피어가 어떤 값을 가지고 있는지 알고 찾아야하므로 서로 연결되어야한다.
이때 연결되는 구조가 링이나 매쉬구조 등 여러가지를 활용할 수 있는데,
그 중 하나의 방법은 key값을 가까운 ID를 가진 피어(인접한 이웃 피어, the immediate successor of the key)에게 할당하는 방법이다.
n = 4이고, peer가 1, 3, 4, 5, 8, 10, 12, 14 이렇게 증가하는 패턴으로 연결했다고 하자.
이때 현재 피어와 다음 피어를 어떻게 찾을까?
원형으로 분산된 해쉬테이블을 찾게 하는 피어들의 인접 노트 연결 구조.
원형으로 노드가 연결되어있음.
어떤 파일을 요청받았는데, 내가 가지고있으면 리턴해주고, 그 다음 노드를 방문하는 방식. 파일 하나를 찾기 위해서는 모든 피어에 방문해봐야하므로 위와 같은 원형의 형태를 따라 방문할 수 있음.
이 네트워크가 물리적인 네트워크가 아닌 응용적인 네트워크로 오버레이 네트워크라고 부름.
피어들은 이런 오버레이 네트워크 상에서 원형으로 연결되어있고, 그중 가장 대표적인 예제가 이와같은 circular DHT라는 구조로 연결되어잇는 것.
위 구조는 circular DHT에서 피어가 바이너리 형태로 표현되어있다.
1110 key값을 가진 피어를 찾고자 할때, 위 DHT에서는 1110과 가장 가까운 1111이 응답을 하게 된다. 그러면 처음에 요청했던 0011로 리턴한다.
N명의 피어가 있을 때 어떤 파일을 요청하면 circular DHT 구조를 활용하면 N명을 모두 방문해야하기때문에 N번의 메세지가 필요하다. 즉, 시간복잡도가 O(N)이 된다.
위와 같은 구조를 빠르게 하기 위해 피어마다 지름길(shortcut)을 연결할 수 있다.
각 노드가 두개정도의 지름길을 이용하여 연결되면 더 빠르게 구조를 탐색할 수 있다.
그러면 시간복잡도가 O(logN)까지 줄어든다.
🌱 Skype
p2p 구조를 이용한 voice over IP 통신 어플리케이션.
tracker가 여기서는 supernode라는 이름으로 존재하며, 여러 클라이언트를 모아서 접속하게끔 해준다.
📁 정리
p2p 방식은 클라이언트서버 모델보다 성능이 뛰어난 장점이 있지만, 피어들이 언제나 생성/탈퇴할 수 있기 때문에 우리가 원하는 파일을 찾기가 어렵고 circular DHT 구조를 항상 유지하기가 어려워 관리하는 것이 어렵다는 단점이 있음. 파일찾기도 어려움.
클라이언트 서버는 안정적인 방법이지만 성능면에서 단점이 있다.