最近在公司测试一款正在开发的家用路由器设备时,发现该设备上传文件到我们的云服务器上时,总是出错。通过抓包发现,设备和云的连接通常是小的报文,而一旦上传文件,报文则开始分片,从而引发故障。
从理论上来说,即使是分片报文,按tcp/ip协议,是合理的报文,为什么连云服务器会出错呢?我们的云服务器是租用的阿里云,咨询阿里云后,给我们的回复是他们的SLB和OSS都不支持分片报文。
因此需要我们自己来解决这个问题,下面是我们的两种解决方案:
- 将路由器WAN口的MTU设置为1400(缺省是1500),和上级的路由器配置一致,这样报文就不会出现分片。
- 我们的设备是基于linux开发的,该linux的sdk里,/proc/sys/net/ipv4/ip_no_pmtu_disc是置为1的。只要将该位置为0,启动MTU自动发现,也可以解决该问题。
另外,我们还发现,该路由器在家里的电信网络中,不会出现该问题。通过抓包,发现路由器的WAN口有分片报文,但是在服务器上,报文却没有分片。这说明,在电信的网络中,有设备进行了分片重组。因此我从网上搜索了一下,确实有设备实现了IP报文虚拟重组功能。该文章指出: 如果设备上配置了NAT、防火墙、SAC(Smart Application Control)或深度安全防御功能,虚拟分片重组功能默认使能,且不能去使能,即执行命令undo ip virtual-reassembly不生效。电信为节省ip地址,家用网络基本都是NAT网络,因此这些NAT设备启动了IP报文虚拟重组功能,没有出现上面我们在公司的开发网络中出现的问题。