二、分片触发的 3 种场景 IP 分片由中间路由器或源主机触发,具体取决于是否启用 “路径 MTU 发现(PMTUD)” 机制,主要有以下 3 种场景: 源主机未启用 PMTUD(默认场景)源主机发送数据时 源主机启用 PMTUD(优化场景)PMTUD 是一种避免分片的优化机制:源主机会先发送一个 “带 DF 标志(不分片)” 的探测数据包,若中间某路由器发现其超过本地 MTU,会返回 “ICMP 不可达( 中间路由器强制分片(PMTUD 失效场景)若源主机发送的数据包带 “DF 标志”,但中间路由器发现其超过本地 MTU,且无法通过 PMTUD 获取正确 MTU(如 ICMP 被拦截),路由器会直接丢弃数据包并返回 ) 易触发分片(UDP 无 PMTUD 优化,数据包长度可自定义) 丢包影响 分片丢包会触发 TCP 重传整个原始数据包 分片丢包会导致整个 UDP 数据包失效(无重传) 典型问题 若 PMTUD 失效 合理使用 PMTUD 启用 PMTUD 减少分片(主流操作系统默认启用); 若存在 “MTU 黑洞”(ICMP 被拦截),可在源主机手动设置较小的 MTU(如 1400 字节)。
现代操作系统使用TCP 路径最大传输单元发现(PMTUD) 来自动确定最大的数据包。但是,PMTUD 不适用于用户数据报协议。 另一种方法是手动配置网络上的MTU,以便 IP 分段发生在隧道之外。
现代操作系统使用TCP 路径最大传输单元发现(PMTUD) 来自动确定最大的数据包。但是,PMTUD 不适用于用户数据报协议。 另一种方法是手动配置网络上的MTU,以便 IP 分段发生在隧道之外。
在《解决 GRE 和 IPsec 中的 IPv4 分段、MTU、MSS和PMTUD 问题》文章中纯ipsec隧道下性能损耗预估:Note:当使用 IPv4sec 进行硬件加密时,确实需要避免在封装后进行分段 ipsec案例 案例来源于文章《解决 GRE 和 IPsec 中的 IPv4 分段、MTU、MSS和PMTUD 问题》。 巨人肩膀 1、解决 GRE 和 IPsec 中的 IPv4 分段、MTU、MSS和PMTUD 问题 http://www.360doc.com/content/17/0111/22/32940378_
preload> number of packages while waiting replies -m tag the packets going out -M <pmtud -M <pmtud选项> 定义MTU发现,可以是do、dont、want之一。 -n 不解析DNS名称。 -O 报告未完成的回复。 -p <模式> 设置填充字节的内容。 -q 安静输出。
因此,在实际网络设计中,建议通过路径MTU发现(PMTUD)等机制尽量避免不必要的分片。
received, 0% packet loss, time 2004ms 如果 1472 成功而更大失败,说明 PMTU 正常;如果连 1472 都不通且小包通,怀疑中间设备丢弃“不可分片”ICMP——典型 PMTUD MTU/PMTUD 黑洞 → 统一 MTU 或在边界做 MSS Clamp 1)找出异常路径(大包不通): $ ping -c3 -M do -s 1472 api.example.com # 1500
因此,初始数据包和包含 PATH_CHALLENGES 的数据包应填充到 1200 字节以执行路径最大传输单元发现 (PMTUD),确保路径支持足够大以支持 QUIC 的数据报。 第二个填充验证确保 PMTUD 要求也得到满足。除了填充要求外,还允许服务器在验证地址之前就已经开始向新端点发送数据。如果检查不正确,发送的数据也可能违反反放大限制。 然而,PMTUD 和反放大限制之间的冲突可能会成为一个问题。建议官方按如下方式重新组织和调整 QUIC规范: 1)减少路径验证和握手期间所需决策的数量:例如,路径验证总是可以分两步执行。 第一个数据包将在没有填充的情况下验证路径,而第二个数据包将仅通过包含一个 PADDING 帧来确保 PMTUD 限制。 填充列 (Pad) 列出了服务器是否根据 PMTUD 的要求将包含 PATH_CHALLENGE 的第一个数据包扩大到 1200 字节。观察到执行填充到这个大小的三个开源实现。
因此,应用程序应该使用IP层提供的路径MTU信息,或者实现PMTUD (path MTU Discovery,路径MTU发现)本身,以确定到达目的地的路径是否支持其所需的消息大小而不产生分片。
因此,应用程序应该使用IP层提供的路径MTU信息,或者实现PMTUD (path MTU Discovery,路径MTU发现)本身,以确定到达目的地的路径是否支持其所需的消息大小而不产生分片。
来源于百度百科说明:路径MTU发现(PMTUD),用于确定计算机网络中使用互联网协议(IP)主机间的最大传输单元(MTU)的大小,通常目标是避免IP分片。 PMTUD原定应用在IPv4的路由器上,然而所有现代操作系统都是在终端应用它。在IPv6中,这个方法只应用在终端之间的会话。
路径 MTU 发现 (PMTUD) 用于确定两台设备之间的路径 MTU。如果客户端或目标不支持巨型帧,路径 MTU 发现特别重要。 如果继续丢弃大于客户端或目标接口 MTU 大小的数据包,则可能是路径 MTU 发现 (PMTUD) 不起作用。
在IPv6中,ICMPv6除了提供ICMPv4常用的功能之外,还有其它一些功能,如邻接点发现、无状态地址配置(包括重复地址检测)、PMTUD等。
首先,IPv6要求入网链路至少能传输1280字节的IP包,如果出现不能传输1280字节IP包这种情况,需要链路层自己处理分片和重组的过程;其次,跟IPv4里面PMTUD(Path MTU Discovery )是可选的不同,在IPv6里面,PMTUD是一个非常重要且必须的功能;所以一般情况下发送小于等于1280字节的IP包肯定能到达目的地,加上现在大部分人都用以太网(MTU为1500,包含以太网的包头),绝大部分情况下一个包过去就能确定
一个Packet报文中可以存放多个QUIC Frame,当然所有Frame的长度之和不能大于PMTUD(Path Maximum Transmission Unit Discovery,这是大于1200
解决这个问题有两个方法,第一个办法是PMTUD(路径MTU检测),CPE会去主动地探测WAN路径上的最小MTU,从而更准确地了解WAN的传输参数。