第18章 TCP连接的建立与终止
18.4 最大报文段长度
最大报文段长度(M S S)表示T C P传往另一端的最大块数据的长度。当一个连接建立时,连接的双方都要通告各自的 M S S。我们已经见过 M S S都是1 0 2 4。这导致I P数据报通常是4 0字节长:2 0字节的T C P首部和2 0字节的I P首部。
在有些书中,将它看作可“协商”选项。它并不是任何条件下都可协商。当建立一个连接时,每一方都有用于通告它期望接收的 M S S选项(M S S选项只能出现在S Y N报文段中)。如果一方不接收来自另一方的 M S S值,则M S S就定为默认值5 3 6字节(这个默认值允许 2 0字节的I P首部和2 0字节的T C P首部以适合5 7 6字节I P数据报)。
一般说来,如果没有分段发生, M S S还是越大越好(这也并不总是正确,参见图 2 4 - 3和 图2 4 - 4中的例子)。报文段越大允许每个报文段传送的数据就越多,相对 I P和T C P首部有更高的网络利用率。当 T C P发送一个S Y N时,或者是因为一个本地应用进程想发起一个连接,或者是因为另一端的主机收到了一个连接请求,它能将 M S S值设置为外出接口上的 M T U长度减去固定的I P首部和T C P首部长度。对于一个以太网, M S S值可达1 4 6 0字节。使用IEEE 802.3的封装(参见2 . 2节),它的M S S可达1 4 5 2字节。
在本章见到的涉及 B S D / 3 8 6和S V R 4的M S S为1 0 2 4,这是因为许多 B S D的实现版本需要M S S为5 1 2的倍数。其他的系统,如SunOS 4.1.3、Solaris 2.2 和AIX 3.2.2,当双方都在一个本地以太网上时都规定 M S S为1 4 6 0。[Mogul 1993] 的比较显示了在以太网上 1 4 6 0的M S S在性能上比1 0 2 4的M S S更好。
如果目的I P地址为“非本地的 ( n o n l o c a l )”,M S S通常的默认值为 5 3 6。而区分地址是本地还是非本地是简单的,如果目的 I P地址的网络号与子网号都和我们的相同,则是本地的;如果目的I P地址的网络号与我们的完全不同,则是非本地的;如果目的 I P地址的网络号与我们的相同而子网号与我们的不同,则可能是本地的,也可能是非本地的。大多数 T C P实现版都提供了一个配置选项(附录E和图E - 1),让系统管理员说明不同的子网是属于本地还是非本地。这个选项的设置将确定 M S S可以选择尽可能的大(达到外出接口的 M T U长度)或是默认值5 3 6。
M S S让主机限制另一端发送数据报的长度。加上主机也能控制它发送数据报的长度,这将使以较小M T U连接到一个网络上的主机避免分段。
考虑我们的主机s l i p,通过M T U为2 9 6的S L I P链路连接到路由器b s d i上。图1 8 - 8显示这些系统和主机s u n。
从s u n向s l i p发起一个T C P连接,并使用t c p d u m p来观察报文段。图 1 8 - 9显示这个连接的建立(省略了通告窗口大小)。
在这个例子中,s u n发送的报文段不能超过 2 5 6字节的数据,因为它收到的 M S S选项值为2 5 6(第2行)。此外,由于 s l i p知道它外出接口的 M T U长度为2 9 6,即使s u n已经通告它的M S S为1 4 6 0,但为避免将数据分段,它不会发送超过 2 5 6字节数据的报文段。系统允许发送的数据长度小于另一端的M S S值。
只有当一端的主机以小于5 7 6字节的M T U直接连接到一个网络中,避免这种分段才会有效。如果两端的主机都连接到以太网上,都采用 5 3 6的M S S,但中间网络采用 2 9 6的M T U,也将会出现分段。使用路径上的M T U发现机制(参见2 4 . 2节)是关于这个问题的唯一方法。