为NAT后面的客户端创建Tcp连接

Create Tcp connection for clients behind NAT

对于Linux,Windows OS,存在哪些软件库可用于此类任务?

RFC中是否存在一些信息,人们应该如何做?

我很有趣如何为该软件的此处显示的C ++项目创建功能:https://secure.logmein.com/ru/products/hamachi/download.aspx


如果要通过TURN中继服务器建立连接,则没有太大区别。唯一的区别是TCP和UDP如何创建连接,仅此而已。

如果要建立P2P连接,会有一些大的不同。

如果您在同一个网络中(在同一个NAT之后):在UDP中,您向对等候选人发送眩晕绑定请求,然后,如果您收到响应,则表明您已连接。与TCP相同,您必须在一侧创建一个主动套接字,在另一侧创建一个被动套接字。然后从主动套接字发送syn并从被动套接字接收它,然后将syn ack发送到主动套接字。然后活动套接字发送一个ack并建立连接。

如果您位于不同的网络(位于不同的NAT之后):您必须使用TCP打孔技术进行连接。因为如果以前没有任何数据包发送到该Syn来源的地址,则您的NAT将不允许TCP syn数据包通过。

TCP打孔的详细信息:

您必须使用TCP同时打开套接字。此套接字在主动和被动模式下均起作用。两端都需要彼此了解私有和公共IP:Port。
TCP同时打开将发生以下情况:

1)对等体A不断向对等体B发送SYN
对等体B不断向对等体A发送SYN

2)当NAT-a从对等方A接收到传出SYN时,它将在其状态机中创建一个映射。
当NAT-b从对等B接收到传出SYN时,它将在其状态机中创建一个映射。

3)两个SYN都沿着网络路径穿越某个地方,然后:

对等体A的SYN到达NAT-b,对等体B的SYN到达NAT-a
根据这些事件的时间安排(SYN在网络中的哪个位置),
至少一个NAT将让传入的SYN通过,并将其映射到内部目标对等方

4)接收到SYN后,对等方会发回SYN + ACK并建立连接。

来自维基。

还可以从此处阅读有关TCP同时打开连接的信息。要了解NAT过滤行为,请参阅此答案。