ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 最大传输单元(Maximum Transmission Unit, MTU) 数据链路层传输的帧大小是有限制的,不能把一个太大的包直接塞给链路层,这个限制被称为「最大传输单元(Maximum Transmission Unit, MTU)」 下图是以太网的帧格式,以太网的帧最小的帧是 64 字节,除去 14 字节头部和 4 字节 CRC 字段,有效荷载最小为 46 字节。最大的帧是 1518 字节,除去 14 字节头部和 4 字节 CRC,有效荷载最大为 1500,这个值就是以太网的 MTU。因此如果传输 100KB 的数据,至少需要 (100 \* 1024 / 1500) = 69 个以太网帧。 ![](https://img.kancloud.cn/90/1f/901f503035fe8600bdd6bbdf81ca8e67_1734x438.png) 不同的数据链路层的 MTU 是不同的。通过`netstat -i`可以查看网卡的 mtu ## IP 分段 Pv4 数据报的最大大小为 65535 字节,这已经远远超过了以太网的 MTU,而且有些网络还会开启巨帧(Jumbo Frame)能达到 9000 字节。 当一个 IP 数据包大于 MTU 时,IP 会把数据报文进行切割为多个小的片段(小于 MTU),使得这些小的报文可以通过链路层进行传输 IP 头部中有一个表示分片偏移量的字段,用来表示该分段在原始数据报文中的位置,如下图所示 ![](https://img.kancloud.cn/69/0e/690ed6eb423451f1226cbe72fb9431d2_1844x526.png) ## 网络中的木桶效应:路径 MTU 一个包从发送端传输到接收端,中间要跨越很多个网络,每条链路的 MTU 都可能不一样,这个通信过程中最小的 MTU 称为「路径 MTU(Path MTU)」。 路径 MTU 就跟木桶效应是一个道理,木桶的盛水量由最短的那条短板决定,路径 MTU 也是由通信链条中最小的 MTU 决定。 ## TCP 最大段大小(Max Segment Size,MSS) TCP 为了避免被发送方分片,会主动把数据分割成小段再交给网络层,最大的分段大小称之为 MSS(Max Segment Size)。 MSS = MTU - IP header头大小 - TCP 头大小 在以太网中 TCP 的 MSS = 1500(MTU) - 20(IP 头大小) - 20(TCP 头大小)= 1460 当三次握手建立一个 TCP 连接时,通信的双方会在 SYN 报文里说明自己允许的最大段大小。 **TSO(TCP Segment Offload)特性了,TSO 特性**是指由网卡代替 CPU 实现 packet 的分段和合并,节省系统资源,因此 TCP 可以抓到超过 MTU 的包,但是不是真正传输的单个包会超过链路的 MTU。 ## TCP 套接字选项 TCP_MAXSEG TCP 有一个 socket 选项 TCP_MAXSEG,可以用来设置此次连接的 MSS,如果设置了这个选项,则 MSS 不能超过这个值。 ### TCP_MAXSEG 的下界是 88 因为 TCP 头包含了 20 字节的固定长度和 40 字节的可选参数,所以 TCP 头的最大长度是 60,IP 头最大长度也是 60。 为了保证在 TCP 头占满 60 字节、IP 头占满 60 字节的情况下,至少还能发 8 字节的数据,MSS 至少要等于 (MAX_IP_HDR + MAX_TCP_HDR + MIN_IP_FRAG) - (MIN_IP_HDR + MIN_TCP_HDR) = (60+60+8) - (20+20) = 88 字节。