Skip to content

数据包大小对网络的影响

最大传输单元(Maximum Transmission Unit, MTU)

  • MTU:数据链路层传输的帧的最大字节

下图是以太网的帧格式,以太网的帧最小的帧是 64 字节,除去 14 字节头部和 4 字节 CRC 字段,有效荷载最小为 46 字节。最大的帧是 1518 字节,除去 14 字节头部和 4 字节 CRC,有效荷载最大为 1500,这个值就是以太网的 MTU。因此如果传输 100KB 的数据,至少需要 (100 * 1024 / 1500) = 69 个以太网帧。

以太网的帧格式

不同的数据链路层的 MTU 是不同的。通过netstat -i 可以查看网卡的 mtu。(lo是localhost)

(base) root slt (master) # netstat -i
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0      1500  1540408      0      0 0       1026255      0      0      0 BMRU
lo       65536   869483      0      0 0        869483      0      0      0 LRU

IP分段

IPv4 数据报的最大大小为 65535 字节,这已经远远超过了以太网的 MTU,需要分段。

IP头部中有个字段是分片偏移量(Fragment Offset),表示该分段在原始数据报文中的位置。下面通过一个例子来说明分片偏移量

需要明确的几点:

  • ICMP报文本身8个字节
  • ping -s 3000 www.baidu.com的意思是发送3000字节。加上ICMP的8字节,一共是3008字节
  • IP首部的固定字节时20,加上每个分片包的1480,一共1500

所以我们会看到三个包

抓包ping-s3000

前两个包Flags里面More fragments: Set表示是这个包是 IP 分段包的一部分,还有其它的分片包。第三个包是More fragments: Not set。表示是最后一个分片了

三个包的Fragment offset分别是0, 1480和2960。

ip三次分包

有一种网络攻击方式IP fragment attack,就是一直发More fragments = 1的包,导致对方的内存耗尽。

网络中的木桶效应:路径 MTU

一个网络传输可能涉及多个数据链路层,每层有不同的MTU。其中最小的MTU称为路径MTU(Path MTU)。

因为有 MTU 的存在,TCP 每次发包的大小也限制了。

TCP 最大段大小(Max Segment Size,MSS)

TCP 为了避免被发送方分片,会主动把数据分割成小段再交给网络层,最大的分段大小称之为 MSS(Max Segment Size)。使得一个 MSS 的数据恰好能装进一个 MTU 而不用分片。

MSS = MTU - IP header头大小 - TCP 头大小

以太网中 TCP 的 MSS = 1500(MTU) - 20(IP 头大小) - 20(TCP 头大小)= 1460。如下图

以太网中的mss