为 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 中,您向您的对等候选人发送一个 stun 绑定请求,然后如果您收到回复,那么您就知道了你已连接。在 TCP 中,您必须在一侧创建一个主动套接字,在另一侧创建一个被动套接字。然后从主动套接字发送syn并从被动套接字接收它,然后将syn ack发送到主动套接字。然后活动套接字发送一个ack并建立连接。

如果您在不同的网络中(在不同的 NAT 后面): 您必须使用 TCP 打洞技术来建立连接。因为如果之前没有数据包发送到 syn 来自的地址,您的 NAT 将不允许 TCP syn 数据包通过。

TCP打孔详解:

您必须使用 TCP 同时打开套接字。该套接字以主动和被动模式运行。两端都需要了解对方的隐私和 public IP:Port。 TCP 同时打开将发生如下情况:

  1. Peer A 不断向 Peer B 发送 SYN Peer B 不断向 Peer 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,连接建立。

来自 WIKI.

还要了解有关 TCP 同时打开连接的信息,请阅读 here. To learn about NAT filtering behavior see this