2016-11-11 2 views
0

중간 서버없이 TCP 또는 UDP를 통해 진정한 P2P 통신을 설정하는 방법이 있습니까? 두 대의 컴퓨터가 공인 IP 주소만을 가지고 있지만 NAT 라우터 나 사설망 뒤에 있다면 까다 롭습니다. 사실 더 자세히 살펴볼수록 더 많은 것 같습니다. 평범한 것은 불가능하다. 나는 STUN, TURN 및 ICE 프로토콜과 구멍 펀칭을 발견했다. 그러나 나는 그들이 적어도 연결을 설정하기 위해 일종의 서버를 필요로한다는 것을 이해한다. 나는 겉으로보기에는 너무 단순하기 때문에 무언가가 놀랍다. 나는 무엇인가 놓치고 있는가? 이상적으로 나는 Golang을 사용하여 솔루션을 찾고 있는데, C++의 도움이나 예제도 유용 할 것입니다. 감사합니다.P2P TCP/UDP 연결 설정 (NAT 통과)

+0

'라우터 뒤에있는 경우'주요 문제는 NAT에 있으며 이는 결국 IPv4에 주소가 없기 때문입니다. NAT가 없다면 간단 할 것입니다. 세 번째 호스트가 없으면이 작업을 수행 할 수 없습니다 (IPv4의 경우). 한쪽 끝에서 연결을 시작해야하며 다른 라우터는 뒤에 어떤 호스트가 대상인지 알 길이 없습니다. – deviantfan

+0

[libp2p] (https://github.com/libp2p/go-libp2p)를 보았습니까? –

+0

@ChristopherWaldon 흥미롭게 보이지만 여전히 WIP이며 ICE가 제공하지 않는 것, 즉 다른 연결 유형을 사용할 수없는 경우에도 여전히 서버 릴레이에 빠져 있습니다. 그래도 고마워. – ChrysmPsy

답변

1

이것은 엄격한 Go 질문이 아닙니다. 일반적인 네트워킹 질문입니다.

이렇게 어려운 이유는 인터넷이 NAT를 지원하도록 설계되지 않았기 때문에 NAT가 방금 발생했으며 많은 기능을 무력화했기 때문입니다. 문제의 깨끗한 해결책은 NAT가없는 IPv6로 전환하는 것이지만 가능하지 않을 수도 있습니다.

NAT 상자가 NAT-PMP 또는 uPNP를 지원하는 경우이를 사용할 수 있습니다. 가장 간단한 방법은 libminiupnpc에 대한 cgo 바인딩을 만들거나 네이티브 Go 라이브러리를 위해 낚시를 갈 수 있습니다.

NAT가 이러한 프로토콜 중 하나를 지원하지 않는다면 구멍 펀칭은 깨지기 쉽고 구현하기 어려운 기술 일 수 있으므로 운이 좋지는 않을 것입니다.