TCP 会话中的端点如何确定其 MSS?

网络工程 通讯协议 协议理论 第4层 传输协议
2021-07-09 00:26:15

我知道 MSS 是最大段大小,它是 TCP 将发送的有效负载的大小。我也明白,在 3 次握手期间,双方在 TCP 对话中都建议了“接收”MSS 值,并且双方在发送数据时都会遵守对方提议的 MSS。

我的问题是,如何设置 MSS?客户端或服务器在声明“我希望您以 X 字节的最大块向我发送 TCP 段”时使用哪些因素。它仅基于 MTU 吗?其他因素是否会影响一方的 MSS 的计算?

(虽然与我的问题有些无关,但这个问答确实提供了一些有用的背景信息)

1个回答

1. 设置 MSS 有什么用?

在您引用的问题中,它说明了这一点,MSS 是直接从 MTU 派生的。典型的以太网 MTU 为 1500,但还必须考虑 IP 和 TCP 标头 - 它们每个都是 20 字节。

注意:仅供参考,MTU 可以有不同的大小 -参见巨型帧示例

我们最终得到:

MSS = 1500 - 20 - 20
MSS = 1460 bytes of TCP data

我想强调你提到的一些事情,你说 TCP 连接的 MSS 是在 3 次握手期间建立的,这是 100% 正确的。如果连接的任何一方想要调整其 MSS,则必须断开 TCP 连接并重新建立。在进一步讨论之前,我们需要澄清“接收 MSS”,您所想到的是 TCP 接收窗口。这与 MSS 不同。

2. 计算一方的MSS是否有其他因素?

所以请记住,TCP MSS 是在 TCP 握手期间与所有其他会话选项一起建立的。大多数情况下,商定的 MSS 将是可以在 TCP 段中发送而没有分段的最大可能有效负载最后一部分是关键,这意味着如果客户端和服务器正在尝试建立 TCP 连接,并且客户端设置了较小的 MSS 大小,则连接将选择两个值中较小的值以避免所述碎片。

应该注意的是,如果运行应用程序/服务的人不关心碎片,则可以手动设置 MSS。

3. 客户端或服务器在声明“我希望您以 X 字节的最大块向我发送 TCP 段”时使用哪些因素?它仅基于 MTU 吗?

底线是 TCP 将尝试将尽可能多的数据压缩到每个消息中,以最大限度地提高网络效率。需要明确的是,单个未分段的TCP 分段的有效载荷(标头、数据、选项等)不能超过 MSS的有效载荷,如果该单个 TCP 分段是一个消息,或者分段分段的一部分与 TCP 无关- 这就是它的设计目的。

它不仅仅基于终端主机的 MTU,而且如前所述,它是从它派生而来的。诸如较低的“路径 MTU” (请参阅路径 MTU 发现 (PMTUD))之类的东西会影响网络性能。

其他因素也会影响网络性能,但不一定只是 MSS。如果您想了解在围绕 TCP 设计应用程序或服务时可能会考虑的其他事项,您可以查看TCP Tuning 之类的内容。