TCP的MSS

MSS(Maximum Segment Size,最大报文段长度)表示可以被终点接收的TCP报文段的最大长度。在TCP首部中可以有多达40字节的选项信息,选项中的内容有很多种,MSS是其中的一种,其格式如图1.31所示。

TCP的MSS_style

图1.31 MSS选项的格式

虽然MSS是最大报文段长度,但它定义的是数据的最大长度,不包括TCP首部。

前面讲到的IP分片,是基于MTU对IP数据包进行分片的。在实际应用中应该尽量避免IP分片,TCP考虑到了这一点。为了尽量避免IP层的分片,TCP首先基于MSS对过长的TCP报文进行分段。因此,MSS与MTU是有关联的,一般来说,MSS=MTU-20(IP首部长度)-20(TCP首部长度)。例如,以太网的MTU为1500字节,那么主机在建立TCP连接时通报的MSS是1460字节。

MSS是在连接建立阶段确定的,在建立TCP连接时,每一方在SYN报文中通报它将在连接期间接收的报文段的MSS,然后选取最小的MSS作为双方协商的结果。如果双方都不通报或有一方不通报,一般选择MSS的默认值为536字节。

 
  TCP的MSS_target_02

TCP的MSS_blank_03TCP的MSS_style_04

意 啦

? MSS在连接建立阶段确定后,在连接期间MSS的值保持不变。

? MSS只存在于SYN报文和SYN+ACK报文中。

TCP的MSS_blank_05

下面来演示TCP的MSS。

在Web主机上配置IIS搭建FTP站点,然后启用Sniffer抓包。

在主机PC1上通过修改MTU来修改MSS,具体步骤为:

在注册表中依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ Tcpip\Parameters\Interfaces\,找到网卡对应的一串数值,例如{E02CF20F-0FA9-4E68-89E5-A54E4E981847},然后新建一个DWORD值,名称为MTU ,十进制数值为1400。然后禁用、启用网卡,使之生效。

进入CMD窗口,输入:

C:\>ftp 192.168.1.1

Connected to 192.168.1.1.

220 Microsoft FTP Service

User (192.168.1.1:(none)): ftp

331 Anonymous access allowed, send identity (e-mail name) as password.

Password:

230 Anonymous user logged in.

//下载一个文件cs

ftp> get cs

200 PORT command successful.

150 Opening ASCII mode data connection for cs(1570306 bytes).

226 Transfer complete.

ftp: 1570306 bytes received in 23.52Seconds 66.78Kbytes/sec.

ftp>

下面来查看并分析Web主机上用Sniffer抓到的包。

(1)客户端(192.168.0.1)向服务器(192.168.1.1)发送SYN报文段,如图1.32所示。

TCP的MSS_blank_06

图1.32 TCP的MSS抓包(1)

因为客户端(192.168.0.1)设置了MTU值为1400,所以客户端(192.168.0.1)发送的SYN报文段中MSS的值为1360。

(2)服务器(192.168.1.1)向客户端(192.168.0.1)发送SYN+ACK报文段,如图 1.33所示。

TCP的MSS_信息_07

图1.33 TCP的MSS抓包(2)

服务器(192.168.1.1)的MTU值默认为1500,所以服务器(192.168.1.1)发送的SYN+ACK报文段中MSS的值为1460。

(3)在客户端(192.168.0.1)下载文件的过程中,服务器(192.168.1.1)向客户端(192.168.0.1)发送的TCP报文段中的数据部分的长度为1360字节,说明双方协商的MSS值为1360,如图1.34所示。

TCP的MSS_信息_08

图1.34 TCP的MSS抓包(3)

 
  TCP的MSS_style_09

TCP的MSS_信息_10TCP的MSS_blank_11

意 啦

通信双方在TCP连接过程中对MSS值的协商还会受到中间路由器的影响。如果在路由器的接口上配置了命令ip tcp adjust-mss mss,路由器会对进出该接口的SYN报文段中的MSS值进行修改,从而影响通信双方对MSS值的协商。