MSS is used in the TCP protocol. It determines the maximum size of a TCP segment that can be sent over a network, excluding the TCP header and IP header (the non-header portion of the packet).

MTU - (TCP header + IP header) = MSS



MSS Announcement

  • shared during tcp handshake
  • default: 536
    • MTU = 576
    • MDDS = MTU - IPHdrLen = 576 - 20 = 556
    • MSS = MDDS - TCPHdrLen = 556 - 20 = 536
    • MDDS: Maximum Datagram Data Size

How to Know MSS

  • The Network Driver (ND) or interface should know the MTU of the directly attached network.
  • The IP should ask the Network Driver for the Maximum Transmission Unit.
  • The TCP should ask the IP for the Maximum Datagram Data Size (MDDS). This is the MTU minus the IP header length (MDDS = MTU - IPHdrLen).
  • When opening a connection, TCP can send an MSS option with the value equal to: MDDS - TCPHdrLen. In other words, the MSS value to send is: MSS = MTU - TCPHdrLen - IPHdrLen

MSS Clamping

Idea: to avoid bottleneck

  • Client/Server side
    • When TCP finished handshake, we choose the smaller one between the two.
  • MiddleBox side:
    • a router along a network path has an MTU value set lower than the typical 1,500 bytes. This can result in packet loss and can be difficult to discover.
    • during the TCP handshake, the server can signal the MSS for packets it is willing to receive, “clamping” the maximum payload size from the other server.