大家对IP数据包头,应该不陌生吧

分片便是与图中圈出来的两个地址有关,本文也是将主要围绕他们展开。

那我们先来了解他们的概念。

标志
一个三比特字段遵循与用于控制或识别片段。他们是(按顺序,从高分以低位):
0:保留; 必须为零。
1位:不分段(DF)
2位:更多片段(MF)
如果DF标志被设置,并且分片需要来路由分组,则该分组被丢弃。这可以发送分组到不具有足够的资源来处理破碎的宿主时,可以使用。它也可用于路径MTU发现由主机IP软件,可以自动或使用诊断工具例如手动平或跟踪路由。对于未分段的数据包,对MF标志被清除。对于分片包,除了最后的所有片段具有MF标志设置。最后片段具有一个非零片偏移量字段,从一个未分段的分组区分它。

分片偏移
片段偏移字段以8字节块为单位进行测量。它是13位长,并指定特定相对于原始未分段的IP数据报的开始的片段的偏移量。零第一片段已偏移。这允许最多(2偏移13(次方)  - 1)×8 =字节65,528,这将超过65,535字节的最大IP报文长度与包括报头长度(+ 65,528 20 = 65548字节)。

为什么要分片呢?

互联网协议使网络互相通信。设计要迎合不同物理性质的网络; 它是独立于链路层使用的基础传输技术。具有不同硬件的网络通常会发生变化,不仅在传输速度,而且在最大传输单元(MTU)。当一个网络要的数据报发送到具有较小MTU的一个网络,它可能片段的数据报。在IPv4中,这个功能被放置在因特网层,并且在IPv4路由器,这因此只需要这个层作为最高的一个在其设计中实现的处理。
与此相反,IPv6的,下一代互联网协议的,不允许的路由器来执行分片; 发送数据包之前,主机必须确定路径MTU。

分片
当路由器收到一个数据包时,它会检查目的地址,并确定出接口使用,并且该接口的MTU。如果分组的大小是比MTU大,并且在该分组的头中的不分段(DF)位被设置为0,则路由器可分段的数据包。
路由器将所述分组成片段。每个片段的最大尺寸是MTU减去IP包头的大小(20字节最低; 60个字节的最大值)。路由器会在每个片段到其自己的数据包,有以下改变每个分片报文:
该总长度字段是片段大小。
所述多个片段(MF)标志被设置为除了最后一个,这被设置为0的所有片段。
该片段的偏移字段被设置的基础上,在原来的数据有效载荷的片段的偏移量。这是在8字节块为单位进行测量。
该头校验域被重新计算。

例如,对于1500字节的MTU和20个字节的报头大小,该片段的偏移将是(1500年至1520年)/ 8 = 185。这些倍数倍数0,185,370,555,740,...

它有可能为一包在一个路由器进行分段,并在另一路由器进行分段的片段。例如,考虑4500个字节,没有选项大小和20字节的IP报头大小传输层段。因此IP分组大小为4,520字节。

重组
接收机知道一个分组是片段,如果满足下列条件中的至少一个为真:

“更多碎片”标志设置。(这是除最后所有片段真)。
在“片段偏移”字段是零。(这是为除第一所有片段真)

接收器标识匹配使用外国和当地的互联网地址,协议号,和识别领域的片段。接收器将重组从片段数据与同时使用的片段偏移和多个片段标志相同的ID。当接收机接收的最后一个片段(其具有的“更多片段”标志设置为0),它可以通过乘以最后一个片段的八个偏移,并加入最后一个片段的数据的大小来计算的原始数据有效载荷的长度,。在上面的例子中,这一计算是495 * 8 + 540 = 4500字节。

当接收机具有所有的片段,它可以把它们在正确的顺序,通过使用他们的偏移。然后,它可以通过他们的数据的堆栈作进一步处理。

IP分片与重组详解的更多相关文章

  1. DPDK IP分片及重组库(学习笔记)

    1 前置知识学习 1.1 MTU MTU是最大传输单元( Maximum Transmission Unit)的缩写,指一个接口无需分片所能发送的数据包的最大字节数.  MTU范围在46 ~ 1500 ...

  2. IP地址、子网掩码详解

    如何通过子网掩码划分网段 资料一: 一.缺省A.B.C类地址,子网掩码:  二.子网掩码的作用:  code:  IP地址 192.20.15.5 11000000 00010100 00001111 ...

  3. IP命令的用法详解

    IP命令的用法详解 原创 2017-06-29 10:02:34 0932 摘自:http://www.php.cn/linux-371363.html ip命令是Linux下较新的功能强大的 ...

  4. 网络基础知识-TCP/IP协议各层详解

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

  5. TCP/IP协议簇分层详解---转

    http://blog.csdn.net/hankscpp/article/details/8611229 一. TCP/IP 和 ISO/OSI ISO/OSI模型,即开放式通信系统互联参考模型(O ...

  6. redis主从架构,分片集群详解

    写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...

  7. IP数据包格式详解(转)

    摘自:http://blog.163.com/hlz_2599/blog/static/1423784742011112195857956/</> TCP/IP协议定义了一个在因特网上传输 ...

  8. TCP/IP数据包结构详解

    一般来说,网络编程我们只需要调用一些封装好的函数或者组件就能完成大部分的工作,但是一些特殊的情况下,就需要深入的理解网络数据包的结构,以及协议分析.如:网络监控,故障排查等…… IP包是不安全的,但是 ...

  9. TCP/IP笔记(七)TCP详解

    TCP的特点及其目的 为了通过数据包实现可靠性传输,需要考虑很多事情,例如数据的破坏.丢包.重复记忆分片顺序混乱等问题.如不能解决这些问题,也就无从谈起可靠传输. TCP通过检验和.序列号.确认应答. ...

随机推荐

  1. python计算文件夹大小——os.walk

    下面提供一种利用os.walk()快捷的计算指定文件夹大小的方法 话不多说,直接上代码 简略版: import os def get_file_size(file_path, size=0): for ...

  2. 早期(编译器)优化--Java语法糖的味道

    1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...

  3. JavaScript_几种创建对象(2017-07-04)

    理解对象 1.创建Object实例 var clock = new Object(); clock.hour = 12; clock.minute = 10; clock.showHour = fun ...

  4. netty同时做http和websocket(netty入门)

    ---恢复内容开始--- http://www.jianshu.com/p/5c29c6c6d28c ---恢复内容结束--- http://www.jianshu.com/p/5c29c6c6d28 ...

  5. 写日志(log)

    已下为我自己写的一个写日志的类,比较简洁. <?php class Log { /** * @Purpose : 写日志 * @Method Name : writeLog() * @param ...

  6. js常用事件

    为了便于使读者更好地运用js事件,就把常用事件大致分为以下几种: a. 表单元素事件,在表单元素中生效 onfocus  ------获取焦点 onblur -------失去焦点 onsubmit ...

  7. Java多线程学习(吐血超详细总结)(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但 ...

  8. centos清除dns cache.

    # /etc/init.d/nscd restart # service nscd restart # service nscd reload # nscd -i hosts https://www. ...

  9. Morris图表使用小记

    挺好用的,碰到几个问题,有的是瞎试解决了的: 1.我想折线图能够响应单击事件,即点击某个节点后,就能加载进一步的信息,帮助没找到,参照另外一个地方的写法,居然支持事件 Morris.Line({ el ...

  10. Extjs的grid的单元格中加载超链接和按钮

    效果: 户型图列显示的图片实际上就是一个超链接. 添加一个Button分2个步骤:1.在列头中定义超链接列或者Button列的HTML代码,也就是Render 2.添加该Button的事件处理函数.其 ...