一、本章把前两章ip_output函数中的分片部分,和ipintr函数中的重装部分进行了讲解。IP分组的分片和重装的是在IP首部中有一些标识为,如ip_off和MF这些。而且分片有一个原则,就是除了最后一个分片,其他分片的数据部分的大小都应为8字节的倍数。
二、ip_output函数中的分片:

  • 1.确定分片大小:如果分组中的标识位禁止分片,那么函数对于大于接口MTU的分组进行丢弃,并返回。针对数据报生成地方的不同,进行不同的处理。如果数据报是在本地生成的,那么将错误信息传递给相应的进程;如果数据报是被转发的(即主机被配置成路由器了),那么将错误信息生成一个ICMP目的地不可达的差错报文,并指出不分片就无法转发该分组,发送给源地址中的进程。
  • 2.构造分片表:分片表在第221和第222页有源代码及讲解。在一个分片中,均包含一个IP首部、某些原始分组中的选项和最多len长度的数据。分配的时候基础的数据结构是mbuf,用mbuf链。即每一个分片由若干个mbuf结构构成,第一个mbuf结构承载IP首部(基本首部及选项,选项用ip_optcopy函数进行复制,注意还要在前面预留16字节的链路层首部),然后存储分片的数据部分,如果有必要还要新分配若干个mbuf结构来承载分片的数据部分。一个分片搞好后,就用mbuf中的m_nextpkt指针将各个mbuf链(各个分片)链接起来。
  • 3.把分片都搞好后,开始发送分片。如果一个分片发送失败,会造成后面的分片也失败。

三、ipintr函数中的重装:

  • 1.要重装分片,首先要判断一下到达的分组是不是一个完整的数据报,如果是一个完整的数据报,那么就不执行重装的代码。
  • 2.然后,如果如果需要进行重装也需要使用m_pullup函数将分组的首部提升到第一个mbuf中。
  • 3.构建一个重装表,像填词一样往里面填分片(不同时刻到达的分片可能会有地方重叠,那么就根据情况来切除掉或者抛弃掉重叠的部分)。为了判断到达的分片属于哪一个数据报,需要通过一些标识来判断。标识为一个四元组{ip_id,ip_src,ip_dst,ip_p},重装表的结构在后面进行叙述,还没有找到TCP避免重装调用m_pullup的机制。
  • 4.关于ip_erass函数,在每一个接收到一个分片后,通过ip_erass函数暂存收到的分片,然后判断是否已经组装完成一个数据报了。如果完成了,就向上层提交;否则就通过goto语句转向接收下一个分片的语句。对重装表的各种操作都在ip_earss函数中。
  • 5.重装结束。

四、ip_erass函数:ip_erass函数是在ipintr函数中被调用的,用来对重装表进行各种操作的。

  • 1.首先要引入两种数据结构:ipq结构和ipasfrag结构,这两个结构都是被放置在mbuf结构中的m_data[]中,而且ipq结构、ipasfrag结构和ip结构可以互相覆盖和转换
  • 2.第229页图10-17展示了一个重装表的实例,就一个图就里理解了。
  • 3.对于ip_erass函数的执行流程: 首先,创建重装表;然后通过前面介绍的标识四元组查找分片对应的位置;之后在将分片放置到相应位置的时候要对有覆盖的部分进行截断或者丢弃;然后判断是否组装完成,如果没有完成,函数返回,等待接收更多的分片(有代码会设置一个定时器,如果在规定的时间内没有组装完成,就认为超时,丢弃已接受到的这个数据报的所有分片),如果完成了,就用m_cat函数把分片重新构造成数据报(暂时还不知道这么做的原因,有待看源码);然后对数据区域强制类型转换(如把首部区域转换成ip结构等);然后就没有然后了,就完结了

五、还有两个函数起到一些辅助作用:
ip_slowtimo函数:一个定时器函数,500ms被调用一次,为重装链表上的分片计时。
ip_drain函数:当内核需要更多内存的时候被调用。

第十章 IP的分片与重装相关推荐

  1. 计算机网络基础 IP头部报文;IP的分片;

    IP头部报文: 第一行: version - 版本:占4比特: IP协议的版本,目前的IP协议版本号为4: Header length - 头部长度:占4比特: 固定部分的长度(20字节)和可变部分的 ...

  2. 4.3.2 IP数据报分片

    4.3.2 IP数据报分片

  3. IP虚拟分片重组配置命令

    1.1.1  display ip virtual-reassembly [命令] display ip virtual-reassembly [ interface interface-type i ...

  4. 【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )

    文章目录 一.最大传送单元 MTU 二.分片机制 ( 标识.标志.片偏移 ) 三.分片机制 示例 四.IP 数据报首部中的相关数据长度单位 一.最大传送单元 MTU 最大传送单元 MTU : MTU ...

  5. 王道考研学习笔记IP数据报格式IP数据报分片(超详细)

    一.回顾TCP/IP协议栈 二.IP数据报格式 记忆方法: TCP是面向连接的服务,面向连接就非常6.而UDP是不面向连接的,数据就非常容易被"遗弃"(17).因为如果不建立连接, ...

  6. 计算机网络之网络层:2、IP数据报、IP数据报分片

    网络层:2.IP数据报 TCP/IP协议: IP数据报: IP数据报分片: 最大传送单元MTU: 与IP数据报分片相关的相关字段: TCP/IP协议: IP数据报: 首部长度:4bit,最小取值010 ...

  7. TCP/IP具体解释--TCP的分段和IP的分片

    写在前面: 分组能够发生在运输层和网络层.运输层中的TCP会分段,网络层中的IP会分片.IP层的分片很多其它的是为运输层的UDP服务的,因为TCP自己会避免IP的分片,所以使用TCP传输在IP层都不会 ...

  8. 计算机网络-IP数据报计算(IP数据报分片)一个数据报部分长度为3400字节(使用固定首部)。现在经过一个网络传输,该网络的MTU为800字节:

    IP数据报计算(IP数据报分片) 题目: 一个数据报部分长度为3400字节(使用固定首部).现在经过一个网络传输,该网络的MTU为800字节: (1)应分为几个数据报片? (2)各数据报片的数据字段长 ...

  9. 计算机网络实验IP数据报分片,实验报告三IP数据分片.doc

    实验报告三IP数据分片 计算机网络实验报告 实验名称:IP数据分片 组号:一组 角色号:B 姓 名: 班 级: 学 号: 日 期:2014.4.21 一,实验目的 学习IP数据报分片原理 二,实验步骤 ...

最新文章

  1. 解救被困传销女演员 助人减肥找老婆 蚂蚁森林又现神功能
  2. Mysql —— linux下使用c语言访问mySql数据库
  3. 在struts2中訪问servletAPI
  4. python小波变换尺度函数_Python图像处理(17):pyWavelet
  5. java安全编码指南之:序列化Serialization
  6. mysql 计算差值_Prometheus + Granafa 构建MySQL监控平台
  7. c++rpg黑框游戏_c++实现简单RPG对战游戏的代码
  8. 数据库原理--事务(一)
  9. 自疫情暴发以来,99%的中国IT决策者认为数据变得更重要
  10. 电脑是个神奇的东西!
  11. 从无线安全到内网渗透[1]
  12. layui设置请求加载旋转等待
  13. 12个面向前端开发者真正有用的 VSCode 插件工具
  14. 全国计算机四级——操作系统原理笔记
  15. MFC在两控件间画线
  16. 云计算运营—01华为云计算解决方案介绍
  17. 【ML】第六章 决策树
  18. 《网页美工设计Photoshop+Flash+Dreamweaver从入门到精通》——1.6 网页配色安全
  19. android7.0计时器代码,iCountTimer Pro(锻炼计时器)
  20. 上传并在地图中显示Shp文件

热门文章

  1. 庖丁解牛式读《Attention is all your need》
  2. git clone时报错 Empty reply from server
  3. Samsara v2.0 MIS数据流脚本编程 Demo
  4. 根据accept-language 设置国际化
  5. httpclient3.1的relaseConnection的misunderstand
  6. 职场指南,如何当一个不背锅的人?
  7. VC++实现交换网络的QQ号嗅探
  8. 基于matlab/simulink同步发电机电路模型仿真,基于MATLAB/SIMULINK同步发电机电路模型仿真...
  9. 新塘单片机烧写器_ICP Programming Tool下载|新唐单片机烧录工具ICP Programming Tool v3.00.6909 官方版 下载 - 巴士下载站...
  10. HTM5新手学习的一些日常总结,相互交流和相互学习。