2013-01-31 2 views
2

TCP 구멍 펀칭에 대한 논문은 here에서 읽을 수 있습니다.TCP 구멍 펀칭은 Java 소켓을 사용하지만 Python에서는 작동하지 않습니다.

이 작업을 수행하려면 원격 호스트에 대한 TCP 연결을 만드는 데 사용되는 소켓과 로컬 호스트가 동일한 포트에 대한 연결을 수신하는 데 사용하는 소켓을 바인딩해야합니다. 나는 자바에서 이것을 할 수 있었지만 주어진 소켓에 SO_REUSEADDR 플래그가 설정되어 있어도 파이썬에서는 할 수 없었다. 누군가 나에게 설명 할 수 있을까? 파이썬은 본질적으로 단일 스레드이기 때문에 그렇습니까?

+0

자바 질문이 아니고 태그를 다시 지정하십시오. – TheWhiteRabbit

+1

귀하의 질문에 더 많은 정보가 없으면 대답하지 않는 것이 좋습니다. 일부 코드는 바람직합니다. –

+0

행성에서 TCP 홀 펀치를 성공적으로 마친 사람은 아무도 없습니다. 이것은 흥미로운 대답 컬럼이되어야합니다 –

답변

5

내가 테스트/TCP 홀 펀칭을 공부 한 것은 모든 상황에서 작동 할 수있는 실행 가능한 기술이 아닙니다. 첫째, TCP Hole Punching이하는 일은 NAT가 제대로 지원하지 못하며 그 동작은 예측할 수 없습니다.

이력서에서는 TCP SYN 패킷을 보내고 TCP SYN 패킷 (정상적인 대화에서 SYN + ACK로 응답 할 때)을 수신하여 NAT가 두 호스트 사이의 연결을 열도록합니다. 일부 NAT는이 연결을 열지 만 다른 NAT는 연결을 열지 않을 수 있습니다. 최선을 다해 알고 싶습니다. NAT Traversal은 UDP를 사용하는 것입니다. UDP는 연결 지향이 아니므로 패킷 전송을 시작하고 수신하면 NAT가 하나의 패킷을 다른 응답 양식으로 생각할 수 있습니다.

는 UDP를 통해 TCP의 구현을 사용하여 TCP로 신뢰성으로 UDP를 만들기 위해, 또한 UDP Hole Punching

를 참조하십시오.

나는 귀하의 질문에 대답 didnt는 죄송하지만, 왜 자바가 근무하고 파이썬하지 않은 이유, 심지어 가상 머신의 구현 및 시스템 전화를 걸거나 함께 할 수있는 뭔가가 알고 어렵다 UDT를 참조하십시오 사용중인 NAT

+2

제 경험상 - UDP를 사용하고 그 위에 몇 가지 신뢰성을 추가하십시오. UDP를 사용하더라도 모든 상황에서 작동하지는 않습니다 (대칭 NAT에 대해 읽음). 라우터가 포트 매핑을 관리하는 방법에 따라 다릅니다. 그것이 예측할 수 없다면 횡단 할 수 없습니다. 그러나 가능한 경우 모든 시나리오를 돌봐 주면 99 %의 라우터에서 괜찮을 것입니다. 또한 TCP over UDP를 터널링 할 수 있습니다. –

+0

감사합니다. 대칭 NAT에 대해 알지 못했습니다. 이것을 극복 할 수있는 방법이 없을까요? – fredcrs

+1

이 문서에서는 세부 사항의 가능성을 탐구합니다. http://tools.ietf.org/id/draft-takeda-symmetric-nat-traversal-00.txt –

관련 문제