Warning: Can only detect less than 5000 characters
在本报告中,我想重新审视IPv6碎片包的数据包丢失的测量,并查看图片是否在中介四年内发生了变化。
这次发生了很多事情。具有IPv6功能的用户数量显着,从2017年4月2020年到1.1B的IPv6的用户,从估计的300M IPv6的用户从估计的300M IPv6的用户中程度上升。不仅具有用户群地址,可以部署IPv6能力的网络基础设施以可比的方式扩展。这里的问题是,今天的IPv6基础架构是否显示了与我们在2017年看到的碎片标题的数据包丢失的相同问题?或者,情况有所改善吗?
对于此测量,我们正在使用Google的在线广告框架来注册最终主机来进行测量实验。这意味着我们必须在最终主机中使用的必然限制reptoIrees,即仅限于我们可以包含在Web对象的脚本检索中的技术中。此测量的唯一端到端组件是用于检索Web对象的HTTPS会话。为了测量碎片影响,我们需要将从服务器发送的TCP数据包进行分段,以朝向最终主机发送。
这里使用的方法是将传统的Web服务器设置为后端服务,并根据需要设置前端,该前端在出站分组上执行分组碎片。为此,我们将在Linux服务器平台上使用原始套接字接口,并绕过前端系统上的所有正常内核和NIC卡数据包处理步骤。
为了允许最大的灵活性,使用IPv6网络地址转换构建该前端。这允许在单独的平台上配置两个组件(Web服务器和出站数据包“),允许更大的可扩展性。在前端服务器上寻址到TCP端口80或端口443的传入IPv6报文具有其IPv6和TCP标题,因为它们已传递给后端Web服务器。翻译的数据包的源地址是前端服务器的IPv6地址,目标地址是后端Web服务器的地址,以及用作源端口的本地选定的端口号。此端口号是转换器的活动连接表中的查找密钥,因此从寻址到此前端的后端接收的数据包可以将其地址和端口值转换回原始远程端点的数据包。
除了此IPv6 NAT功能外,前端还执行数据包碎片。所有TCP数据包都通过后端单元朝向互联网上包含大于1200个八位字节的TCP有效载荷。初始碎片分组的大小是从范围1,200到1,416八位字节的随机选择,IPv6中的碎片控制将初始片段的有效载荷大小限制为8个八位字节的倍数,因此这里使用的IPv6数据包大小为1,200,1208,1216等等到1,416个八位字节。
不幸的是,今天的Linux平台有很多方面,不要让这很容易。我们不能在此前端使用常规的TCP套接字连接,因为我们依赖于数据包级接口来执行数据包标题的必要处理。
Berkley数据包过滤器(BPF)驱动程序和相关的Libpcap例程允许我们在此“原始”数据包级别的前端过程中将所有传入数据包拉到前端过程中的必要灵活性,但它不像它声音一样容易。许多操作系统响应传入的TCP报文,该数据包被寻址到没有带有TCP复位(RST)数据包的关联活动侦听器的端口号。这必须关闭。此外,许多物理接口卡现在是“智能”的接口,而不是将BPF驱动程序发送到电线上收到的数据包,而是可以将多个连续数据包加入并呈现作为连接的合成TCP数据包这些连续数据包。同样,需要禁用这些功能。 BPF驱动程序没有内部缓冲区,因此需要从BPF驱动程序接收数据包的处理系统来处理数据包在最小分组到达时间内。我们的解决方案是使用Linux共享内存服务来在执行分组到达处理步骤和NAT和碎片分组处理步骤之间的进程之间实现缓冲器,将处理时间预算扩展到越近于分组间到达时间的时间。
IPv6规范要求所有网络路径都能够传递最多1,280个字节的IPv6数据包,而无需要分组碎片。它未能指定的是最终主机可以接收的最小碎片数据包大小。看来我们几乎可以分段几乎任何数据包,无论其大小如何,这意味着我们可以将小型数据包和大型分段。方便地,在接收器上,TCP堆栈应不知道可能发生的任何分组碎片。数据包碎片和重组是IP层函数,TCP是一个字节流协议。这意味着我们的NAT单元可以根据需要执行分组碎片和TCP重新排序,并且这些数据包变换将是远程TCP进程的不可见。
此NAT前端的功能可以在几个规则中描述:对于从Internet接收的TCP报文,如果存在映射表,以将数据包中的源地址,源端口和目标端口的三元组映射到本地端口值,然后用本地主机源地址替换数据包的源地址,用背面的目标地址替换,用本地端口地址替换源端口并将数据包发送到后端。如果不存在翻译表,并且数据包包含TCP SYN标志,请拍摄最旧的翻译表条目并重新使用本地端口值。否则删除数据包。
对于从后端接收的TCP数据包,处理类似。源和目标端口号用于查找翻译表。如果找到了翻译表条目,则将数据包的目标地址和目标端口替换为包含在此条目中的那些,并且源地址将替换为本地地址。如果分组长度大于碎片阈值,则分组被分解为多个出站TCP分组,并且从可能的一组初始分组大小随机选择初始片段大小。
随后的数据分析检测到最终主机是否已通过查看前端的数据包捕获日志来接收并成功地重新组装了一组片段。如果此TCP会话的传入TCP ACK编号具有包含序列号的ACK序列号,则我们有证据表明远端已成功重新组装碎片数据包。
在查看结果之前,询问此实验是否代表互联网通常遇到的“真实”情景可能是有用的。
它当然是在TCP上IPv6中的情况,我们不希望看到数据包碎片。 TCP发件人应确保所有出站TCP段都适用于本地接口MSS大小,因此在没有网络路径的情况下,发件人在发送之前,发件人不应是分段出站TCP报文。
路径MTU小于本地接口MTU的情况如何?当数据包遇到网络路径的下一跳,其中数据包大于下一跳MTU,那么IPv6路由器构造了ICMPv6数据包太大的消息,注意到下一跳的大小,并且还包括原始数据包标题作为有效载荷这个ICMPv6消息。它将此ICMPv6诊断消息发送回原始发件人并丢弃原始数据包。当发送主机收到此ICMPv6消息时,它也具有TCP数据包标题。此信息可用于查找此会话的TCP控制条目,并且可以使用新值更新此TCP会话的出站MSS值。除了更新的大小信息外,ICMPv6消息有效负载中的TCP标题还包含丢失数据包的序列号。发送TCP进程可以将ICMPv6消息解释为丢失数据的隐式NACK,并使用更新的MSS大小重新发送丢弃的数据。同样,不需要分组碎片。
所有这些都听起来像一个“层违规”的公然案例,我们应该在警察局致电!但是在我们这样做之前,也许我们应该考虑主机没有将数据包传递给TCP控制块的错误情况。
这类似于ICMPv6数据包过大消息的情况根本没有传递给主机,例如,某些无核网络过滤中间件过滤掉所有ICMPv6消息。
在这种情况下,发送TCP会话已发送TCP段,并等待接收ACK。接收器不会获得此数据包,因此无法确认它。发件人可能有一个重传计时器,它可能会尝试重新发送违规的大数据包,但这也会丢失,因此它永远不会得到Ack。
这导致楔形的TCP状态或“路径MTU黑洞”条件。
隐藏ICMPv6数据包从TCP控制器的太大消息,无论是主机内的本地处理规则还是因为某些网络元素决定放弃它们,都是无限的有害的!
从这种意义上讲,我们构建了一些“虚幻”的实验,我们不应该指望批判性地依赖于TCP中遇到与我们这里设置的网络相同网络的数据包碎片的正确工作的应用程序。
另一方面,碎片是一种IP函数,而不是由端到端传输协议执行的函数,以及主机可以接收碎片的UDP数据包的问题基本上是同一问题,以及主机是否可以接收分散的TCP包,至少从主体本身的角度来看。在这两种情况下,真正的问题是主机上的IPv6进程是否可以接收碎片的IPv6数据包。
总之,虽然实验本身使用基本上是一个技巧的条件,但结果,即在将碎片的IPv6分组到结束主机传递碎片的IPv6分组时发生IPv6延伸标题下降的程度,仍然是有用和信息性的结果。
底线答案是IPv6碎片数据包的当前平均下降率为6%。显然,这在相对较短的时间内是相当大的改进。
IPv6网络和地理区域跨越各种各样的变化。图2显示了各个区域的平均下降率。
我们可以将损失率映射到地理,并建立一个经济平均损失率的世界地图。该地图如图3所示。在这种情况下,地图认为所有损耗率大于10%的损失率,因为不期望和使用红色,并且当国家平均损失率更接近0%时,朝向绿色的颜色键控变化。这并没有考虑每个经济中的IPv6用户的数量,但只需查看分散的丢包率。这有一些惊喜,其中一个较大的国家IPv6部署是印度,这对于较大的ISP(2%以下)具有非常低的损失率。该地区的其他主要IPv6部署在中国,这里的平均损失率约为20%。同样,这里有一些变化,其中一个较大的提供商是AS4808,损失率为60%,其他一些较大的提供者显示出20%至30%的损失率,而其他提供者则不超过10%。图3中的地图的部分没有彩色的IPv6样品不足以进行测量,这通常适用于非洲和中亚。
在每个国家背景中的各种IPv6服务提供商中也存在相当大的方差。例如,加拿大AS852中的用户在AS852中经历了超过80%的IPv6碎片降价,而在AS812的用户也在加拿大,体验低于8%的跌落率。
处理碎片包分组的能力的变化可能与各种网络中使用的IPv6转换技术有关,但在该测量练习的范围内,我们没有直接了解哪种网络过渡技术,所以我们是无法证实或与这种假设相矛盾。
我们有兴趣了解碎片损失是否与某种形式的数据包大小约束相关。如果是这种情况,那么我们将观察到更大的碎片可能比较小的碎片更高的损失概率。如果问题围绕使用碎片扩展标题或碎片本身,则丢失率在数据包大小范围内都是相同的。我们在28个不同的碎片包装尺寸下测量了碎片损失,在1,200个八位赛中,1,208,1,216,......等速度到1,416个八位字节。抗包尺寸的损失率的曲线图如图4所示。
数据显示尺寸为1,360个八位字节的丢失率的损失率明显上升,升高到1,408个八位字节的峰值。我们没有解释为什么尺寸1,416个八位字节的数据包的测量非常低,但我们怀疑这是实验配置的艺术品。较大数据包的损失率的上升本身就很好奇。我们在大多数区域数据中没有看到相同的模式,这种模式在亚洲只是显而易见。在此数据中,IPv6在亚洲最普遍,其中约60%的测量点来自亚洲(特别是印度和中国),因此在亚洲观察到的数据模式(图5)在全球数据中可见并不令人惊讶出色地。
相比之下,图6显示了南美的损耗分布,其中各种包尺寸的损耗分布更均匀。
为什么我们看到碎片的IPv6数据包的下降费率?这里播放有许多潜在因素:防火墙通常被配置为丢弃碎片。问题是尾随片段不包含传输报头,并且无法将传统的基于端口的过滤规则应用于此类片段。无论是防火墙有
......