如果两个Client不是公网上,要实现p2p通信必须进行nat打洞,这是因为nat会将局域网内主机的ip映射到公网上。
1.nat的分类
NAT共分为两大类:Cone NAT和Symmetric NAT。Cone NAT指的是只要源IP端口不变,无论发往的目的IP是否相同,在NAT上都映射为同一个端口,形象的看来就像锥子一样,而Symmetric NAT对于发往不同目的IP的会话在NAT上将映射为不同的端口,也就是不同的会话。 其中Cone NAT又可细分为3类,分别是FullCone型、RestrictedCone型和Restricted PortCone。限制的严格程度和对局域网内主机的保护由松到紧依次为:Full Cone、Restricted Cone、Restricted Port Cone、SymmetricNAT。
这里“限制”指的是NAT对由外到内的数据包进行审查、过滤,看看数据包的源地址和他发送到的“洞”是否有关系,如果没有那么就将其丢弃。
“由松到紧”指后者不仅继承了前者在限制上的特性,而且自己还添油加醋的干了些坏事,以至于对“由外到内”的数据包比前者有着更严格的限制。例如Restricted Cone限制了外部进入内部的IP,使得只有被打洞IP发出的数据包才允许进入NAT,而RestrictedPort Cone不但限制了IP,还限制了端口,使得只有被打洞的IP:PORT才能往这个洞里发送数据,其他任何来自不同于被打洞地址(IP:PORT)的数据包都不能使用这个洞将数据发送到NAT之后。
2.NAT对Session的映射
这里列出NAT对于内网地址映射到外网地址的一些普遍规律,可将其分为4种情况,以下的Session即为通信双方的链接,具体表现为在NAT上映射的外网IP:PORT。
A.源IP不同,忽略其他因素,将映射为不同的Session
B.源IP相同,源端口不同,将映射为不同的Session
C.源IP相同,源端口相同,目的IP相同,目的端口不同,将映射为相同的Session
D.源IP相同,源端口相同,目的IP不同,忽略目的端口,对于不同的NAT可分为不同的情况
a)ConeNAT:将映射为相同的Session
b)SymmetricNAT:将映射为不同的Session
以下对四种NAT类型分别予以说明:
(一)全锥形NAT(FullCone):IP、端口都不受限。只要客户端由内到外打通一个洞之后(NatIP:NatPort ->A:P1),其他IP的主机(B)或端口(A:P2)都可以使用这个洞发送数据到客户端。映射关系为:Client->NatIP:NatPort->Any,即任何外部主机都可通过NatIP:NatPort发送数据到Clietn上。
(二)受限锥形NAT(Restricted Cone):
IP受限,端口不受限。当客户端由内到外打通一个洞之后(NatIP:NatPort ->A:P1),A机器可以使用他的其他端口(P2)主动连接客户端,但B机器则不被允许。映射关系为:Client->NatIP:NatPort->A,即只有来自A的数据包才能通过NatIP:NatPort发送到Client上。
(三)端口受限锥型(Restricted PortCone):IP、端口都受限。返回的数据只接受曾经打洞成功的对象(A:P1),由A:P2、B:P1发起的数据将不被NatIP:NatPort接收。映射关系为:Client->NatIP:NatPort->A:P1,即只有来自A:P1的数据才可通过NatIP:NatPort发送到Client上。
(四)对称型NAT(SymmetricNAT):对称型NAT具有端口受限锥型的受限特性。但更重要的是,他对每个外部主机或 端口的会话都会映射为不同的端口(洞)。只有来自相同的内部地址(IP:PORT)并且发送到相同外部地址(X:x)的请求,在NAT上才映射为相同的外网端口,即相同的映射。一个外部地址(X:x)对应一个NAT上的映射,如上图红色三角,每个映射仅接收来自他绑定的外部地址的数据。注:X在这里意为任意一台外部主机,x为这台主机上的任意一个端口。映射关系为:Client->NatIP:Pa1->A:P1,当Client访问B:P1时,映射关系变为:Client->NatIP:Pb->B:P1,同理,NatIP:Pa2也就是Client访问A:P2时的映射。
3.穿透性
NAT类型简写对应:全锥形->FC,限制锥形->RC,端口限制锥形->PC,对称型->SN。还需要说明的是:下文所提到的“双方建立连接”意为双方在打洞之后而进行的直接的数据传输,而不是通常认为的“TCP是基于连接的“或是“UDP是无连接的协议”这样的概念。
(一)其中一个具有公网地址时。无论对方是什么类型的Nat都能打通。
(二)其中一个是FC时,都可以实现p2p通信。
(三)其中一个是RC时,如果另外一个nat是SN型的,则不能建立通信。除此之外的都能建立通信。
(四)当PC->PC时,能建立通信。
(五)SN对SN,不能建立通信。