3

A client and a server are separated by a router. I don't understand the principle of MSS adjustment. When the client sends a SYN packet to the server, the SYN/ack server replies with its MSS.

Example: 1452 bytes

So will the client send packets with an MSS or will the router between the client and the server send packets with an MSS of 1452 bytes? I also don't understand the TCP adjust MSS 1452 command. Does this mean that the router will force the packets to 1452? Could you please explain to me this is not clear.

1 Answer 1

4

"When the client sends a SYN packet to the server, the SYN/ack server replies with its MSS." Not necessarily. MSS is a TCP option, and it can only appear in the SYN segment. "If an MSS Option is not received at connection setup, TCP implementations MUST assume a default send MSS of 536 (576 - 40) for IPv4 or 1220 (1280 - 60) for IPv6 (MUST-15)."

MSS may be related to the MTU, but it is based on the fragmentation reassembly buffer of the host sending the MSS, and that could certainly be related to the MTU, but not necessarily. For example, a host with an MTU of 1500 could have a larger MSS because the host sending to it could then send a segment that causes IP to fragment its packet to fit its own MTU, and the receiver could then reassemble the packet, passing a segment larger than the MTU to TCP.

The router adjustment for MSS is used when you have, for example, a tunnel with a smaller MTU, and you want to make sure that a segment cannot overrun on the other end. In that case, the router will adjust the MSS in the SYN it sees to be what you have configured for the MSS. Remember that the largest transmission size permitted by the IP layer is 65536 - any overhead (40 for IPv4 and 20 for IPv6 since the largest IPv6 payload size is not decreased by the IPv6 header).

The maximum size of a segment that a TCP endpoint really sends, the "effective send MSS", MUST be the smaller (MUST-16) of the send MSS (that reflects the available reassembly buffer size at the remote host, the EMTU_R [19]) and the largest transmission size permitted by the IP layer (EMTU_S [19]):

Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize

Without using the adjustment, each end of the connection may set its own MSS in the connection handshake, or not use that option, and the smallest wins. With the adjustment, it gets set to what you configure it to be.

This is described in RFC 9293, Transmission Control Protocol (TCP)

If this option is present, then it communicates the maximum receive segment size at the TCP endpoint that sends this segment. This value is limited by the IP reassembly limit. This field may be sent in the initial connection request (i.e., in segments with the SYN control bit set) and MUST NOT be sent in other segments (MUST-65). If this option is not used, any segment size is allowed. A more complete description of this option is provided in Section 3.7.1.

Not the answer you're looking for? Browse other questions tagged or ask your own question.