2.术语
在这一部分,我们首先总结一些中间设备(middleboxs)术语,并集中讨论对P2P应用造成障碍的两种中间设备。
防火墙
防火墙会限制内网与公网的通信,将未经授权的包丢弃。包流经防火墙时,防火墙会检测它的数据,但不修改其中的IP地址和TCP/UDP端口信息。
网络地址转换设备(Network Address Translator,NAT)
网络地址转换设备会检测通过它的包,并修改包头信息(译注:指IP地址和TCP/UDP端口信息),位于NAT之后的众多主机便能借此共享少量的(通常是一个)公网IP地址。
网络地址转换设备主要有两类:
Basic NAT
包流经Basic NAT时,Basic NAT将包中的内网IP映射为公网IP,但不修改其中的TCP/UDP端口。Basic NAT一般用在内网具有许多公网IP的时候,若有内网主机访问公网,就将它的内网IP映射为一个公网IP。
NAPT(Network Address/Port Translator)
这是最为常见的情况。NAPT不仅检测包中的数据,而且还会修改包中的IP地址与TCP/UDP端口字段,从而让众多的内网主机同时共享一个公网IP。
请参考[NAT-TRAD]和[NAT-TERM]以获得更多的NAT分类和相关术语。近来的[STUN]定义了一些其他的术语,对NAT做进一步的分类。当内网主机通过NAPT打开一个对外的TCP/UDP连接时,NAPT会给此连接指定一个公网IP和端口,然后接收外来的包,进行转换(译注:指IP地址和TCP/UDP端口信息),最后转发给内网主机。其效果就是NAPT在(内网地址,内网端口)和(外网地址,外网端口)之间建立了一个的地址绑定,这一地址绑定定义了连接有效期内NAPT应做的地址转换。这里有一个对P2P应用比较重要的问题,就是当内网主机以一个(内网地址,内网端口)同时发起多个对外的连接时,NAT如何处理。由此可以分为下面的几类:
Cone NAT
在建立了(内网地址,内网端口)和(外网地址,外网端口)之间地址绑定之后,若程序以绑定过的(内网地址,内网端口)发起对外的连接,Cone NAT会复用这一绑定,而且该绑定会一直存在,直到所有使用它的连接断开为止。
以下图为例,假设客户端A经由Cone NAT,同时发起两个对外的连接,就是图中的从内网地址(10.0.0.1:1234)到两个公网服务器,S1和S2。此时Cone NAT会将这两个连接绑定同一个外部地址,比如155.99.25.11:62000。这里是通过地址转换保证了客户端地址的同一性,即使用同一个外部地址。Basic NAT和防火墙不会修改包中的端口号,这样的中间设备可以看做是Cone NAT的退化形式。
Server S1 Server S2
18.181.0.31:1235 138.76.29.7:1235
| |
| |
+----------------------+----------------------+
|
^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^
| 18.181.0.31:1235 | | | 138.76.29.7:1235 |
v 155.99.25.11:62000 v | v 155.99.25.11:62000 v
|
Cone NAT
155.99.25.11
|
^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^
| 18.181.0.31:1235 | | | 138.76.29.7:1235 |
v 10.0.0.1:1234 v | v 10.0.0.1:1234 v
|
Client A
10.0.0.1:1234
Symmetric NAT
与上面有所不同,Symmetric NAT并不保证(内网地址,内网端口)和(外网地址,外网端口)之间地址绑定的同一性,相反地,对于一个新的连接,Symmetric NAT总会为它指定一个新的外网地址。举例来说,还是假设客户端A以相同的(内网)地址发起两个对外的连接,到S1和S2。Symmetric NAT可能为一个连接绑定外部地址155.99.25.11:62000,而为另一个绑定155.99.25.11:62001。由于来源地址(S1和S2)的不同,即使包中丢失了客户端(即内网主机)程序的标识信息,NAT还是可以区分出这两个连接,进行正确的地址转换。
Server S1 Server S2
18.181.0.31:1235 138.76.29.7:1235
| |
| |
+----------------------+----------------------+
|
^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^
| 18.181.0.31:1235 | | | 138.76.29.7:1235 |
v 155.99.25.11:62000 v | v 155.99.25.11:62001 v
|
Symmetric NAT
155.99.25.11
|
^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^
| 18.181.0.31:1235 | | | 138.76.29.7:1235 |
v 10.0.0.1:1234 v | v 10.0.0.1:1234 v
|
Client A
10.0.0.1:1234
上面讨论的有关Cone NAT和Symmetric NAT之间的异同,对TCP和UDP通信均有效。
Cone NAT按照已经建立起来的地址绑定来接收进入内网的包,依据它接收包时限制的不同,我们可以对Cone NAT做进一步的分类。这种分类只用于UDP通信,因为若没有合适的条件,NAT和防火墙会阻止进入内网的TCP连接要求,除非这些中间设备做了特殊配置。
不受限 Cone NAT(Full Cone NAT)
在建立起一个地址绑定之后,若一个外来包的目的地址是Cone NAT为内网地址绑定的那个公网地址,不受限Cone NAT就接受它,至于包的来源地址,则不在关心之列。不受限Cone NAT有时也叫混杂NAT(promiscuous NAT)。
受限Cone NAT
一个受限Cone NAT除了要查看外来包的目的地址,还要看此包的来源地址是不是内网主机所要求的那个公网IP地址(不包括端口号码),而这可以从它先前发的包中找到。防火墙的原则是拒绝接收那些不请自来的包,在这里受限Cone NAT通过限制外来包的来源地址提炼了这一原则。
端口受限Cone NAT
只有当外来包的IP地址和端口号码与内网主机所求的完全一致的时候,端口受限Cone NAT才会接收此包。端口受限Cone NAT为内网主机提供了与Symmetric NAT同等级别保护,拒绝那些不请自来的包,而后者还得另外维护端口转换的一致性。
最后,我们定义了一些新的术语,对有关P2P的中间设备进行分类。
P2P应用程序
本文中提到的P2P应用程序(译注:有时也简称为P2P应用),指那些借助一个公网注册服务器,使用各自的内网地址或公网地址(或兼而有之)建立点到点连接的程序。
P2P中间设备
允许P2P应用程序进行通信的中间设备称之为P2P中间设备。
P2P防火墙
提供了防火墙功能但不进行地址转换的中间设备称之为P2P防火墙。
P2P NAT
提供了NAT功能的P2P中间设备称之为P2P NAT,P2P NAT可能还实现了防火墙的功能。一个P2P中间设备至少要实现允许UDP通信的Cone NAT功能,通过UDP打洞技术,允许程序之间建立健壮的P2P连接。
回环转换(Loopback Translation)
当位于同一NAT之后的两台内网主机之间以各自的公网地址进行连接时,这个NAT等于是做了两次转换,先将包中来源主机的内网地址转换为公网地址,再将包中目的主机的公网地址转换为内网地址,最后将包转发给目标主机。上述的NAT转换过程称之为回环转换。