UDP打洞过程中,不同NAT后的内网机拿到对方外网地址端口后能否直连?
zz962 2012-01-08 09:39:42 在《UDP内网穿透讲解及代码实现》中,开始说两个内网机拿到对方外网地址后不能直连,之后又说通过服务器让一个内网机给另外一个内网机的外网地址发包就可以打洞成功,看得我很糊涂。他的解决方法不还是两个内网机连对方的外网地址么?
环境有限,暂时无法准备两个不同的NAT,故请教有过打洞成功经验的朋友,他这种说法对么,是不是漏了什么。
相关原文如下
首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么Server S收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,Client B登录Server S,NAT B给此次Session分配的端口是40000,那么Server S收到的B的地址是187.34.1.56:40000。
此时,Client A与Client B都可以与Server S通信了。如果Client A此时想直接发送信息给Client B,那么他可以从Server S那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息Client B就能收到了呢?答案是不行,因为如果这样发送信息,NAT B会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。现在我们需要的是在NAT B上打一个方向为202.187.45.3(即Client A的外网地址)的洞,那么Client A发送到187.34.1.56:40000的信息,Client B就能收到了。这个打洞命令由谁来发呢,呵呵,当然是Server S。
总结一下这个过程:如果Client A想向Client B发送信息,那么Client A发送命令给Server S,请求Server S命令Client B向Client A方向打洞。呵呵,是不是很绕口,不过没关系,想一想就很清楚了,何况还有源代码呢(侯老师说过:在源代码面前没有秘密 8)),然后Client A就可以通过Client B的外网地址与Client B通信了。