基于Hole Punching的UDP穿越Symmetric NAT的方法(中1)

1.3.2 开通两客户端直接访问之洞
现在主机A欲与B直接进行UDP通信,A发送请求信息给Server S请求帮助连接B, S把B的全局和私有插口发送给A,也把A的全局和私有插口发送给B。A和B知道对方的插口后,就会尝试直接发送UDP报文给对方,既向全局插口发送,也向私有插口发送。私有地址不能被路由,故发送不会成功。下面讨论发向全局插口的UDP报文。
A发送的第一个UDP报文以B的全局插口[202.1.1.1:3600]为目标插口,建立了一个新的UDP会话Session A-B,在A的内网由插口对[192.168.1.1:4321, 202.1.1.1:3600]标识,在Internet上则由插口对[201.1.1.1:6200, 202.1.1.1:3600]标识。
这时B的第一个报文也发送给A的全局插口[201.1.1.1:6200],过程与上面对A的第一个报文的描述一样,也建立了一个新的UDP会话Session B-A。
如果A的第一个报文,在B的第一个报文通过B的NAT之前到达了B的NAT,而B以A作为访问目标的会话还未建立(B的NAT洞还未开出),B的NAT对不请自来的A的报文会丢弃之;这时A的NAT洞已经开出,故B的第一个报文会顺利通过A的NAT传送到A。在B的第一个报文从NAT发出后,自己的NAT洞也开好了。这样,A、B双方NAT的洞都开好了,UDP通信就能够在二者之间直接进行而不再需服务器S的参与。
2 UDP报文穿越Symmetric NAT
 
对于Symmetric NAT,Client A和B彼此按照S告知的端口访问对方的时候,自己映射的全局端口会改变,使得双方会话的源和目标全局端口都发生变化。比如这时A的插口可能变成了[201.1.1.1:6300]。新的会话A-B在外网部分是[201.1.1.1:6300,202.1.1.1:3600],而这时B按照Server S告知的原来A的插口[201.1.1.1:6200]去访问时,就会被拒绝。
2.1 准随机猜测方法与算法
解决问题的方法是让A和B都猜测对方变化后的端口(发送猜询报文),直到收到响应报文或对方的猜询报文为止。
2.1.1 端口猜中与否的判断
假设A和B相互发送报文时,NAT映射后各自的全局插口为[IPa:Pa]和[IPb:Pb]。若A发送的猜询报文目标端口变为Pb,即先猜中了B的端口,B的NAT仍会丢弃A的这个报文。但这时在A方建立了会话[IPa:Pa , IPb:Pb];在此会话的生存期内,若B也猜中了A的端口Pa,则B的猜询报文就能发送到A并收到A的响应报文,A则收到B的猜询报文。即任意一方收到猜询报文或响应报文就表明双方都已猜中对方端口。
若A 先猜中B的端口,而在该会话的生存期内B没有猜中A的,则A并不知道自己已经猜中故会继续对B发送猜询报文。
2.1.2 端口映射方式的判定
Symmetric NAT映射新的端口的方式有三种:一是在前一次映射的端口号上加1(或增加一个固定的数值T,T>1);二是在前一次映射的端口号上增加或减少,且变化的数值随机在一个小范围内生成;三是在区间 (1024,65535) 随机生成。
第一种映射方式的NAT设备最为常见,依次是第二和第三种的。
算法设计要先判断目标方NAT的映射方式,让发起访问的客户端(比如 A)向服务器 S查询最近3次注册的、相继被映射成和目标客户端(比如B)同一全局地址(比如202.1.1.1)的B方客户端的端口号,若其值递增且最后一次注册的客户端的端口号(记为P0)最大,则
【判定1】Symmetric NAT最有可能是第一种映射方式,亦有可能是第二或第三种映射方式;
如果最近一次注册的端口号不是最大,则
【判定2】Symmetric NAT一定是第二或第三种映射方式。
一种极端情况,当前B方内网主机包括B在内向S注册的映射为地址202.1.1.1的共不到3台,若只有B注册,则当成【判定1】的情形处理;若有2台注册,仍按后一次映射的端口号是否更大而判断其映射方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值