1. 설계과제 목표: 다양한 네트워크 프로그래밍 기술을 이용하여 파일공유를 위한 P2P 시스템 설계및 구현


2. P2P 시스템 기능 

(1) P2P 시스템 : 관리 서버

- 피어들에 대한 정보 유지 – 현재 연결된 피어, 각 피어 별 공유파일 목록

- 피어: 리더 피어, 일반 피어

- 다운로드할 파일 찾는 (피어 ID, 현재 IP 주소) 기능

- 피어 사이 파일 교환 – 해당 파일 소유자가 다수일 경우 가장 로드가 적은 피어로부터 다운로드


(2) P2P 시스템 : 피어

- 초기 P2P 시스템 접속시 자신에 대한 정보 (자신 ID, 현재 IP주소, 보유 파일 목록 등) 등록

- 리더 피어: 공인 IP 상에 연결되어 있는 피어, 다른 피어들 사이의 교환을 중재할 수 있는 피어

- 관리서버와 주기적인 상태정보 교환을 위한 제어연결 유지

- 다중 피어들과 파일 교환 가능

- 주기적으로 자신이 현재 파일을 교환하고 있는 Peer들에 대한 정보를 서버에 보고


3. 설계 기준

- 현재 연결되어 있는 피어들과의 다중 접속을 처리할 수 있는 I/O Multiplexing 기능을 설계

  (1) 서버는 동시에 다중의 Peer 등록 및 요청을 처리할 수 있어야 함

  (2) 피어는 사용자 입력 및 서버 등록, 다른 피어들과의 정보 교환을 동시에 처리할 수 있어야 함

- 해당 파일 소유자가 다수일 경우 가장 로드가 적은 피어로부터 다운로드

- 사설 IP를 사용하는 피어들에 대한 지원: 필요할 경우 홀펀칭 기능, 홀펀칭이 불가능할 경우 리더 피어를 통한 파일 교환 기능

- 서버는 피어들 사이의 파일교환에 대한 정보를 로그 파일에 유지 : 파일ID, 파일교환 시작, 종료 시간, 송신자, 수신자, 파일 사이즈 등


=============================================================================


Java로 작성. 당일치기로 급하게 만들어봤지만 결국 홀펀칭은 구현하지 못했다.

홀펀칭 대신 Relay 시스템을 사용해 NAT내부의 Peer간 파일 전송 구현.



※ 클래스 구성도

- P2P Peer -- P2P Server


※ 소스코드 : p2p_server.zip   p2p_peer.zip


※ 보조자료 : 패킷_명령어.xlsx   발표자료.pptx

Posted by 로드펭귄