这个疑问已经困扰了我一段时间了。
在阅读了大量文章后,我发现客户端和服务器在 tcp 3 方式握手期间交换了它们的 mss 值,并且选择了两个值中较低的作为连接的 mss。由于客户端和服务器都使用相同的 mss 值,这不是协商吗?
这个疑问已经困扰了我一段时间了。
在阅读了大量文章后,我发现客户端和服务器在 tcp 3 方式握手期间交换了它们的 mss 值,并且选择了两个值中较低的作为连接的 mss。由于客户端和服务器都使用相同的 mss 值,这不是协商吗?
它不被视为谈判,它是一个已知最大值的声明,并且没有来回。它可以双向不同。因此,一个 TCP 流可以具有不同的 MSS。
RFC 879规定:
主机不得发送大于 576 个八位字节的数据报,除非他们特别知道目标主机已准备好接受更大的数据集。
因此:
TCP 最大段大小是 IP 最大数据报大小减去四十。
默认 IP 最大数据报大小为 576。
默认 TCP 最大段大小为 536。
并继续:
TCP 提供了一个选项,可以在建立连接时使用该选项(仅)指示该连接上可以接受的最大 TCP 段大小。这个最大段大小 (MSS) 声明(通常被错误地称为协商)从数据接收方发送到数据发送方,并表示“我可以接受最大为 X 的 TCP 段”。大小 (X) 可能大于或小于默认值。MSS 可以在数据流的每个方向上完全独立地使用。 结果可能是两个方向上的最大尺寸完全不同。
你不能称之为协商,因为每一方都声明了它可以接受的 MSS。此值是 tcp 缓冲区和出口接口 mtu 大小之间的最小值。一旦主机知道其 MSS 和远端主机的 MSS,他将选择最低的一个。因此,本质上,两个主机都将使用相同的 MSS 发送数据。