2014-03-28 2 views
4

내가 필요한 것은 X 포트 (로컬 컴퓨터)에서 수신하는 UDP 서버를 열고 machine(public IP)UDP 패킷을 보낼 수 있습니다. 내 컴퓨터에는 public IP이 없습니다. 기본적으로 stun이 필요합니다.stun 서버에 대한 혼란

stuntman 서버/클라이언트 프로젝트를 테스트하고 있습니다. 서버 (공개 IP)에서 스턴트맨 서버를 실행합니다. 내 시스템에서 클라이언트를 실행하십시오 (로컬 IP). 나는 9999 포트에 대해 매핑 된 ip/port를 요청했습니다.

./stunclient --mode full --protocol udp --localport 9999 stun.server.ip 

대기 서버가 IP 및 포트를 반환합니다. 그런 다음 로컬 시스템에서 UDP 서버 (java 사용)를 열어 9999 포트에서 수신을 시작하고 other machine (which has public IP)에서 mapped IP/port으로 메시지를 보내십시오. 그러나 나는 어떤 자료도받을 수 없다. 내 서버/클라이언트 코드 (java로 작성)가 로컬 네트워크에서 정상적으로 작동한다고 가정 할 수 있습니다.

흐름 :

My machine ->>>>>stun request for 9999 port and my ip ------> stun server 
My machine <<<<<<<<<<<<<<<<<<mapped ip/port <<<<<<<<<<<<<<< stun server 
My machine : Run JAVA udp server socket in 9999 port 

My machine <<<<<<<<<<<<<<<<<<<UDP message to mapped ip/port<<<<<< other public machine 
      xxxxxxxxxxxxxxxxxxxNot workingxxxxxxxxxxxxxxxxxxxxxxxx 

답변

7

당신은 당신의 stunclient 실행의 결과를 발표하지 않았지만, 나는 그것이 다음과 같이보고 상상 : 내가 추측거야

$ stunclient --mode full --localport 9999 stun.stunprotocol.org 
Binding test: success 
Local address: 192.168.1.8:9999 
Mapped address: 1.2.3.4:9999 
Behavior test: success 
Nat behavior: Endpoint Independent Mapping 
Filtering test: success 
Nat filtering: Address and Port Dependent Filtering 

당신의 Behavior Test는 "Endpoint Independent"이고 Filtering 테스트는 "Address and Port Dependent"였습니다. 가정에서 가장 많이 사용되는 것으로서 위에서 설명한 것과 대부분 일치합니다. (일명 "포트 제한 NAT").

어쨌든 이것은 자신과 STUN 서버 간의 포트 매핑을 만들었 음을 의미합니다. 위 예에서 공개 IP 주소는 1.2.3.4입니다. 그리고 항상 그런 것은 아니지만 일반적인 경우, 내 로컬 포트 ​​(9999)는 공용 포트와 동일합니다.

------------------------------------------------------------------------------------ 
||  LOCAL IP | LOCAL PORT || EXT PORT || REMOTE IP  | REMOTE PORT || 
||================================================================================|| 
|| 192.168.1.8 | 9999  || 9999  || 107.23.150.92 | 3478  || 
------------------------------------------------------------------------------------ 

당신은 스턴 서버 (107.23.150.92)에 포트 9999에서 패킷을 전송하기 때문에, NAT는 포트 매핑 항목을 만듭니다 :

는 내부적으로, 당신의 NAT는 기능은 다음과 같이 논리적 테이블을 유지 몇 분 동안 테이블에 있습니다. 패킷이 인터넷에서 NAT/라우터에 도착하면 테이블을 참조합니다. 응답이 STUN 서버의 IP : 포트에서 돌아 왔을 때 NAT는 위 표의 "원격"필드를 기반으로 NAT 뒤의 컴퓨터로 전달할 수있었습니다.

그러나 데이터를 수신하기를 원하는 "다른 공용 컴퓨터"와 포트 매핑이 없습니다. 다른 컴퓨터의 IP 주소가 2.4.6.8이고 로컬 포트 ​​8888에서 전송하려고한다고 가정합니다. NAT는 여전히 2.4.6.8:8888의 트래픽을 뒤에있는 호스트에 매핑하는 테이블에는 아무것도 없습니다 NAT. 따라서 트래픽이 테이블에없는 호스트로부터 NAT에 도달하면 NAT는 패킷을 바닥에 떨어 뜨리는 것을 알고 있습니다. NAT 분류가 "Cone NAT"로 알려져 있는데, 이것이 작동 할 수는 있지만 일반적이지는 않습니다.

경우에 따라 쉽게 해결할 수 있습니다. STUN 서버에서 포트 매핑을 얻은 후에는 데이터를 수신하려는 원격 호스트 (및 원격 포트)에 동일한 로컬 포트 ​​(9999)에서 다른 데이터 그램을 보냅니다. 원격 호스트는 단순히이 데이터 그램을 무시할 수 있지만, 효과적으로 2.4.6로 NAT

------------------------------------------------------------------------------------ 
||  LOCAL IP | LOCAL PORT || EXT PORT || REMOTE IP  | REMOTE PORT || 
||================================================================================|| 
|| 192.168.1.8 | 9999  || 9999  || 107.23.150.92 | 3478  || 
|| 192.168.1.8 | 9999  || 9999  || 2.4.6.8   | 8888  || 
------------------------------------------------------------------------------------ 

그 단순한 1 바이트의 데이터 패킷에 다른 포트 매핑 항목을 만듭니다.8 : 8888은 NAT가 NAT 뒤에있는 호스트로 해당 주소에서 다시 트래픽을 전달할 수 있도록합니다. 자신의 포트 매핑을 발견

My machine:9999 ---->[STUN BINDING REQUEST]--->stun server:3478 

My machine:9999 <----[STUN BINDING RESPONSE mapped IP:port]<--- stun server:3478 

My machine:9999 [Open socket on port 9999] 

My machine:9999 ---->[1 byte datagram] -------> 'other:8888' 

My machine:9999 <---- [UDP to public IP:port obtained in step 2]<----'other:8888' 

는 일반적으로 정상적인 P2P 흐름, 두 엔드 포인트는 STUN 서버에서 작동 : 자신의 네트워크 흐름 명칭을 사용하여 즉

. 그리고 다른 서비스를 사용하여 서로 IP : 포트 정보를 교환하십시오. 설명하는대로 프로그램간에 이러한 값을 수동으로 교환하므로 테스트해도 좋습니다.

다른 컴퓨터가 공용 인터넷에 연결되어 있으면 기술적으로 STUN이 필요하지 않습니다. NAT 뒤에있는 첫 번째 컴퓨터는 원격 IP 및 포트로 직접 보내 "데이터를 보내주십시오"라고 말할 수 있습니다. 원격 쪽에서는이 메시지의 피어 주소와 포트를 검사하여 다시 보낼 곳을 결정합니다. 포트 매핑이 이미 생성되었습니다. 일부 RTSP 클라이언트는 서버가 공개되어 있다고 가정합니다.

소켓 NAT 통과의 기본 답변은 here입니다.

나는 STUNTMAN의 개발자에 대해 알고 있습니다. 그는 합리적으로 좋은 사람이고, 잘 생기고, 똑똑합니다. 그들은 또한 그와 나는 비슷하게 보이고 우리의 이름과 거의 같은 철자법을 사용한다고 말한다. STUN과 NAT traversal에 관해 궁금한 점이 있으면 언제든지 직접 메일을 보낼 수 있습니다.