前文:
关于“内网穿透”的一些知识
——————————————
内网穿透是一个很不好理解的一种网络技术,逻辑上虽然不是很好理解,但是实际操作起来并不是很复杂。两个在不同内网中的主机想要相互通信只能有两种方式,一种是通过打洞技术实现两者之间的直接通信;另一种则是使用中继服务器进行中转通信。
通过打洞技术实现不同内网的主机直接通信需要看不同内网的NAT设备的类型,如果其中任意一方如果使用了带防御机制的防火墙或者是具备一定流量均衡负载能力的路由,那么使用打洞技术实现直接通信大概率是不可能的。但是,如果两个不同内网中的主机不能直接通信那么就一定可以使用中转服务器进行通信,因此可以说内网穿透技术是可以突破一切封锁的,但是为啥既然这样我们还要不断的去弄打洞技术的内网穿透而不是直接使用中继服务器的中转通信方式的内网穿透技术呢?
其实,大部分情况下,或者说传统情况下,使用中继服务器的中转通信方式实现的内网穿透的通信质量是不如打洞后直接互联的内网穿透的,就是网络通信质量会差些,但是这个也并不绝对。
使用中继服务器进行通信中转实现更好通信效果的情况:
两个内网直接互联通信实现更好通信效果的情况:
通过上面的这两个示意图我们可以知道使用中继服务器并不一定会使通信效果变差,但是使用中介服务一定会占用中继服务器的带宽增加成本。之所以传统情况下任务中继服务器方式的内网穿透效果不如打洞后直接互联的好完全是因为长久以来提供中继服务的服务器都比较少,难以做到符合各个网络节点的更快速连接的性能要求,但是如果我们可以使各个网络边缘上都有足够的中继服务器那么其性能可以大概率的优于直接互联,但是要实现这个目的往往需要巨大的成本。所以,使用中继服务器进行中转通信需要看实际情况,在打洞互联和中转通信两种方式都可以实现的情况下可以比较下两者间的通信性能,以此来选择更优的内网穿透的通信方式。
根据前文:https://www.cnblogs.com/devilmaycry812839668/p/17904993.html
可以知道:
双方中只要有一方是Full Cone,可以P2P直连;
双方都是Restricted Cone或Port Restricted Cone,这种情况可以打洞,通过服务器握手以后,双方的数据不再经过中继服务器;
一方为Restricted Cone,另一方为Symmetric NAT,可以打洞,通过N2N服务器握手以后,双方的数据不再经过服务端;
一方为端口Port Restricted Cone,另一方为Symmetric NAT,这种情况无法打洞,数据要走服务器中转;
双方都为Symmetric NAT,这种情况也是无法打洞的,数据要走服务器中转;
打洞的内网穿透的过程:
1. 双方中只要有一方是Full Cone
假设Full Cone的一端为内网主机A,另一端为另一内网中的主机B,A主机内网地址192.168.1.100,端口33333,公网映射地址222.22.222.22,公网映射端口22222,发送数据给主机B的公网IP:222.33.222.22,B主机的公网端口号随机即可;B主机可以通过发送数据给公网映射地址222.22.222.22,公网映射端口22222,来实现对内网A主机的192.168.1.100:33333的访问。
由于A主机时Full Cone,A主机的公网映射关系可以通过向某个公网主机发送数据来获得,该公网主机在接受到A主机发送的数据后自然可以获得A主机的内网和公网的映射关系,由于A主机的NAT设备是Full Cone类型,因此在知道这个映射关系后任意主机均可以和A主机的内网地址和端口进行通信,这个通信可以是TCP的,也可以是UDP的。
2. 双方都是Restricted Cone或Port Restricted Cone
两个不同内网中的主机A、B,可以通过和某个公网主机通信获得自身的内网和公网的映射关系,假设:
A:
内网:192.168.1.100:3333 ——> 公网:222.22.22.22:2222
B:
内网:192.168.2.102:3334 ——> 公网:222.33.22.22:2255
A主机利用自身的映射关系向B主机的公网IP+端口发送数据,与此同时B主机利用自身的映射关系向A主机的公网IP+端口发送数据,即可实现A、B主机的互联通信。
3. 一方为Restricted Cone,另一方为Symmetric NAT
假设A主机的映射关系:
A:
内网:192.168.1.100:3333 ——> 公网:222.22.22.22:2222
由于B主机为Symmetric NAT,因此B主机的映射关系无法获得,但是可以知道B主机的内网IP和公网IP。
A主机利用自身的映射关系向B主机的公网IP的任一端口发送数据,由于A主机时Restricted Cone,因此A发送数据之后B主机可以用任一端口向A的公网IP和端口发送数据,A主机收到B主机发送的数据就可以知道B主机的内网与公网的映射关系了。
因为A主机是Restricted Cone,因此A主机是不对对方端口进行限制的,也就是说A主机向B主机的公网IP下的任一端口发送数据后,B主机的公网IP下的任一端口均可以实现对A主机的公网IP和端口进行通信。
比如:
B主机的外网IP:222.33.22.22
A主机向B主机的外网任意端口发送数据后A主机的NAT设备中的映射关系:
A:
内网:192.168.1.100:3333 ——> 公网:222.22.22.22:2222——》B:222.33.22.22
此时B主机就可以通过任一端口发送数据到A主机,只要A主机收到B主机发送的数据就可以知道B主机的内网与外网的映射关系,从而实现A、B主机的互联。
4. 一方为端口Port Restricted Cone,另一方为Symmetric NAT
无法打洞互联,只能中继服务器中转。
5. 双方都为Symmetric NAT
无法打洞互联,只能中继服务器中转。
第4种情况不能互联是因为Port Restricted Cone要求必须知道对方的公网端口(只有知道对方公网对口才能发送数据给该端口,从而实现对该端口数据的接收),而Symmetric NAT是使用随机端口的(无法知道每次通信使用的公网端口是哪个);第5种情况是业务Symmetric NAT同样要求必须知道对方的公网端口(主动发送数据的一方必须知道对方的建立映射关系后的公网端口,以保证对方使用该端口来发送回数据以实现打洞的目的),而对方也是Symmetric NAT是使用随机端口的,无法确定每次通信时对应的公网端口。
—————————————–