mss是根据mss确认的,双方在tcp握手阶段,根据双方最小的mss确认。

而mss的大小是mtu-20-20确认的。

一旦mss确认,那么在整个通信过程中是不会改变的。
syn包中携带的mss值。
2024-04-03T01:48:22.png
syn ack包中携带的mss值。
2024-04-03T01:50:50.png

tcp中mss的作用是什么

TCP中的MSS(Maximum Segment Size)指的是TCP层一次可以接收的最大数据段的大小,不包括TCP头部。MSS的主要作用是为了减少网络中的分片,提高网络传输效率。它通常在TCP三次握手过程中的第一次握手中由发送方提出,并在握手过程中被接收方确认。MSS的大小通常由MTU(最大传输单元)决定,典型的以太网MTU大小为1500字节,减去IP头(20字节)和TCP头(20字节),因此常见的MSS值为1460字节。通过设置合理的MSS值,可以避免IP层的分片,提高数据传输效率。

mss是如何确认的?

MSS(Maximum Segment Size)的确认过程是在TCP三次握手阶段进行的,具体步骤如下:

SYN阶段:当建立一个TCP连接时,客户端在发送SYN包(连接请求)给服务器时,会在TCP选项字段中指定一个MSS值,这个值基于客户端网络环境下的最大传输单元(MTU)计算得出。这个值告诉服务器,客户端TCP层一次能够接收的最大数据段大小。

SYN-ACK阶段:服务器收到客户端的SYN请求后,会在返回的SYN-ACK包(连接确认及请求回应)中,同样在TCP选项字段里指定一个MSS值,这个值是基于服务器端网络环境的MTU计算得出的,用以告知客户端服务器TCP层一次能够接收的最大数据段大小。

确认阶段:客户端收到服务器的SYN-ACK响应后,会发送一个ACK包(确认包)给服务器,至此,三次握手完成,TCP连接建立。此时,双方都已经明确了对方的MSS值,并将在后续的数据传输中使用这个值来确定发送数据的最大段大小,以避免网络中的分片,提高传输效率。

需要注意的是,实际使用的MSS值是在三次握手过程中双方各自声明的MSS值中较小的一个,这样做是为了确保双方都能够处理对方发送的数据包,避免因为数据包过大而导致的丢包或分片。

如果两个客户端之间的mtu都是1500,那么mss是多少?

如果两个客户端之间的MTU(最大传输单元)都是1500字节,那么理论上的MSS(最大段大小)计算方式如下:

首先,MTU包括了整个IP数据包的大小,即IP头部+TCP头部+TCP数据部分。
IP头部标准大小是20字节(不包括任何选项)。
TCP头部标准大小也是20字节(不包括任何选项)。
因此,MSS的计算公式为:MSS = MTU - IP头部大小 - TCP头部大小

将数值代入公式中,得到:MSS = 1500 - 20 - 20 = 1460字节

所以,如果两个客户端之间的MTU都是1500字节,那么理论上它们能够协商的MSS值为1460字节。这意味着在不引发IP分片的情况下,TCP层一次能够发送的最大数据量为1460字节。

如果过程中遇到了分片,那么mss是否会调整

在TCP连接建立后,MSS(最大段大小)通常是固定不变的,它是在TCP三次握手过程中协商确定的。一旦TCP连接建立,MSS值就被设置为在连接过程中双方能接受的最大数据段大小,以避免IP分片。因此,在正常情况下,即使在传输过程中遇到分片的情况,MSS值也不会动态调整。

然而,实际网络环境中可能存在特殊情况,如路径MTU发现(Path MTU Discovery, PMTUD)机制。PMTUD是一种网络协议,用于发现和设置网络路径中的最大传输单元(MTU)以避免IP分片。这个机制允许发送方发现从源到目的地之间的最小MTU,从而可以调整数据包的大小,确保数据包不会在传输过程中被分片。

PMTUD虽然可以帮助调整数据包的大小以避免分片,但它实际上是通过调整IP层的数据包大小来实现的,而不是直接调整TCP的MSS值。如果在传输过程中,通过PMTUD发现路径上的MTU比之前协商的MSS还要小,发送方需要对数据包进行适当的调整(例如,减小数据包的大小),但这种调整是基于IP层的,而不是通过改变TCP协议层面的MSS值来实现的。

总的来说,MSS一旦在TCP连接建立时协商确定,就不会因为网络中的分片而动态调整。但是,发送方可以通过PMTUD等机制来调整其发送的IP数据包的大小,以避免分片,这种调整是在IP层面上进行的,而不直接修改TCP的MSS值。

最后修改:2024 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏