先看一个问题
在拉家庭宽带的时候,直接拉运营商的宽带有点贵,市场上通常还会有类似于鹏博士,长城宽带之类的商家,它们价格很低,号称宽带速度也很快,你拉还是不拉?
用过这些宽带的就会知道,便宜其实是付出代价了的:
其一、与电信宽带相比,鹏博士们的速度肯定是随着整栋大楼使用人数增加而递减;
其二、这些“鹏博士”宽带们一般都无法使用P2P软件,你没法用BT,电驴,迅雷下片,连想玩个区块链钱包都玩不了。
一、静态端口映射
这种方式就是手动在路由器上进行端口映射,例如下图就是TPLINK路由器将各种常用的服务端口映射到内部一台主机对应的同样端口上。
优点:
这种方式映射的端口永久有效,除非人为去删除或修改。
缺点:
完全依赖于人工的静态配置,扩展性极差。
二、UPNP动态端口映射
UPNP端口映射的大致流程:
路由器开启UPNP服务,向外暴露自己"根设备"的身份
内部的主机的应用程序通过UPNP协议,在本地链路网络中搜索支持端口映射功能的根设备(也就是路由器)
内部主机找到路由器后,通过UPNP协议,向路由器申请创建端口映射规则,将本地端口映射到路由器上。
路由器响应端口映射请求,完成动态端口映射
优点:
可以应用自动与路由器协商完成端口映射过程,无需人工参与。(主流P2P软件都用这个)
缺点:
路由器可能禁止这个服务,或者没有这个服务。
三、NAPT打洞
原理:
内部主机往外部设备发报文的,以便外部设备能给内部主机发消息的操作,就称为"打洞"。
NAPT的类型划分
第一类: 圆锥型NAT(Cone NAT),也叫非对称型NAT。圆锥型又可以划分为以下三种子类型:
1.1 完全锥形NAT (Full Coe NAT)
这种情况下,内网主机用端口2000往外部服务器S1的2000端口发数据后,外部网络任意主机都可以通过任意源端口通过路由器上这个洞给它发数据了。
例如,图中主机S1可以通过2000端口,或者3000端口给内部设备发数据;
主机S2虽然没有得到内部主机主动给它打洞,但是也可以通过任意端口给内网主机发数据。
1.2 地址限制型锥形NAT (Address Restricted Cone NAT)
1.3 端口限制型锥形NAT (Port Restricted Cone NAT)
我测试过TPLINK路由器,华为路由器,都默认是这种NAT类型(端口限制型圆锥NAT),所以NATP打洞都主要以这种类型为主,打通这种类型NAT,其他的锥形NAT都是可以通的。
第二类:对称型NAT (Symmetric NAT)
这种类型的NAT,内网主机用端口2000往S1的2000端口发消息后,S1可以通过2000端口给它回复消息,当内网主机再给服务器S1的3000端口发消息时,在路由器上映射的端口号变了,S1此时只能用端口3000沿着通道给内网主机回消息了。
对称型NAT和圆锥型NAT中的端口限制型锥形NAT的区别:
端口限制型锥形NAT,用同一个端口给不同的目的IP和端口发消息时,NAT设备上映射的端口号没变,而对称型NAT会变成一个新的映射端口,之前的映射端口无效了。
对称型NAT为什么难打洞?
对称型NAT之所以难以打洞,是因为内部主机往指定的目的主机地址和端口发数据后,其在NAT设备上的映射端口就变了,而且这个端口映射的规律,不同厂商的设备不一样,有些设备映射的规则可能是递增一个步长,而有些设备直接是随机算法生成的。
NAT打洞方式的优点
打洞协议简单,编程实现方便。相比UPNP协议,打洞只需要往外部发数据就可以完成临时端口的映射。
NAT打洞方式的缺点
打洞建立的端口映射规则是有时效的,为了维护这个端口映射规则,需要定时发心跳包。对称型NAT,端口映射的规律可能是随机的,打洞过程复杂而且成功率低。
NAT的类型多样,打洞前,一般需要先测试一下NAT的类型。
四、设置DMZ主机
在很多路由器上,还有一种端口映射:内部网络中指一台DMZ主机,然后这台DMZ主机所有端口不经映射,完全裸奔,暴露给外部网络。
优点
配置方便。
缺点
安全性差,只适合内部只有一台主机需要对外提供服务的情况。
总结
文章开头提到的为什么“鹏博士”之类的宽带无法使用P2P软件下片,其实也在于鹏博士的路由器设置了防火墙,打洞你打不通;也没给你开放UPNP服务,端口映射不了!
感兴趣的盆友可以关注我们的微信公众号“麻辣软硬件”,欢迎大家在后台留言,和我们沟通交流技术相关话题!