Tan Kim

P2P (Peer-to-Peer)

P2P는 중앙 서버 없이 참여 노드(피어)들이 직접 서로 연결하여 자원을 공유하는 네트워크 구조다.

Client-Server vs P2P

항목 Client-Server P2P
구조 중앙 서버 의존 피어 간 직접 연결
확장성 서버 증설 필요 참여자 증가 = 용량 증가
단일 장애점 있음 없음 (분산)
관리 용이 복잡
사례 웹 서비스, API BitTorrent, 블록체인

P2P 네트워크 유형

순수 P2P (Unstructured)

  • 모든 노드가 대등한 역할
  • 자원 탐색이 비효율적 (브로드캐스트 방식)
  • 예: 초기 Gnutella

하이브리드 P2P

  • 중앙 서버가 피어 목록·메타데이터만 관리
  • 실제 데이터는 피어 간 직접 전송
  • 예: 초기 Napster, BitTorrent(트래커 방식)

구조화 P2P (Structured)

  • DHT(분산 해시 테이블)로 자원 위치를 체계적으로 관리
  • 탐색 효율 O(log N)
  • 예: BitTorrent(트래커리스), Kademlia, IPFS

NAT 통과 (NAT Traversal)

대부분의 기기는 NAT 뒤에 있어 직접 연결이 어렵다. 여러 기법으로 이를 극복한다.

STUN (Session Traversal Utilities for NAT)

  • 공개 STUN 서버에 요청해 자신의 공개 IP와 포트를 파악
  • Full Cone NAT, Restricted NAT 환경에서 유효
기기 A                STUN 서버          기기 B
  │── 내 공개 IP는? ──▶│                   │
  │◀── 1.2.3.4:5000 ──│                   │
  │                    │ ◀── 내 공개 IP는? │
  │                    │ ──▶ 5.6.7.8:6000 │
  │────────── 직접 연결 시도 ──────────────▶│

UDP 홀 펀칭 (UDP Hole Punching)

  • 양측이 동시에 상대방에게 패킷 전송 → NAT 테이블에 허용 항목 생성
  • Symmetric NAT에서는 동작하지 않음
기기 A (NAT 뒤)              기기 B (NAT 뒤)
  │── 패킷 전송 (B 방향) ────▶│  (NAT가 A 측 구멍 뚫음)
  │◀── 패킷 전송 (A 방향) ────│  (NAT가 B 측 구멍 뚫음)
  │═══════════ P2P 연결 ═══════════│

TURN (Traversal Using Relays around NAT)

  • 직접 연결 불가 시 릴레이 서버를 경유
  • 항상 동작하지만 서버 대역폭 소모
  • 예: Tailscale의 DERP, WebRTC의 TURN 서버

ICE (Interactive Connectivity Establishment)

  • STUN + TURN을 조합하여 최적 연결 경로를 자동 선택하는 프레임워크
  • WebRTC가 ICE를 사용
ICE 후보 수집:
  1. Host 후보: 로컬 IP (192.168.x.x)
  2. Srflx 후보: STUN으로 파악한 공개 IP
  3. Relay 후보: TURN 서버 IP

→ 우선순위 순으로 연결 시도, 성공한 것으로 확정

DHT (Distributed Hash Table)

분산 환경에서 키-값 쌍을 저장·조회하는 구조. 중앙 서버 없이 피어들이 데이터 위치를 관리한다.

Kademlia (BitTorrent에서 사용)

  • 노드 ID와 콘텐츠 해시를 XOR 거리로 비교
  • O(log N) 홉으로 원하는 피어 탐색
  • 각 노드는 자신과 가까운 노드들만 알면 됨
탐색 예시 (목표: 콘텐츠 해시 0x1A2B)
내 노드(0x1000) → 가장 가까운 노드에 질의 → 더 가까운 노드 발견 → ... → 목표 도달

주요 활용 사례

BitTorrent

  • 파일을 청크 단위로 분산 저장·공유
  • 보유 청크가 많을수록 더 많이 업로드 (tit-for-tat)
  • Magnet 링크: 트래커 없이 DHT로 피어 탐색

WebRTC

  • 브라우저 간 실시간 오디오/비디오/데이터 P2P 전송
  • ICE(STUN+TURN)로 NAT 통과, DTLS+SRTP로 암호화
브라우저 A          시그널링 서버        브라우저 B
  │── SDP Offer ───────▶│──────────────▶│
  │◀──────────────── SDP Answer ────────│
  │── ICE 후보 교환 ─────▶│──────────────▶│
  │◀──────────────── ICE 후보 교환 ──────│
  │══════════════ P2P 연결 (미디어 전송) ══│

블록체인

  • 트랜잭션과 블록을 피어 간 브로드캐스트로 전파
  • 51% 이상 합의로 정합성 유지
  • 예: Bitcoin, Ethereum

IPFS (InterPlanetary File System)

  • 콘텐츠 주소 지정: URL 대신 파일 해시로 접근
  • DHT로 파일 위치 탐색, P2P로 전송
  • 동일 파일은 네트워크 어디서든 같은 해시

P2P 보안 고려사항

위협 설명 대응
Sybil 공격 가짜 노드 대량 생성으로 네트워크 장악 작업증명, 신뢰 점수
Eclipse 공격 특정 노드의 모든 연결을 악의적 노드로 채움 랜덤 피어 선택
중간자(MITM) 릴레이 경유 시 패킷 변조 E2E 암호화
익명성 침해 IP 노출로 실제 사용자 추적 Tor, I2P 등 익명 레이어

메모

이 글에 대해 물어보기