在互联网协议(IP)中,分片报文是一个重要的概念。当数据包过大时,为了确保其在网络中能够顺利地从发送端传输到接收端,IP协议允许程序将数据包拆分成更小的片段。这些片段称为IP分片报文。
Internet路径连接源节点和目的节点。一条网络路径可能包含链路和路由器。如果一条路径包含多个链路,则这些链路按顺序连接,路由器将每个链路连接到下一个链路上。Internet路径是动态的。假设从一个节点到另一个节点的路径包含一组链路和路由器。如果一个链路或路由器出现故障,路径也可以改变,使它包含一组不同的链路和路由器。 每条链路都受到单个IP报文能传输的字节数的限制。这个约束称为链路最大传输单元(MTU, link Maximum Transmission Unit)。同样,每个Internet路径也受到单个IP报文所能传输的字节数的限制。这个约束被称为路径MTU (PMTU)。对于任意给定的路径,PMTU等于其链路mtu中的最小值。 当上层协议向底层的IP模块提交数据时,如果得到的IP报文长度大于PMTU,则将报文划分为多个分片。每个分片包括一个IP首部和原始报文的一部分。
1. 分片的生成:发送端根据PMTU的大小将原始报文的IP协议载荷部分拆分成多个较小的片段,将每个片段都封装成一个数据包。每个数据包都包含原始报文的一部分数据和源IP地址、目标IP地址、分片偏移量等信息,分片偏移量用于指示该片段的顺序、长度等信息。 2. 分片的传输:发送端将生成的分片报文逐个发送到网络中。 3. 分片的重组:接收端根据报文的源IP、目的IP、IP标识将接收到的分片报文归为不同原始IP报文的分片报文;分片标志中的MF位(More Fragment)标识了该报文是否是最后一个分片报文,如果是最后一个分片报文,则根据分片偏移量计算出各个分片报文数据部分在原始IP数据报中的位置,重组为分片前的原始IP报文。如果不是最后一个分片报文,则等待最后一个分片报文达到后进行重组。
1. 分片带来了性能消耗 分片和重组会消耗发送方、接收方一定的CPU、内存等资源,如果存在大量的分片报文的话,可能会造成较为严重的资源消耗; 分片对接收方内存资源的消耗较多,因为接收方要为接收到的每个分片报文分配内存空间,以便于等待最后一个分片报文到达后完成重组。 2. 分片被中间节点丢失 首片分片报文包含原始报文的四层信息,而其他分片报文不包含,这可能导致分片报文在传输过程中被中间设备因为基于策略的路由而转发到错误的节点而丢弃,还可能被路径上的NAT设备、无状态防火墙等设备丢弃。这会导致接收方收不到齐全的分片报文,进而重组失败。 3. 分片攻击 黑客构造的分片报文,但是不向接收方发送最后一个分片报文,导致接收方要为所有的分片报文分配内存空间,可由于最后一个分片报文永远不会达到,接收方的内存得不到及时的释放(接收方会启动一个分片重组的定时器,在一定时间内如果无法完成重组,将向发送方发送ICMP重组超时差错报文),只要这种攻击的分片报文发送的足够多、足够快,很容易占满接收方的内存,让接收方无内存资源处理正常的业务,从而达到DOS的攻击效果。 4. 安全隐患 由于分片只有第一个分片报文具有四层信息而其他分片没有,这给路由器、防火墙等中间设备在做访问控制策略匹配的时候带来了麻烦。如果路由器、防火墙等中间设备不对分片报文进行安全策略的匹配检测而直接放行IP分片报文,则有可能给接收方带来安全隐患和威胁,因为黑客可以利用这个特性,绕过路由器、防火墙的安全策略检查对接收方实施攻击;如果路由器、防火墙等中间设备对这些分片报文进行重组后再匹配其安全策略,那么又会对这些中间设备的资源带来极大的消耗,特别是在遇到分片攻击的时候,这些中间设备的所有内存资源会在第一时间被消耗完,导致设备程序运行异常,进而可能导致全网中断的严重后果。 5. 高数据速率下的IPv4重组错误 在当今互联网的某些条件下,IPv4分片机制还不够健壮。在高速率下,16位的IP标识字段不足以防止重复的id,从而导致频繁错误组装IP分片,而TCP和UDP的校验和也不足以防止由此产生的损坏的数据报被发送到上层协议。
1. 传送层解决方案 应用程序向TCP提交数据流。TCP将该数据流划分为段,没有段超过TCP最大段大小(MSS)。每个段被封装在一个TCP首部中,并提交给底层的IP模块。底层的IP模块前置一个IP首部,并转发得到的报文。如果TCP MSS足够小,那么底层IP模块决不会产生长度大于实际PMTU的报文。因此,不需要IP分片。 2. 应用层解决方案 应用程序不应该发送导致IP报文超过到达目的地路径上的最大传输单元的UDP数据报。因此,应用程序应该使用IP层提供的路径MTU信息,或者实现PMTUD (path MTU Discovery,路径MTU发现)本身,以确定到达目的地的路径是否支持其所需的消息大小而不产生分片。
相关阅读:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。