三层网络设备对于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. Apache的配置

    Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改. 主站点的配置(基本配置) (1) 基本配置: ServerRoot "/mnt/s ...

  2. CentOS 添加/绑定 IP

    美国VPS的独立IP相对于国内而言,是非常的便宜的.比如有些美国VPS,买5个独立IP才三美元左右一个月.当我们购买了多个独立IP时,如果你不想再联系客服而漫长的等待,那就自己手动配置吧. 一.进入/ ...

  3. TTS异步+同步

    微软TTS使用说明 一.SAPI SDK的介绍 SAPI,全称是The Microsoft Speech API.就是微软的语音API.由Windows Speech SDK提供. Windows S ...

  4. eclipse中myBatis引入

    1.添加config.xml配置文件 2.定义与数据库的数据实体映射类 3.创建操作表的是sql映射文件 即:mapper.xml 4.在配置文件config.xml中注册sql映射文件(步骤三创建的 ...

  5. C写的扫描器源码

    Title:C写的扫描器源码 --2010-10-27 20:02 无意间看见的一个源代码,弄回来读下. ----------------------------------------------- ...

  6. 51单片机I/O口使用经验

    按常规,在51端口(P1.P2.P3)某位用作输入时,必须先向对应的锁存器写入1,使FET截止.一般情况是这样,也有例外.所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场 ...

  7. Linux下配置QT环境

    一.下载Qt源码包到本机,然后解压缩 #tar zxvf qt-x11-opensource-src-4.3.2.tar.gz -C /usr/local //将qt-x11-opensource-s ...

  8. Ubuntu下Qt-4.7.1的静态编译

    最近在学习Qt的静态编译,相比较来说windows的Qt静态编译比较容易,相反对于linux编译网上的文章实践下来都有这样那样的错误,这里简要小结一下自己的编译成果. 一.实验环境 1.Ubuntu  ...

  9. 2013第39周一Web打印

    2013第39周一Web打印 项目中遇到了Java Web打印问题,简单调用IE浏览器的打印不能完全满足要求,于是就搜集了Web打印相关的主题,简单汇总一下.web打印难点在分页.页面纸张设置,页眉页 ...

  10. HDOJ 1330 Deck(叠木块-物理题啊!贪心算法用到了一点)

    Problem Description A single playing card can be placed on a table, carefully, so that the short edg ...