初识Linux · IP分片

目录

前言:

IP分片

分片vs不分片

如何分片

分片举例

三个字段


前言:

前文IP协议·上和IP协议·下我们已经把IP协议的报头的大多数字段介绍了,唯独有三个字段现在还有介绍,即16位标识,8位协议,13位片偏移,今天,我们将通过IP分片的介绍,隆重介绍这三个字段,那么废话不多说,直接进入主题吧!


IP分片

我们熟知报文在向下交付的时候,分别是经过应用层,传输层,网络层,再到数据链路层,那么在报文交付的过程我们是否考虑过报文的字节数是否会超过限制?

实际上,在报文交付的时候,我们拿以太网举例,在数据链路层存在MTU ,即数据链路层定义的最大帧负载 ,说简单一点就是最大传输单元

即从传输层下来的数据不能超过MTU,而MTU在以太网中代表的是1500字节,在不同的网络中有不同的配置。那么传输层的报文经过网络层,封装的时候发现的数据一旦超过了MTU,就会进行分片。

分片vs不分片

我们知道,报文超过了MTU就会在网络层分片,那么分片就代表了报文会从1个报文变成多个报文,所以分片vs不分片的话题,也就变成了1个报文vs多个报文的话题了。

对于这个话题来说,非常的直观,因为网络世界中存在一个老生常谈的话题------丢包问题 。如果分的片中,有一片丢失了,那么整个报文就丢失了,此时就会重传,会给网络带来额外的负担,所以分片并不是网络转发的主流 ,并且因为分片了,那么还要组装,有了组装,我们还得担心是否会有分片丢失,如果分片丢失,还需要重传,即便没有丢失,也需要判断是否发生了丢包的情况。这也就是为什么不想分片的原因。

那么如何做到不分片也很简单,只要发送的数据不超过对应网络的MTU就可以了,但是架不住有的情况下只能分片,所以本文的侧重点主要还是在如何分片上。

如何分片

分片举例

假设现在有一个3000字节的报文,我们一想,MTU不是1500字节吗?所以3000直接除以1500呗,就分两个片就行了呗。

实际上这个操作是非常错误的,因为报文在网络世界中往往要有一个标识,比如IP报头等。如果我们直接一分为2,前1500字节好说,有对应的IP报头嘛,但是后面的1500字节可就遭罪了,就只有有效载荷,报头呢?啥也没有,那谁接收了该报文不迷糊啊。

所以分片的时候,实际上是这样的(只考虑IP的20字节报头):

原始为3000字节的数据,分为了三片,每片都有自己的报头和有效载荷。这是正确分法。

三个字段

到这里,我们可以开始了解这三个字段了,分别是16位标识,3位标志,13位片偏移

对于16位标识来说,是对不同分片的一个分类,毕竟我们要有一个认识就是:OS内存在大量的报文,有的是已经分片了的,有的是没有分片的,那么对于已经分片的报文,我们后面组装的时候知道哪些分片是一类的,哪些不是,这样才能从分片的报文组装为一个完整的报文。

所以16为标识的作用是:标识从同一个报文分下来的分片报文

对于之后组装的时候,我们要清楚一个点就是,**如何进行组装?**稀里糊涂的组装?逮到谁就是谁吗?那肯定不行,所以我们需要一个字段来表示该分片是原始报文的哪个位置。

在IP报头中标识位置的字段就是13位片偏移,通过该字段有效的标记分片在原始报文的偏移量是多少,比如上面的偏移量分别是0,1480,2960。因为第一片的还有20字节的报头,所以偏移量应该是1480。

那么有意思的来了,我们知道片偏移量是13位,但是IP有一个字段是16位总长度(总字节数),也就代表了数据的最大可以到2^16次方,而片偏移量只有13位,所以偏移量最大只能表示2^13字节,那么没有表示出来的字节数怎么处理?

实际上,在分片的时候,实际偏移的字节数是偏移量右移8位得到的,也就是说这个偏移量一定是能够被8整除的。那么如果不能被8整除怎么办?这问题在网络层严格规定了,只有最后一片报文的字节数可以不被8整数,前面的报文都是要能被8整除的。那么在组装的时候,可以通过偏移量左移得到对应的真实的片偏移量。

所以13位片偏移的作用是:表示该分片在原始有效载荷的偏移量

三位标记字段就比较简单了,有的报文可以分片有的不能,所以三位标志字段中第一位是保留字段,现在不使用,第二个是置为1代表的是禁止分片,这个时候报文长度如果超过了MTU,IP就会丢弃该报文。第三位表示更多分片的意思,除了最后一个分片设置为0,其他的都是1,为0的时候类似于一个结束标志,就像C语言的字符串使用斜杠0结尾一样。

所以3位标志的作用是:表示该报文是否分片,并且如果分片,最后的分片标志位为0.

那么在组装的时候,我们一定是要知道分片在原始有效载荷的位置,所以片偏移量有效帮我们解决了这个问题,因为按照顺序来说,依次的片偏移量是升序排列的。

那么我们如何区分报文的是分片了的,如果分片了,它是第一个或者是其他位置的?

对于没有分片的:更多分片为0 && 片偏移量为0。

对于分片了的,第一片的更多分片为1 && 片偏移量为0,其他片的更多分片为1 && 片偏移量>0,最后一片的更多分片为0 && 片偏移量不为0

这样就完美区分了分片和不分片,那么分片我们清楚了,组装不就也清楚了吗?

那么真正的分片如下:

以上就是IP分片的全部内容。


感谢阅读!

相关推荐
EasyDSS24 分钟前
国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营
网络·人工智能
玩转4G物联网26 分钟前
零基础玩转物联网-串口转以太网模块如何快速实现与TCP服务器通信
服务器·网络·物联网·网络协议·tcp/ip·http·fs100p
派阿喵搞电子1 小时前
Ubuntu下有关UDP网络通信的指令
linux·服务器·网络
光芒Shine1 小时前
【物联网-ModBus-ASCII】
物联网·网络协议
搬码临时工2 小时前
外网访问内网服务器常用的三种简单操作步骤方法,本地搭建网址轻松让公网连接
服务器·网络·智能路由器
帽儿山的枪手2 小时前
程序员必掌握的iptables五表五链
linux·网络协议
Fortinet_CHINA2 小时前
引领AI安全新时代 Accelerate 2025北亚巡展·北京站成功举办
网络·安全
dustcell.3 小时前
Cisco Packer Tracer 综合实验
网络
光芒Shine4 小时前
【物联网-ModBus-RTU
物联网·网络协议
量子-Alex4 小时前
【反无人机检测】C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测
网络·transformer·无人机