一、NAPT(以此类型讨论)
192.168.1.106 : 32054<-------->183.15.192.72 : 27786<-------->212.79.111.156 : 3478
192.168.1.106 : 32055<-------->183.15.192.72 : 27786<-------->212.79.111.155 : 3478
简而言之,两个基本规则:
Ø内部IP/PORT出NAT的规则,分Cone和Symmetic。
Cone: 只要内部IP固定,映射到外部的NAPT->PORT就固定。见上面蓝色交互。
Symmetic:任意内部IP或PORT有一项改变,映射到外部的NAPT->PORT就改变。
Ø外部IP/PORT进NAT的规则,基于Cone细分,对Symmetic无甚意义。
见下面的详述。
只要cli有send2ip的操作(不管是否能send success),ip再send2cli时,cli的NAPT就不会抛弃来自ip的数据。sen2ip可以看作是cli在自身NAPT上对ip的”登记”(是否还有更好的表述方式)。
ØFull cone
假定cli有send2ip(任意一对ip:port),所有IP都可以从此通道[session]回访。不限制外部IP/PORT。
Cli→session→nat→IP
Cli←session←nat←IP
//无需cli先连接IP_Other_x,只要知道cli的NAPT:PORT,IP_Other_x就可以直接访问了。
Cli←session←nat←IP_Other_0
Cli←session←nat←IP_Other_1
ØRestricted cone
假定cli有send2ip。限制外部IP,不限制外部IP->PORT。
Cli→session→nat→IP
Cli←session←nat←IP
//需要cli先连接IP_Other_x,IP_Other_x才可以访问。
Cli→session→nat→IP_Other
Cli←session←nat←IP_Other
ØPort restricted cone
假定cli有send2ip。限制外部IP && PORT。
对比 Restricted cone:
Cli→session→nat→IP/PORT0
Cli←session←nat←IP/PORT0仅IP/PORT0可以回访,其他IP/PORTX不可以。
ØSymmetic
同Port restricted cone。限制IP && PORT。
和cone不同的是,每次cli建立连接都使用不同的session。
Cli→session0→nat→IP/PROT0
Cli→session1→nat→IP/PROT1//同一个IP,不同PORT,也使用不同的session。
Cli→sessionx→nat→IPx/PROTx
文字概述了下,再来点图文并茂的增加点感情。
Ø直观图
srvn为公网IP(非隐藏在NAT后面)。
ØP2P流程
为了作图方便,祛除了不会影响流程的session。
以后的图都假定cli_a/b都注册到了srv,互相知道对方第一次向外的NAPT:PORT(to srv)。
UDP打洞其实就是发送数据到对方的NAPT:PROT。只是把某一特定时刻的send称之为打洞。
cli_a/b通过srv预先得知了对方第一次send2srv时的【NAPT:port】
l1<------>不限
可惜的是full cone几乎不存在。
l2/3<------>2/3
因为cli_a对cli_b的认知基于【NAPT_B:portn】(反之cli_b对cli_a也类推),而【NAPT_B:portn】在{cli_b IP已定 && 2/3} 的条件下是不会改变的,所以2/3可以放在一起讨论。就画出2<------>2的。
v1、绿色线条:a->b,也可以看作是a打了一个指向b的洞,虚线表示此时的数据会被抛弃,不会抵达b。
v2、红色线条:a请求b打洞。srv转发给b。
v3、蓝色线条:b->a打洞。因为a之前有向【NAPT_B:PROT】发送过数据(内->外),所以【NAPT_A:PORT】允许【NAPT_B:PROT】通过,b可以抵达a。
v4、绿色线条:a->b也是通了。
l2<------>4
NAPT限制较小的先向对方打洞。画简单点。
v1、绿色线条:a->b,也可以看作是a打了一个指向b的洞,虚线表示此时的数据会被抛弃,不会抵达b。
v2、蓝色线条:因为a之前有向【NAPT_B】发送过数据(内->外),所以【NAPT_A】允许【NAPT_B】通过。
va<------>【NAPT_A:PROTn】<------>【NAPT_B:PROTm】<------>b
l3<------>4
v1、绿色线条:a->b,也可以看作是a打了一个指向b的洞,虚线表示此时的数据会被抛弃,不会抵达b。
v2、蓝色线条:虽然a之前有向【NAPT_B】发送过数据(内->外),但【NAPT_A】限定port,【NAPT_B:PROTm】被拒。
v3、红色线条:如果a知道portm,send2portm后,蓝色线条就可以走通了。即a<------>b。
有的NAPT->PORT是递增的,有portm = portn + 1。
l4<------>4
不讨论,通不了。
网上摘抄的:
1.Endpoint Independent Mapping ( Full cone )
不区分终结点的映射,A 使用本地端口 P1 连接一个服务器,外网端口 P2 收到的任何数据包会转发到机器 A 上,跟直连没有什么区别,不需要打洞。
2.Address Dependent Mapping ( Restricted cone )
基于地址的映射,A 使用本地端口 P1 连接服务器 B,外网端口 P2 收到来自 B 的包转发到机器 A 上。
3.Address and Port Dependent Mapping ( Port-restricted cone )
基于地址和端口的映射,A 使用本地端口 P1 连接服务器 B,外网端口 P2 收到来自 B 特定端口的包会转发到机器 A 上,实际使用中与 2 没有太大区别。
4.Symmetric NAT
具有 IP 和 端口的限制,且会为每一个 Session 分配一个新的端口,这个端口号通常是递增的,但是也有随机的,随机的一般无解。