查看文章 |
昨天有朋友问关于UDP Hole Punching的一些基本概念,在这里稍微通俗解释下,所谓UDP Hole Punching就是传说中的内网穿透的打洞技术。两个拥有内网IP的计算机通过NAT连通是不能直接沟通的,必须通过一些特殊的手段,就是UPD Hole Punching,Hole Punching,也就是打洞。
在解释这个概念之前呢,先解释一下内网ip通过NAT访问外网的原理,首先内网ip的数据包会交给NAT,NAT随后修改数据包的原始ip地址,改成这个子网所对应外网的公网ip,接着呢,NAT就会在整个会话过程中维护一个“映射”。。。这个映射的存在时间不确定,如果是TCP的话就是从一个SYN包开始到FIN包结束,UDP就不确定了。。。。这个映射将将内网的端口和ip绑定到一个新分配的外网端口上,也就是说,我的内网ip是192.168.0.2通过1234端口访问58.154.193.212,同时我的WAN IP是58.154.193.54的话,那么NAT就会分配一个58.154.193.54:60000(也可以是其它端口,总之是随机分配的),将这个ip和端口绑定到我的内网ip和端口上。然后所有通过这个60000端口进来的数据都会转发到192.168.0.2的1234端口。 上面的理论是很简单的,接下来就到关键的了,如何使得两个内网的ip互相通讯呢?现在我们有Client A和Client B两个内网用户。直接通讯是不可能的,因为互相都不可能知道NAT分配的端口,那该如何是好呢?很好,我们需要添加一个中转的Server C。。有点类似目录服务器。。。。。首先Client A向Server C发送连接请求,也就是向Server C方向打个洞,Server C将记录Client A的外网ip和端口,然后通知Client B,Client B是不是这个时候就可以通过这个地址肆无忌惮的向Client A发信息了呢?答案是否定的。。。。。基于安全方面的因素,Client A的NAT一般会丢弃这样的包。。。。那该如何是好呢??????那好,我们可以让Client A往Client B的NAT方向打洞。。。具体是这样的,Server C通知Client A,告诉他Client B的外网地址和端口,然后Client A向这个地址发送一个打洞包,发送完毕后,Client B就可以通过从Server C那里拿到的地址肆无忌惮的给Client A发东西了。。。。
大概就是这个意思。。。最最通俗的语言了。看不懂我就没办法了。。。。。。以前高中的时候写过一份代码,现在估计一时半会写不出来了。。。。老了。。。。囧。。。。。。 |