TCP/IP之MTU、MSS

2,371 阅读3分钟

1. 初识 MTU

查看服务器的 MTU 配置:

客户端 MTU 配置:

通过上图我们可以观察到, 每个网卡都可以设置自己的 MTU.

2. 为什么 MTU 是 1500 字节

以太网Ethernet最大的数据帧是1518字节。以太网帧的帧头14字节和帧尾CRC校验4字节(共占18字节),剩下承载上层协议的地方也就是Data域最大就只剩1500字节. 这个值我们就把它称之为MTU。

IP层非常关心MTU,因为IP层会根据MTU来决定是否把上层传下来的数据进行分片.

你可能会想, 如果我将 MTU 拓大是不是就可以减少分片, 增大网络传输啦?

理想很丰满, 现实很骨感

如果过大,就会增加解析拆包的消耗,太大会拥塞。(这个过大指的是一次过大,就要分片分成两次传送) 太小,就会造成传输效率下降。

你可以这么理解,一条运输公路,车太少,降低运输量。

过大,就会堵车,造成传输缓慢,太大,堵车了,谁都过不了。

3. 从抓包角度看 TCP 连接

全局四大层

我们看到一共分为四大层, 分别对应了(物理层)、(数据链路层)、(网络层)、(传输层).

  1. 物理层: 关注数据字节写入, 收到 1514 bytes, 这已经是我当前环境配置最大包了, 最大包为什么是 1514 bytes, 我们稍后再说.
  2. 数据链路层: 来源 MAC 地址、目标 MAC 地址
  3. 网络层: Ipv4 标记 IP 来源地址、目标 IP 地址
  4. 传输层: TCP 标记来源、目的端口号及其他数据标识.

由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes. 这个值我们就把它称之为MTU。

4. 又见 MSS

MSS (Maxitum Transmission Unit) 最大传输单元

这里我们的 MSS 值为 1448 字节.

MTU是协商制的, 所以对应的 MSS 在 TCP 连接建立时就协商好了, 以最小值为准

MSS 为什么是1448

MSS就是TCP数据包每次能够传输的最大量, 决定TCP的单包传输量。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的 时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460(如图1中红色方框所示的SYN包中的MSS值)。通讯双方会根据双方提供的MSS值的最小值确定为这次连接的最大MSS值。 MSS为1460是由1500-20(IP头)-20(TCP头)计算出的。 实际场景下,TCP包头中会带有12字节的选项----时间戳。 这样,单个TCP包实际传输的最大量就缩减为1448字节。1448=1500-20(IP头)-32(20字节TCP头和12字节TCP选项时间戳)

简单公式:

(IP头 + TCP头 + 时间戳) + MSS = MTU

参考图

5. 文章推荐

www.imperva.com/blog/mtu-ms…

本文大部分来源于网络上的零碎知识, 因水平有限可能理解有误, 望指证.