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

时间:2015-08-12 00:36:40

标签: tcp nat

Linux,Windows OS的此类任务确实存在哪些软件库?

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

我有兴趣如何为我的C ++项目创建功能,如此软件中所示:https://secure.logmein.com/ru/products/hamachi/download.aspx

1 个答案:

答案 0 :(得分:5)

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

如果你想建立P2P连接,会有一些很大的差异

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

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

TCP打孔细节:

您必须使用TCP同时打开的套接字。此套接字以主动和被动模式运行。两端都需要彼此了解私有和公共IP:端口。 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并建立连接。

来自WIKI

还要了解从here读取的TCP同时打开连接。要了解NAT过滤行为,请参阅此answer