第十章 IP的分片与重装

一、本章把前两章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避免重
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值