7. 1. 중계 서버를 두고 peer 들 중 누가 NAT 아래 있는지 확인한다.
중계 Server
Peer Peer
이 경우는 Public IP 를 아는 쪽으로 직접
연결한다.
8. 2. 모두 NAT 아래에 있는 경우 – 중계 서버가 알고 있는 EndPoint 로
UDP 통신을 한다.
중계 Server
Peer Peer
UDP 통신을 한다.
9. UDP 는 순서 보장도 안되고 유실도 될 수 있기 때문에
Reliable UDP 를 소프트웨어적으로 구현해야 한다. (약간 삽질)
더 큰 문제는 이마저도 안되는 악질 NAT 들이 있다.
10. 3. 이도 저도 안되면 중계 서버가 Relay 한다.
중계 Server
Peer Peer
Relay
11. UPnP 를 이용하면 External IP 와 Port 를 알 수 있다더라..
HOW?
12. UPnP (Universal Plug and Play)
컴퓨터에 USB 드라이브를 꽂으면 자동으로 인식 되듯이
네트워크 상에 Device 를 연결하면 자동으로 인식 되도록 하자.
Configuration 이 필요 없이 연결 즉시 사용 가능하고,
Device 간 연결이 용이하도록 하자.
스마트홈의 기본 기술로 사용하는 거 같음.
18. 그럼 이걸로 어떻게 External IP 를 알아오는가?
UPnP Device 중 IGD (Internet Gateway Device)
Type 이 있는데, IGD 들은
GetExternalIPAddress Action 을 가지고 있다.
19. 그 뿐만 아니라
Learn the public (external) IP address
Requesting for a new public IP address
Enumerate existing port mappings
Add and remove port mappings
Assign lease times to mappings
과 같은 강력한 기능을 가지고 있다.
20. 그래서 ARP HOOKING 처럼 패킷을 후킹할 수 있는
HACKING 도구로 사용될 수 있다.
여기까지가 이론 공부.. 실제로 IGD 를 이용하여 P2P 를 만들자
22. 그래도 집 셋탑박스가 UPnP Device 로
Discovery 되어서 해당 셋탑박스가 제공하는
Get, SetVolumn Action 을 사용하는 프로그램을 만들어 봄.
23. 1. Discovery
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
ST:upnp:rootdevice
MAN:"ssdp:discover“
MX:3
ASCII 형태의 위 전문을
UDP Port 239.255.255.250:1900
BroadCast 포트로 전송한다.
24. http/1.1 200 ok
cache-control: max-age=1810
date: tue, 12 jan 2016 16:27:39 gmt
ext:
location:
http://192.168.219.21:38400/description.xml
server: android/2.2 upnp/1.0 smartict/1.0
st: upnp:rootdevice
usn: uuid:fe28fde0-8522-bcb4-b767-
d7beb5b1f1ef::upnp:rootdevice
x-type: stb
그러면 아래와 같이 Device 정보가 담긴 응답이 온다.