取消
显示结果 
搜索替代 
您的意思是: 
cancel
1265
查看次数
0
有帮助
0
评论
suzhouxiaoniu
Spotlight
Spotlight
假定客户端A与客户端B在不同的NAT设备后面,分属不同的内网,如图5所示。客户端A与客户端B都经由各自的NAT设备与集中服务器建立了UDP连接,客户端A与客户端B的本地端口号均为4321,集中服务器的公网端口号为1234。在向外的会话中,客户端A的外网IP被映射为155.99.25.11,外网端口为62000,客户端B的外网IP被映射为138.76.29.7,外网端口为31000。
如下所示:
客户端A——>本地IP:10.0.0.1,本地端口:4321,外网IP:155.99.25.11,外网端口:62000
客户端B——>本地IP:10.1.1.3,本地端口:4321,外网IP:138.76.29.7,外网端口:31000




142343rovxc83y0v8g0rx7.jpg
位于不同NAT设备后的UDP打洞过程
在客户端A向服务器发送的登陆消息中,包含有客户端A的内网地址二元组信息,即10.0.0.1:4321;服务器会记录下客户端A的内网地址二元组信息,同时会把自己观察到的客户端A的外网地址二元组信息记录下来,即155.99.25.11:62000。同理,服务器也会记录下客户端B的内网地址二元组信息为10.1.1.3:4321和由服务器观察到的客户端B的外网地址二元组信息,138.76.29.7:31000。无论A与B二者中的任何一方向服务器发送P2P连接请求,服务器都会将其记录下来的上述的外网和内网地址二元组发送给A或B。
A、B分属不同的内网,它们彼此的内网地址在外网中是没有路由的,所以发往各自内网地址的UDP数据包会发送到错误的主机或者根本不存在的主机上。现在假定A的第一个消息将发往B的外网地址,如图5所示。该消息途经A的NAT设备,并在该设备上生成一个会话表项,该会话的源地址二元组信息是{10.0.0.1:4321},该地址二元组信息和客户端A与服务器建立连接的时候NAT生成的源地址二元组信息一样,但它的目的地址不同。如果A的NAT设备给出的响应是OK的,那么A的NAT设备将保留A的内网地址二元组信息,并且所有来自A的源地址二元组信息为{10.0.0.1:4321}的数据包都沿用A与集中服务器事先建立起来的会话,外网地址二元组信息均为{155.99.25.11:62000}。
A向B的外网地址发送消息的过程就是“打洞”的过程,从A的内网的角度来看应为从{10.0.0.1:4321}发往{138.76.29.7:31000},从A在其NAT设备上建立的会话来看,是从{155.99.25.11:62000}发到{138.76.29.7:31000}。
如果A发给B的外网地址二元组的消息包在B向A发送消息包之前到达B的NAT设备,B的NAT设备会认为A发过来的消息是未经授权的外网消息,会丢弃掉该数据包。B发往A的消息包与上述的过程一样,会在B的NAT设备上建立一个{10.1.1.3:4321,155.99.25.11:62000}的会话(通常也会沿用B与集中服务器连接时建立的会话,只是该会话现在不仅接受由服务器发给B的消息,还可以接受从A的NAT设备155.99.25.11:6200发来的消息),一旦A与B都向对方的NAT设备在外网上的地址二元组发送了数据包,就打开了A与B之间的“洞”,A与B向对方的外网地址发送数据,等效为向对方的客户端直接发送UDP数据包了。一旦应用程序确认已经可以通过往对方的外网地址发送数据包的方式让数据包到达NAT后面的目的应用程序,程序会自动停止继续发送用于“打洞”的数据包,转而开始真正的P2P数据传输。

入门指南

使用上面的搜索栏输入关键字、短语或问题,搜索问题的答案。

我们希望您在这里的旅程尽可能顺利,因此这里有一些链接可以帮助您快速熟悉思科社区:









快捷链接