三层网络设备对于IP报文的分片和重组处理原理

对于网络分片,我一年前就想整理出来,虽然说网络上的资料很多,但是真正掌握精髓的除非真正做过分片程序,不然很难将协议栈整体联系起来理解。这篇文章,包括设计分片原理图,耗时一小时完成,算是记录一点理解。

三层网络设备,即能够基于IP头信息对报文进行识别和处理的网络设备,在转发IP报文的时候,经常会遇到来自上层的数据包过长,从而导致打上MAC头的帧不符合IEEE802.3标准规定的最大帧长,造成不能被转发和对端解析的问题。这样就需要在三层进行分片,将过长的IP报文拆分成小的数据块,一般规定最大的IP报文(IP头+数据)长度应该在46~1500范围内,这样,加上MAC头的14个字节和4个字节的校验,就满足以太网帧的最大帧长1518的要求。

那么,如何分片?如图所示,假设,现在有一个总长度为4000字节的IP报文,一个巨帧IP数据包,在经由三层的时候,需要进行分片,将数据包长控制在以太网II规定的帧长范围内,然后进行转发。

如果按照分片长度为1000字节来计算,那么3980个字节的IP数据包的数据部分可分成4个分片,分别用A,B,C和D表示。很明显,最后一个分片的数据部分长度则是减去前三个1000bytes的分片后,剩下的数据包的长度—980。

按照固定头长度20字节计算,每个分片都将拷贝源IP报文的IP头部信息,作为IP头加在分片前面,同时需要修改由分片组成的新的IP报文的头部信息。如果源IP报文的头部标识符域=15000,该值标志从主机三层下发的IP Packet的编号。分片的标识符域同样是15000,在新的IP头中,需要修改的是分片标志位和offset位。

1 MF:更多分片
2 DF:不分片
3 Offset:该分片数据部分开始位置在原IP报文数据部分的偏移,单位是8bytes。
1 对于第一个分片A来说,Offset=0表示是原IP数据包的第一个分片,MF=1,则说明后面还有分片报文;
2 对于第二个分片B来说,Offset=125=(1000/8),计算出第二个分片的数据部分距离原IP数据包的数据部分起始位置的偏移,同时MF=1说明后面还有分片;
3 …..
4 最后一个分片D中,计算出Offset后,写入新的IP头,然后将MF=0,表示对于编号为15000的IP数据包的分片就此结束,后面不再跟分片。

这样一个过程,就实现了IP报文的分片操作。对对端的三层来说,收到MF=1的报文后,就知道该报文是某一个IP报文的分片,需要进行分片重组操作。重组时,从该分片的头中提取整个报文的长度(该长度就是3980),同时提取Offset域,计算该分片数据部分在整个IP报文数据部分的位置,填充,并继续接收后续分片(分片属同一个IP报文的依据是地址信息和报文编号),直到收到一个类似分片的MF=0的报文时,预示着分片结束,与之前重组的报文完成重组之后,交给四层处理。

问题:如果上述报文在分片的时候,最后一个分片的数据部分长度小于26字节,即加上固定IP头的20字节,再加上以太网头的14个字节,再加上校验的4个字节后,最终的分片组成的IP报文总长度小于以太网规定的64字节的最小长度的时候,会怎么办?

转自:Tsihang 三层网络设备对于IP报文的分片和重组处理原理的更多相关文章

  1. IP报文头详解

    IPv4报头: 报头长度:20-60字节bytes 白色部分为固定头部部分(20 bytes),绿色option选项部分为可选部分. 固定头部大小计算: 4bit + 4bit + 8bit + 16 ...

  2. Tcp/ip 报文解析

    在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...

  3. Linux中处理需要传输的IP报文流程

    本文主要讲解了Linux中处理需要传输的IP报文流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linux中处理需要传输的IP报文流程进行了讲解,希望可以对 ...

  4. 【转】TCP/IP报文格式

    1.IP报文格式 IP协议是TCP/IP协议族中最为核心的协议.它提供不可靠.无连接的服务,也即依赖其他层的协议进行差错控制.在局域网环境,IP协议往往被封装在以太网帧(见本章1.3节)中传送.而所有 ...

  5. 网络层——IP报文头介绍

    IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节.  ...

  6. 【转】以太网帧、IP报文格式

    原文:https://www.cnblogs.com/yongren1zu/p/6274460.html https://blog.csdn.net/gufachongyang02/article/d ...

  7. 以太网帧、IP报文格式

    这几天完成一个对比以太网帧的程序(c语言),老师给了以太网帧头部和IP报文头部的结构体,跟实际抓取到的数据包的格式是相同的. 以太网帧头部的数据结构: typedef struct { unsigne ...

  8. 【转】IP报文格式详解

    下图为常见的IP报文格式表: 上面是IP的报文格式,接下来我们先说明各个字段的意义.然后,用Etheral软件转包分析IP的报文格式. 1.版本:ip报文中,版本占了4位,用来表示该协议采用的是那一个 ...

  9. IP报文解析及基于IP 数据包的洪水攻击

    版本(4bit) 报头长度(4bit) 优先级和服务类型(8bit) 总长度(16bit) 标识(16bit) 标志(3bit) 分段偏移(13bit) 存活期(8bit) 协议(8bit) 报头校验 ...

随机推荐

  1. 解决安装 Visual Studio 2012 后无法连接VPN的问题

    1. 单击“开始”,单击“运行”,键入“regedit”,然后单击“确定” 2. 找到下面的注册表子项,然后单击它: HKEY_LOCAL_MACHINE\System\CurrentControlS ...

  2. City Tour

    Description Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B.不过Alice很讨厌坐火车,火车上人比 ...

  3. Codeforces Round #299 (Div. 1)C. Tavas and Pashmaks (凸壳)

    C. Tavas and Pashmaks   Tavas is a cheerleader in the new sports competition named "Pashmaks&qu ...

  4. UVa 116: Undirectional TSP

    简单动态规划题.用取模实现第一行与最后一行连续,注意取字典序即可. 我的解题代码如下: #include <iostream> #include <cstdio> #inclu ...

  5. hdu 4277 USACO ORZ(dfs+剪枝)

    Problem Description Like everyone, cows enjoy variety. Their current fancy is new shapes for pasture ...

  6. jquery 让指定导航隐藏

    $(function(){ var aLink=$('.nav-content .nav li a'); // 选中所有a var aText=['星网服务','在线搭配','星网学院','推客联盟' ...

  7. phpstorm xdebug调试设置样式

    由于本人比较喜欢白底的phpstorm开发环境,所以XDEBUG断点调试,F8时默认是没有背景色的,phpstorm中的设置方式如下 files -> settings -> Editor ...

  8. UNIX时间与本地时间的转换

    所谓UNIX时间,维基百科的解释:UNIX时间,或称POSIX时间是UNIX或类UNIX系统使用的时间表示方式:从协调世界时1970年1月1日0时0分0秒起至现在的总秒数,不包括闰秒 知道了是什么,就 ...

  9. Xcode7真机测试

    根据这个网址上的步骤能够完成真机测试,我已经试过了,还不错 http://www.bubuko.com/infodetail-1061938.html

  10. android学习笔记---63-PopupWindow,泡泡窗口的实现

    转载http://blog.csdn.net/lidew521/article/details/8976627 PopupWindow是一个可以显示在当前Activity之上的浮动容器,PopupWi ...