UDP 打洞

前言

最初知道 UDP 打洞 这几个字是在公司做一个可靠的 UDP 通信模块时听老大说的。当时也没多了解,结果没事翻自己的日志时发现自己把这几个字记在上面了,于是查了下。主要参考了如下文章:

额,首先感谢下作者。

可以说结合这两篇文章弄清楚 UDP 打洞的原理应该是没问题的。特别是《UDP穿透NAT的原理与实现》这篇文章,几乎写到了和 UDP 打洞相关的所有知识。

那我这里要写什么呢?这里主要是记录下在看《UDP穿透NAT的原理与实现》这篇文章时的产生的疑问和自己的理解。具体来讲,是关于文章中讲到的 NAPT 中 Session 的理解和相关数据结构的理解。因为在看文章那部分时真的没看懂,就索性自己思考了一下,感觉还行,基于自己的理解对 UDP 打洞的一般过程进行推理和为什么 UDP 打洞通常需要当通信双方两端的 NAT 都为Cone NAT等问题进行推理时,都挺顺畅的。

我的疑问和理解

到底什么是 Session ?

根据上面的描述我觉得 Session 的确切定义应该是指内网机器通过一个唯一的映射端口与一台或者多台外网机器通信,每一个 Session 有自己唯一的映射端口,同一时刻存在的不同 Session 的映射端口肯定是不一样的。也就是说,Session 可以由映射端口唯一标识。

那 Session 是什么时间建立起来的呢?

内网机器主动向外网机器发送数据时。

那 Session 要保存的数据有哪些呢?

映射端口,内网IP,内网端口,外网IP,肯定都是需要的,那外网端口需不需要呢?我觉得,也是需要的,举个例子,内网机器 LanA 通过 UDP 套接字 udpSocketLanA 给外网机器 WanB 的 UDP 套接字 udpSocketWanB 发送了一份数据报,LanA 的路由器属于 Symmetric NAPT 设备,如果不保存外网端口,那以后 WanB 上的其他套接字都可以直接向 LanA 的套接字发送数据了。Session 中保存这个外网端口的意义在于,虽然 LanA 和 WanB 之间建立了 Session,但是两者之间的通信只能在 LanA 主动通信的外网端口进行。如果关于这点,不确定,我们可以做一个实验。

所以我觉得一个 Session 保存的数据应该是这样的。首先对于 Symmetric NAPT 设备,一个唯一的映射端口,一个由内网IP+内网端口组成的唯一地址,一个唯一的外网IP,这个外网IP 上的一个或者多个端口。对于 Cone NAPT 设备,一个唯一的映射端口,一个由内网IP+内网端口组成的唯一地址,一个或多个的外网IP以及一个或多个端口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值