客户反馈新的无线控制器在使用时出现通过网页编写的程序无法正常保存的问题。
我远程连接到客户的电脑排查,发现当点击编程网页的保存按键之后,并没有收到控制器的TCP通信的应答。
因为保存程序的HTTP请求的数据比较长,大概有1400个字节左右。
应该是超过了该网络的MTU的大小,使得一条HTTP请求被拆分了多个TCP数据帧。
可能是打开网页的电脑或者是交换机、AP等中间网络设备所设置的MTU值小于1400个字节所导致。
用wireshark抓包,果然发现tcp三次握手中的syn ack所返回的maximum segment size为1250,而正常能正常保存程序的TCP连接所返回的maximum segment size为1440。
可能是客户网络的中间网络设备(如交换机,路由器等)的MTU较小,并且修改了控制器返回的syn ack中的maximum segment size;
为了解决这个问题,我修改了控制器的TCP服务端代码,增加数据缓存策略,通过HTTP GET数据包的特点,如果收到的数据包的结束字符不是\r\n,说明数据包被拆包,数据不提交给应用程序处理,而且保存到数据缓存,并与接下来的数据拼接,直接收到的数据帧的结束符为\r\n,才把重新封包的完整数据帧提交给应用程序处理。