由于TCP分片导致登录网管慢

发布时间:  2014-09-20 浏览次数:  401 下载次数:  0
问题描述
组网结构:

使用PC上的网管软件登录网管服务器1时发现很慢,要1到2分钟才能登录。登录成功后,查询也很慢。但同一个客户端去连接网管服务器2时没有问题。使用与网管服务器1同网段内的客户端登录没有出现问题。
处理过程
在同一个网段内的PC登录服务器没有问题,说明网管服务器1是正常的。而出问题的PC登录网管服务器2正常,说明该PC本身也没有问题。问题可能出现在这条链路上。于是在PC上进行抓包,抓包如下:

通过观察,可以发现抓包中有一个分片报文,但只有一片,而且是首片,既然是分片,必定存在两片或两片以上,这里只有一片,说明有一片被丢弃了。另外一般情况下TCP是不分片的,因为在TCP三次握手时,会协商MSS值,这个值决定了后续TCP数据报文的大小。MSS值可以被中间设备调整,如某个发送了SYN报文或SYN-ACK报文的设备的接口的MTU值小于MSS+40,则需要对该SYN报文或SYN-ACK报文的MSS值进行修改,以避免后续报文经过此接口时发生分片。此处抓到了一个分片报文,说明中间有台设备会对报文进行分片,但无法对MSS值进行修改。丢包很有可能跟这个原因有关。
经过确认,中间的一台思科路由器的接口上的确设置了MTU,查看抓包中的SYN报文和SYN-ACK报文,里面的MSS值都是1460,说明这台思科路由器没有调整MSS值。
USG是可以通过命令行firewall tcp-mss xxx来对通过USG转发的SYN报文或SYN-ACK报文的MSS值进行调整,于是在USG上配置firewall tcp-mss 1400,再进行登录测试,结果登录正常。
根因
网络中的思科路由器接口设置了MTU,但不会对经过的SYN报文或SYN-ACK报文调整MSS值,结果TCP报文分片,后续片丢包导致网管服务器登录不正常。
解决方案
在USG上配置命令行firewall tcp-mss 1400进行规避。

END