本文共 4516 字,大约阅读时间需要 15 分钟。
Maximum Transmission Unit,最大传输单元,指的是数据链路层的最大payload,由硬件网卡设置MTU,是一个硬性限制
TCP 的一个数据报不可能无限大,还是受制于 MTU,TCP 单个数据报的最大消息长度,称为 MSS。
TCP 在建立连接的过程中,双方会进行 MSS 协商。最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度受限于数据链路层的 MTU)。双方在发送 SYN 的时候会在 TCP 的头部写入字节能支持的 MSS 值,然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS,MMS 的值就在 TCP 首部的 40 字节变长选项中(kind=2)。MTU 通过限制 MSS(单个数据报的最大消息长度) 的取值,来限制单个 TCP 包的长度MSS: Maxitum Segment Size 最大分段大小,为 TCP 数据包每次传输的最大数据分段大小。
为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。我们在用Socket编程时,UDP协议要求包小于64K。TCP没有限定,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。
UDP数据报的长度是指包括报头和数据部分在内的总字节数,其中报头长度固定,数据部分可变。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节(64K)。ping 10.164.16.54 -s 1472 # 不分片 (以太包长度 1514 = IP头(20)+ ICMP(1480=类型(1)+ 代码(1))+ 校验和(2)+标识符(2)+序号(2)+ 1472)20:44:13.538154 08:00:27:27:50:1c > 08:00:27:3b:d9:78, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 35178, offset 0, flags [DF], proto ICMP (1), length 1500) 10.164.16.57 > 10.164.16.54: ICMP echo request, id 1419, seq 1, length 148020:44:13.538244 08:00:27:3b:d9:78 > 08:00:27:27:50:1c, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 58010, offset 0, flags [none], proto ICMP (1), length 1500) 10.164.16.54 > 10.164.16.57: ICMP echo reply, id 1419, seq 1, length 1480
ping 10.164.16.54 -s 1500# icmp 的payload=1500 (两个包 : (第一个包:以太包长度1514,IP包长度1500,ICMP payload:1472) +,第二个包:以太包长度:62,IP包长:48,ICMP payload:28 )20:06:09.820790 08:00:27:27:50:1c > 08:00:27:3b:d9:78, ethertype IPv4 (0x0800), length 1514: (tos 0x0, ttl 64, id 38220, offset 0, flags [+], proto ICMP (1), length 1500) 10.164.16.57 > 10.164.16.54: ICMP echo request, id 16849, seq 4, length 148020:06:09.820809 08:00:27:27:50:1c > 08:00:27:3b:d9:78, ethertype IPv4 (0x0800), length 62: (tos 0x0, ttl 64, id 38220, offset 1480, flags [none], proto ICMP (1), length 48) 10.164.16.57 > 10.164.16.54: ip-proto-1
路径 MTU
。路径 MTU 发现机制:
/etc/neutron/neutron.conf:12:global_physnet_mtu = 1550/etc/neutron/plugins/ml2/ml2_conf.ini:11:path_mtu = 1550/etc/neutron/plugins/ml2/ml2_conf.ini:12:physical_network_mtus = physnet1:1500,physnet2:1500/etc/neutron/plugins/ml2/ml2_conf.ini:16:flat_networks = physnet1/etc/neutron/plugins/ml2/ml2_conf.ini:18:network_vlan_ranges = physnet1:100:1000,physnet2:100:1000
global_physnet_mtu
,底层物理网络的MTU。Neutron使用这个值来计算所有虚拟网络组件的MTU。对于flat网络和VLAN网络,neutron直接使用这个值而不作修改。对于VXLAN等overlay网络,neutron会自动从这个值中减去 overlay 协议的开销(比如 )。默认为1500,这是以太网的标准值。 # Default network MTU value when not configuredDEFAULT_NETWORK_MTU = 1500
physical_network_mtus
,物理网络与MTU值的映射列表。映射的格式是<physnet>: <mtu val>
。这种映射允许指定与默认的 global_physnet_mtu
值不同的物理网络 MTU 值。 path_mtu
,在使用 overlay/tunnel 协议时,可以穿越底层物理网络基础设施而不产生碎片的IP数据包的最大尺寸(MTU)。 这个选项允许指定一个与默认的global_physnet_mtu
值不同的物理网络MTU值。(如果配置了该值,计算overlay/tunnel 类型的mtu时以此为准,若未配置,则使用global_physnet_mtu
的值来计算overlay/tunnel 类型的网络的mtu) 转载地址:http://tviti.baihongyu.com/