转自:Tsihang 三层网络设备对于IP报文的分片和重组处理原理
三层网络设备对于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报文的分片和重组处理原理的更多相关文章
- IP报文头详解
IPv4报头: 报头长度:20-60字节bytes 白色部分为固定头部部分(20 bytes),绿色option选项部分为可选部分. 固定头部大小计算: 4bit + 4bit + 8bit + 16 ...
- Tcp/ip 报文解析
在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...
- Linux中处理需要传输的IP报文流程
本文主要讲解了Linux中处理需要传输的IP报文流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式对Linux中处理需要传输的IP报文流程进行了讲解,希望可以对 ...
- 【转】TCP/IP报文格式
1.IP报文格式 IP协议是TCP/IP协议族中最为核心的协议.它提供不可靠.无连接的服务,也即依赖其他层的协议进行差错控制.在局域网环境,IP协议往往被封装在以太网帧(见本章1.3节)中传送.而所有 ...
- 网络层——IP报文头介绍
IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节. ...
- 【转】以太网帧、IP报文格式
原文:https://www.cnblogs.com/yongren1zu/p/6274460.html https://blog.csdn.net/gufachongyang02/article/d ...
- 以太网帧、IP报文格式
这几天完成一个对比以太网帧的程序(c语言),老师给了以太网帧头部和IP报文头部的结构体,跟实际抓取到的数据包的格式是相同的. 以太网帧头部的数据结构: typedef struct { unsigne ...
- 【转】IP报文格式详解
下图为常见的IP报文格式表: 上面是IP的报文格式,接下来我们先说明各个字段的意义.然后,用Etheral软件转包分析IP的报文格式. 1.版本:ip报文中,版本占了4位,用来表示该协议采用的是那一个 ...
- IP报文解析及基于IP 数据包的洪水攻击
版本(4bit) 报头长度(4bit) 优先级和服务类型(8bit) 总长度(16bit) 标识(16bit) 标志(3bit) 分段偏移(13bit) 存活期(8bit) 协议(8bit) 报头校验 ...
随机推荐
- laravel和dingoapi的结合使用
dingoapi是一个laravel的开源插件,可以在github上搜索到,现在在做一个项目,项目中总是会有后端跟前端的json数据交互,而这个dingoapi为json交互提供了很大的便利. 先安装 ...
- 使用SQLiteDatabase进行数据库操作的步骤
1.获取SQLiteDatabase对象,它代表了与数据库的连接.2.调用SQLiteDatabase的方法来执行SQL语句.3.操作SQL语句的执行结果,比如用SimpleCursorAdapter ...
- Linux系统编程(33)—— socket编程之TCP程序的错误处理
上一篇的例子不仅功能简单,而且简单到几乎没有什么错误处理,我们知道,系统调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息. 为使错误处理的代码不影 ...
- delphi7调用java写的webservice,在调用的时候弹出“wssecurityhandler:request does not contain required security header”
delphi7调用java编写的webservice问题我用delphi7调用java写的webservice,在调用的时候弹出“wssecurityhandler:request does not ...
- sql server2008如何创建外键
原文地址:http://blog.csdn.net/zuozuo1245/article/details/8644115 以前创建数据库时就是有主键的创建了主键,但是表之间的关系没有联系,要建数据库关 ...
- HDU_2025——查找最大的字母
Problem Description 对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”. Input 输入数据包括多个测试实例,每个实例由一行长度不超过100的字符 ...
- 【转】C++动态创建二维数组,二维数组指针
原作者博客:蒋国宝的IT技术博客 今天完成一道题目需要自己用指针创建一个二维的数组,不得不承认指针的确是恶心. int **result; ; ; result = new int*[row]; ; ...
- [实战]挖掘CSRF姿势
[-]CSRF是个什么鬼? |___简单的理解: |----攻击者盗用了你的身份,以你的名义进行某些非法操作.CSRF能够使用你的账户发送邮件,获取你的敏感信息,甚至盗走你的财产. |___CSRF攻 ...
- WPF中判断组合键
1.写在主窗口,private void window_KeyDown(object sender, KeyEventArgs e) 事件中,2.如果是弹出窗口,那么在生成弹出窗口的代码中frm.Ke ...
- DedeCMS源码安装
一.源码下载地址 可以从以下网站下载DedeCMS源码进行安装,这里我下载了AB模板网的一个服装网站源码来演示DedeCMS源码的安装 http://www.adminbuy.cn/dedecms/2 ...