더북(TheBook)

다행히도 호스트 N은 라우터 B를 거쳐 호스트 B에 전달하기 위한 공인 IP와 포트 역시 알고 있다. 이 정보를 호스트 A에 보내면, 라우터 A의 NAT 테이블에 호스트 N이 있으므로 라우터 A는 이 패킷을 통과시킨다. 이제 호스트 A는 호스트 N이 공유해준 정보로 호스트 B에 패킷을 하나 보낸다. 이 부분이 좀 이상하게 여겨질 수 있다. 호스트 A는 게임 서버요 호스트 B는 클라이언트인데, 클라이언트가 서버에 접속하는 대신, 게임 서버가 클라이언트에 접속하다니 말이다. 게다가 라우터 B는 호스트 A를 아직 모르고 있으므로 패킷을 보내보았자 막혀버릴 것이 뻔하다. 쓸데없는 패킷을 왜 보내는 걸까. 이런 작업을 하는 이유는 바로 이 과정을 거치며 라우터 A가 테이블에 항목 하나를 만들기 때문이다.

패킷이 호스트 A를 출발해 호스트 B로 가는 동안 라우터 A를 거친다. 라우터 A의 NAT 테이블에는 이미 192.168.10.2:200 항목이 외부 포트 60000에 매핑되어 있다. 그래서 패킷을 내보낼 때 60000번 포트로 내보낸다. 그리고 그 항목에 추가로 호스트 B의 정보 12.12.6.5:62000 항목을 하나 더 매핑한다. 매핑 항목을 이렇게 추가하게 만드는 것이 이 기법의 핵심이다. 패킷은 비록 호스트 B에 도달하기 전 라우터 B에서 막혀버리지만, 이제 호스트 N이 호스트 B에게 18.19.20.21:60000으로 연결하라고 알려주어, 호스트 B가 그 주소로 패킷을 보내면 라우터 A는 B가 보낸 패킷을 순순히 통과시킨다. 앞서 호스트 B에게 보내면서 12.12.6.5:62000 항목을 기억해 둔 상태이기 때문이다. 라우터 A는 수신자를 192.168.10.2:200으로 재기입하여 호스트 A에 전달한다. 이제부터 호스트 A와 B는 중개 서버를 거치지 않고도 서로 공유한 공인 IP와 포트로 통신할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.