P2P 通信原理
P2P 是指2台电脑之间相互通信。当2台电脑之间在不同的局域网下面是怎么互相通信的呢?
首先了解微信是怎么通信的,微信是通过微信服务器转发我们消息的
如客户端A和B之间通信,是借助了服务器131.12.12.1转发的。
服务器131.12.12.1启动微信程序后,绑定的端口是1111,客户端A和B均在线时,也就是A和B同时登陆到微信服务器,此时服务器和A和B均建立一个通道,有人可能会问,别人不在线我也能发送消息呢,那是因为服务器帮你把消息缓存在服务器,等对方上线后,在进行转发。这种情况下的消息过程是
因为目的地址是131.12.12.1 A先把消息转发到网关上,也是就192.168.10.1上,此时A应用服务器启动的端口假设是1111,这里会进行NAT转换.
NAT分为两种,一种是NAT, 一种是NAPT, 前者只进行IP地址转换,后者还会进行传输层的端口转换
发送方地址会变成172.1.13.1,端口假设是2222,然后目的地址任然是131.12.12.1,服务器接收到消息后。找到B的通信地址,这里其实就是141.1.1.2:2222,
B的路由器接收到消息后,这里其实有一个NAT转换表,也就是发送到141.1.1.2:2222端口上的数据会被转发到192.168.20.2:1111上,这样B就接收到消息了
整个过程:
192.168.10.2:1111 ---> 172.1.13.1:2222 ---->131.12.12.1:3333----> 141.1.12:2222----->192.168.20.2:1111
WAN | LAN |
141.1.1.2:2222 | 192.168.20.2:1111 |
上面其实不是一个P2P,P2P是A和B之间直接访问,而不需要借助服务器。
可能会说A直接发给B的外网地址 141.1.12:2222,B发给A的外网地址172.1.13.1:2222,不就可以实现通信了吗,但是很多NAT服务器其实为了安全,这种情况不会进行转发的。
先了解NAT转换类型,有以下几种:
类型 | 描述 |
锥型NAT(Full-cone NAT) | 内网ip1:port1会映射到公网ip2:port2,ip1:port1发往外网的包都将通过ip2:port2发出;外部任何ip3:port3都可以通过发送数据包给ip2:port2从而与ip1:port1进行通信。 |
(地址)限制型锥型NAT((Address)-restricted-cone NAT) | 内网ip1:port1会映射到公网ip2:port2,ip1: port1发往外网的包都将通过ip2:port2发出;外部只有收到过ip2:port2数据包的ip3才可以发送数据包给ip2:port2从而与ip1:port1进行通信。 |
端口限制型锥型NAT(Port-restricted cone NAT) | 内网ip1:port1会映射到公网ip2:port2,ip1: port1发往外网的包都将通过ip2:port2发出;外部只有收到过ip2:port2数据包的ip3:port3才可以发送数据包给ip2:port2从而与ip1:port1进行通信。 |
对称性NAT(Symmetric NAT) | 内网ip1:port1任何一个发往外网ip3:port3的请求,都将使用独有的公网ip2:port2;外部只有收到过ip1:port1数据包的服务才能返回数据。 |
锥型NAT先天支持,
限制型锥型NAT 和 端口限制型锥型NAT这里加了限制,如果一个陌生的IP发到对应端口,是不会进行转发的。所以要解决P2P,这里需要借助服务器进行P2P打洞。
当服务器同时接收到A和B的消息后,首先服务器要A发一个消息到B的外网141.1.1.2:2222(UDP就行),此时B不会进行消息转发,然后服务器要B发送一个消息到A的外网172.1.13.1:2222, 由于A已经发送过消息到B,所以A的路由器会接收B的消息,并转发到A,这样后面A和B就可以正常通信了,不需要借助服务器进行转发了