TCP 段长度和 TCP/IP 标头选项

网络工程 tcp mtu
2022-02-23 10:10:08

MSS 的计算公式为 MSS = MTU - IP 报头长度 - TCP 报头长度。

一个例子是以太网中的 MSS=1500-20-20=1460。

此计算忽略了 TCP 和 IP 标头中的选项,这会导致标头长度可变。
据我了解,当 TCP 组装段时,它知道 TCP 标头中的选项,并且它可以将数据截断为“正确”的大小以满足 MSS,因为它认为 IP 标头为 20 个字节。

但是,TCP 不知道 IP 选项,因为它位于 IP 层之上,那么它如何正确组装分段呢?
例如,一个 TCP 段有 1460 字节,IP 决定需要一些选项,这使得它的报头长于 20 字节。

在这种情况下,IP 是否需要拆分 TCP 段以满足 MTU(这似乎降低了传输效率,因为第二个数据包的有效载荷中可能只有几个字节)?

TCP 和 IP 在实现中是否有任何协商以避免这种 IP 分裂?

1个回答

来自RFC6691

在计算要放入 TCP MSS 选项的值时,MTU
值应仅减少固定 IP 和 TCP
标头的大小,并且不应减少以考虑任何可能的 IP 或 TCP 选项;相反,发送方必须减少 TCP 数据长度

以考虑 它发送的数据包中包含的 任何 IP 或 TCP 选项。

(强调我的)

所以这个问题就避免了。

编辑:正如hertitu所指出的,引用的RFC不是互联网标准轨道,所以让我们检查一下RFC1122,它是一个互联网标准。

TCP 实际发送的段的最大大小,“有效发送 MSS”,必须是发送 MSS(反映远程主机上可用的重组缓冲区大小)和 IP 层允许的最大大小中的较小者:

           Eff.snd.MSS =

              min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize

在哪里:

        *    SendMSS is the MSS value received from the remote host,
             or the default 536 if no MSS option is received.

        *    MMS_S is the maximum size for a transport-layer message
             that TCP may send.

        *    TCPhdrsize is the size of the TCP header; this is
             normally 20, but may be larger if TCP options are to be
             sent.

        *    IPoptionsize is the size of any IP options that TCP
             will pass to the IP layer with the current message.

如您所见,MSS必须同时考虑 IP 选项大小和 TCP 选项。

关于 :

但是,TCP 不知道 IP 选项,因为它位于 IP 层之上,那么它如何正确组装分段呢?

TCP 负责将应用程序请求的 IP 选项传递给 IP 层,因此它可以计算 IP 选项的大小。