爱收集资源网

NAT下的数据包究竟发生了什么?

网络 2023-06-29 04:03

有一个私有网路10.*.*.*,ClientA是其中的一台计算机,这个网路的网段(一个NAT设备)的内网IP是155.99.25.11(应当还有一个外网的IP地址,例如10.0.0.10)。假如ClientA中的某个进程(这个进程创建了一个UDPSocket,这个Socket绑定1234端口)想访问内网主机18.181.0.31的1235端口,这么当数据包通过NAT时会发生哪些事情呢?

首先NAT会改变这个数据包的原IP地址,改为155.99.25.11。接着NAT会为这个传输创建一个Session(Session是一个具象的概念,若果是TCP,其实Session是由一个SYN包开始,以一个FIN包结束。而UDP呢,以这个IP的这个端口的第一个UDP开始,结束呢,呵呵,其实是几分钟,其实是几小时,这要看具体的实现了)但是给这个Session分配一个端口,例如62000,之后改变这个数据包的源端口为62000。所以原本是(10.0.0.1:1234->18.181.0.31:1235)的数据包到了互联网上变为了(155.99.25.11:62000->18.181.0.31:1235)。

一旦NAT创建了一个Session后,NAT会记住62000端口对应的是10.0.0.1的1234端口,之后从18.181.0.31发送到62000端口的数据会被NAT手动的转发到10.0.0.1上。(注意:这儿是说18.181.0.31发送到62000端口的数据会被转发,其他的IP发送到这个端口的数据将被NAT抛弃)这样ClientA就与ServerS1构建以了一个联接。

呵呵,里面的基础知识可能好多人都晓得了,这么下边是关键的部份了。

瞧瞧下边的情况:

ServerS1ServerS2

18.181.0.31:1235138.76.29.7:1235

||

c 获取本机外网ip_获取外网ip接口_获取本机外网ip地址

||

+----------------------+----------------------+

|

^Session1(A-S1)^|^Session2(A-S2)^

|18.181.0.31:1235|||138.76.29.7:1235|

v155.99.25.11:62000v|v155.99.25.11:62000v

获取外网ip接口_c 获取本机外网ip_获取本机外网ip地址

|

ConeNAT

155.99.25.11

|

^Session1(A-S1)^|^Session2(A-S2)^

|18.181.0.31:1235|||138.76.29.7:1235|

c 获取本机外网ip_获取外网ip接口_获取本机外网ip地址

v10.0.0.1:1234v|v10.0.0.1:1234v

|

ClientA

10.0.0.1:1234

接里面的事例,假如ClientA的原先那种Socket(绑定了1234端口的那种UDPSocket)又接着向另外一个ServerS2发送了一个UDP包,这么这个UDP包在通过NAT时会如何样呢?

这时可能会有两种情况发生,一种是NAT再度创建一个Session,而且再度为这个Session分配一个端标语(例如:62001)。另外一种是NAT再度创建一个Session,而且不会新分配一个端标语,而是用原先分配的端标语62000。前一种NAT称作SymmetricNAT,后一种称作ConeNAT。我们期望我们的NAT是第二种,呵呵,假如你的NAT正好是第一种,这么很可能会有好多P2P软件失灵。(可以万幸的是,如今绝大多数的NAT属于前者,即ConeNAT)

好了,我们看见,通过NAT,子网内的计算机向外联结是很容易的(NAT相当于透明的,子网内的和内网的计算机不用晓得NAT的情况)。

而且假如外部的计算机想访问子网内的计算机就比较困难了(而这正是P2P所须要的)。

这么我们假如想从外部发送一个数据报给外网的计算机有哪些办法呢?首先,我们必须在外网的NAT上打上一个“洞”(也就是上面我们说的在NAT上构建一个Session),这个洞不能由外部来打,只能由外网内的主机来打。并且这个洞是有方向的,例如从内部某台主机(例如:192.168.0.10)向外部的某个IP(例如:219.237.60.1)发送一个UDP包,这么就在这个外网的NAT设备上打了一个方向为219.237.60.1的“洞”,(这就是称为UDPHolePunching的技术)之后219.237.60.1就可以通过这个洞与外网的192.168.0.10联系了。(然而其他的IP不能借助这个洞)。

呵呵,如今该轮到我们的题外话P2P了。有了前面的理论,实现两个外网的主机通信就差最后一步了:那就是鸡生蛋还是蛋生鸡的问题了,两侧都难以主动发出联接恳求,谁也不晓得谁的网段地址,那我们怎么来打这个洞呢?我们须要一个中间人来联系这两个外网主机。

如今我们来瞧瞧一个P2P软件的流程,以右图为例:

ServerS(219.237.60.1)

|

|

+----------------------+----------------------+

||

NATA(内网IP:202.187.45.3)NATB(内网IP:187.34.1.56)

|(外网IP:192.168.0.1)|(外网IP:192.168.0.1)

||

ClientA(192.168.0.20:4000)ClientB(192.168.0.10:40000)

c 获取本机外网ip
相关文章