在网络通信中,MSS、MTU、Len 和 TSO 是与数据包传输相关的关键概念。以下是对这些概念的详细解释和它们之间的关系。
1. MSS(Maximum Segment Size)
1.1 定义
MSS 是 TCP 协议中的一个参数,表示 TCP 数据段中可以携带的最大数据量(不包括 TCP 头部和 IP 头部)。
在 TCP 三次握手时,客户端和服务端会协商 MSS 值,以确保数据包不会超过网络路径的 MTU。
1.2 作用
限制数据包大小:MSS 用于限制每个 TCP 数据段的最大数据长度,避免数据包过大导致 IP 分片。
优化传输效率:通过合理设置 MSS,可以提高传输效率,减少网络开销。
1.3 计算
MSS = MTU - IP 头部大小 - TCP 头部大小
例如,以太网的 MTU 通常为 1500 字节,IP 头部为 20 字节,TCP 头部为 20 字节,因此 MSS = 1500 - 20 - 20 = 1460 字节。
2. MTU(Maximum Transmission Unit)
2.1 定义
MTU 是网络层(IP 层)的参数,表示数据包的最大长度(包括 IP 头部和数据)。
MTU 决定了数据包在网络中传输时的最大大小。
2.2 作用
避免 IP 分片:如果数据包大小超过 MTU,IP 层会进行分片,这会增加网络开销并降低传输效率。
优化网络性能:通过合理设置 MTU,可以避免分片,提高网络传输效率。
2.3 常见 MTU 值
以太网:1500 字节。
PPPoE:1492 字节。
VPN:通常小于 1500 字节,具体取决于 VPN 协议。
3. Len(Length)
3.1 定义
Len 表示数据包的实际数据长度(不包括头部)。
在 TCP 数据包中,Len 是 TCP 数据段中实际携带的数据量。
3.2 作用
数据包大小:Len 用于表示数据包的实际大小,帮助接收方正确处理数据。
传输效率:通过合理控制 Len,可以优化数据传输效率。
3.3 与 MSS 的关系
Len <= MSS:在正常情况下,Len 不会超过 MSS。
Len > MSS:如果 Len 超过 MSS,TCP 会自动将数据分片为多个数据包。
4. TSO(TCP Segmentation Offload)
4.1 定义
TSO 是一种网络优化技术,允许网卡硬件对大数据包进行分片,而不是由操作系统内核完成。
TSO 将大数据包的分割任务从 CPU 转移到网卡,从而减轻 CPU 的负担,提高网络传输效率。
4.2 作用
减少 CPU 开销:通过将分片任务交给网卡,TSO 可以显著减少 CPU 的负担。
提高传输效率:TSO 可以提高网络传输效率,特别是在高带宽和低延迟的网络环境中。
4.3 与 MSS 的关系
TSO 与 MSS 的关系:
TSO 允许发送大于 MSS 的数据包,网卡会自动将数据包分片为多个 MSS 大小的数据包。
例如,如果 TSO 启用,操作系统可以发送一个 64KB 的数据包,网卡会将其分片为多个 1460 字节的 TCP 数据段。
4.4 启用 TSO
在 Linux 系统中,可以通过以下命令检查和启用 TSO:
ethtool -k eth0 | grep tcp-segmentation-offload
ethtool -K eth0 tso on
5. MSS、MTU、Len 和 TSO 的关系
5.1 MSS 与 MTU 的关系
MSS = MTU - IP 头部大小 - TCP 头部大小
例如,以太网的 MTU 为 1500 字节,MSS = 1500 - 20 - 20 = 1460 字节。
5.2 Len 与 MSS 的关系
Len <= MSS:在正常情况下,Len 不会超过 MSS。
Len > MSS:如果 Len 超过 MSS,TCP 会自动将数据分片为多个数据包。
5.3 TSO 与 MSS 的关系
TSO 允许发送大于 MSS 的数据包:
例如,如果 TSO 启用,操作系统可以发送一个 64KB 的数据包,网卡会将其分片为多个 1460 字节的 TCP 数据段。
5.4 TSO 与 MTU 的关系
TSO 不影响 MTU:
TSO 只是将分片任务从 CPU 转移到网卡,不会改变 MTU 的值。
网卡仍然会根据 MTU 对数据包进行分片。
6. 总结
MSS:TCP 数据段中可以携带的最大数据量(不包括 TCP 头部和 IP 头部)。
MTU:数据包的最大长度(包括 IP 头部和数据),用于避免 IP 分片。
Len:数据包的实际数据长度(不包括头部)。
TSO:一种网络优化技术,允许网卡对大数据包进行分片,减轻 CPU 的负担。
关系:
MSS = MTU - IP 头部大小 - TCP 头部大小。
Len <= MSS,如果 Len > MSS,TCP 会自动分片。
TSO 允许发送大于 MSS 的数据包,网卡会自动分片。
巨帧:
巨帧是指 MTU 大于 1500 字节的数据包。
常见的巨帧 MTU 值为 9000 字节,但也可以根据需求设置为其他值(如 4000、8000 等)。
作用:
减少数据包的数量,从而减少网络开销(如减少帧头和校验的开销)。
提高大文件传输的效率,特别是在高带宽和低延迟的网络环境中。
配置方法:
Linux:
修改网络接口的 MTU 值:
ifconfig eth0 mtu 9000
或者使用 ip 命令:
ip link set dev eth0 mtu 9000
巨帧需要系统网卡和交换机的支持
ethtool -g eth0
输出示例:
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 8192
TX: 4096
Current hardware settings:
RX: 512
RX Mini: 0
RX Jumbo: 0
TX: 512
RX Jumbo:如果 RX Jumbo 的值大于 0,说明网卡支持巨帧。
启用巨帧的接收和发送
方法:
使用 ethtool 启用巨帧的接收和发送。
命令:
ethtool -G eth0 rx 8192 tx 8192
测试命令:
ping -M do -s 8972 <destination_ip>
-M do:禁止分片。
-s 8972:发送 8972 字节的数据(加上 28 字节的 IP 和 ICMP 头部,总大小为 9000 字节)。
检测网卡TSO:
命令:
ethtool -k eth0
输出示例:
Features for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off
tcp-segmentation-offload:如果显示为 on,表示 TSO 已启用;如果显示为 off,表示 TSO 未启用。
scatter-gather:如果显示为 on,表示网卡支持 TSO 所需的分散-聚集(Scatter-Gather)功能。
开启TSO:
使用 ethtool 命令开启 TSO
ethtool -K eth0 tso on
验证:
使用 ethtool -k eth0 检查 TSO 是否已启用:
ethtool -k eth0
修改网络接口配置文件(可选)
方法:
如果希望在系统重启后保持 TSO 的配置,可以修改网络接口的配置文件。
步骤:
编辑网络接口的配置文件(如 /etc/sysconfig/network-scripts/ifcfg-eth0),添加以下内容:
ETHTOOL_OPTS="tso on"
示例:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
ETHTOOL_OPTS="tso on"
重启网络服务:
systemctl restart network
抓包时,TCP建立连接之初告知服务端MSS为1460,而后续数据包Len却是2920,就是因为网卡支持TSO