Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识Linux · IP分片

初识Linux · IP分片

作者头像
_lazy
发布于 2025-05-21 06:53:38
发布于 2025-05-21 06:53:38
920
举报
文章被收录于专栏:Initial programmingInitial programming

前言:

前文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分片的全部内容。

感谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【计网】网络层路由过程 ,理解IP分片与组装
路由就是在复杂的网络结构中,找出一条通往终点的路线。 IP协议提供了保证主机A可以跨网络发送数据到主机B。跨网络过程中,需要经过不同的路由器的一次一次的转发才能到达主机B。IP协议解决的就是在这个传输过程中为什么要去这个路由器子网而不是另一个!
叫我龙翔
2024/10/28
1560
【计网】网络层路由过程 ,理解IP分片与组装
【网络编程】十二、两万字详解 IP协议
​ TCP 作为传输层控制协议,其保证的是数据传输的可靠性和传输效率,但 TCP 提供的仅仅是数据传输的策略,而 真正负责数据在网络中传输的则传输层之下的网络层和链路层。
利刃大大
2025/05/20
1660
【网络编程】十二、两万字详解 IP协议
网络原理一> ip协议相关特性
3位标志位:描述了其中一个标志位,是否触发了拆包操作,还有一个标志位描述当前数据包是否是最后一个
用户11305962
2025/02/05
1310
网络原理一> ip协议相关特性
网络IP分片
IP协议的版本号分为IPV4和IPV6,IPV4格式是点分十进制的四字节无符号整数,而IPV6是6字节的无符号整数;
啊QQQQQ
2025/05/12
620
【JavaEE初阶】TCP/IP协议(二)
如果一个IP数据报携带的数据载荷太长了,超过64kb,就会在网络层针对数据进行拆分。把一个数据拆分成多个IP数据报。再分别发送给接收方,再重新拼装。 接收方:数据链路层,针对两个数据帧进行分用,得到两个IP数据报,交给网络层,网络层针对这俩IP数据报进行解析,把里面的载荷拼成一个,交给传输层。
xxxflower
2023/10/16
2520
【JavaEE初阶】TCP/IP协议(二)
TCP分段与IP分片的区别与联系
我们在学习TCP/IP协议时都知道,TCP报文段如果很长的话,会在发送时发生分段(Segmentation),在接收时进行重组,同样IP数据报在长度超过一定值时也会发生分片(Fragmentation),在接收端再将分片重组。如果之前你和曾经的我一样,经常混淆这两个概念,甚至一度以为两者表示的是同一个协议栈机制,那么本文就将通过详细介绍分段与分片的区别与联系,力图让你对此有一个更为完整、严谨的理解。
我是东东东
2018/08/01
13.7K1
计算机网络之网络层- IPv4协议
IPv4协议:Internet网络层最核心的协议。定义了如何封装上层协议( 如UDP、 TCP) 的报文段;定义了Internet网络层寻址( IP地址) 以及如何转发IP数据报等内容。
越陌度阡
2020/11/26
1.3K0
计算机网络之网络层- IPv4协议
IP分片报文:你需要知道的
在互联网协议(IP)中,分片报文是一个重要的概念。当数据包过大时,为了确保其在网络中能够顺利地从发送端传输到接收端,IP协议允许程序将数据包拆分成更小的片段。这些片段称为IP分片报文。
程序熵
2023/10/06
9250
【计算机网络】IP 协议
首先我们学的 IP 地址是在网络协议栈中的网络层的,数据包经过 TCP/UDP 传输层封装报头后,传给下层网络层,而网络层主要是在复杂的网络环境中确定一个合适的路径发送给对方。
YoungMLet
2024/03/23
2210
【计算机网络】IP 协议
IP数据报分片的工作原理及代码实现
IP数据报分片是网络层的一种机制,用于将较大的IP数据报分割成多个较小的片段,以便在网络中传输。分片机制解决了不同网络链路最大传输单元(MTU)不一致的问题,确保数据报能够顺利通过各种网络环境。本文详细介绍了IP数据报分片的工作原理、相关字段的作用以及分片过程的具体步骤,并提供了基于Python的分片代码实现。
用户11396661
2025/02/22
3210
【Linux】网络层协议:IP
1. 我们之前已经学习了TCP,当时我们在进行讲解时,是站在上帝视角直接说A主机将数据段发送到B主机,可是A主机真的是直接将数据段发送到对方吗?其实并不是,传输层的数据段是要向下交付到网络层的,那TCP究竟在数据网络传输的过程中扮演了什么样的角色呢?网络层的核心工作又是什么呢?我该怎样理解这两层协议栈呢?
举杯邀明月
2023/10/17
4770
【Linux】网络层协议:IP
速读原著-TCP/IP(IP分片)
正如我们在2 . 8节描述的那样,物理网络层一般要限制每次发送数据帧的最大长度。任何时候I P层接收到一份要发送的 I P数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其M T U。I P把M T U与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
cwl_java
2020/03/09
1.1K0
速读原著-TCP/IP(IP分片)
Linux网络-IP协议
网络层就是为了解决不同网络有不同的规范要求的差异问题,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求。也就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集
用户9645905
2022/11/15
4.3K0
Linux网络-IP协议
【Linux网络编程】IP协议格式,解包步骤
对于IP,每次先去看前二十个字节。也就是说这二十字节里面的东西是固定的,每个IP报头都是如此,不会改变。
用户11396661
2025/02/22
2190
【Linux网络编程】IP协议格式,解包步骤
【Linux网络#13】:网络层(IP 协议 & 网络通信 & 全球网络 & 路由转发)
🔥个人专栏:Linux—登神长阶 最后的最后,这里送大家一句话,希望大家于2025年一起奋斗,诸君共勉 💫
IsLand1314
2025/06/02
1360
【Linux网络#13】:网络层(IP 协议 & 网络通信 & 全球网络 & 路由转发)
图解 IP 基础知识! 「入门知识」
路由器对分组进行转发后,就会把数据包传到网络上,数据包最终是要传递到客户端或者服务器上的,那么数据包怎么知道要发往哪里呢?起到关键作用的就是 IP 协议。
睡魔的谎言
2020/12/22
1.2K0
UDP的FPGA实现(中) | UDP段、IP包、MAC帧结构
UDP的长度是指包括包头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。理论上,包含报头在内的数据报的最大长度为65535字节,实际上,UDP的MTU一般为1500,这与CDMA/CS机制有关系,即使巨型包也不会超过65535,在基于USO和UFO层次时,可对UDP进行拆包处理。(这部分暂未研究,以后有机会一定要好好学习一哈)
根究FPGA
2020/06/30
3.5K0
UDP的FPGA实现(中) | UDP段、IP包、MAC帧结构
【Linux网络】网络层IP协议,数据链路层:以太网、ARP协议
但是随着互联网的飞速发展,这种划分方案的局限性很快显现出来,A 类地址很容易浪费,于是提出了新的划分方案:CIDR(Classless Interdomain Routing)
_小羊_
2025/03/02
2071
【Linux网络】网络层IP协议,数据链路层:以太网、ARP协议
常用的数据链路层协议_数据链路层和网络层
虽然网络中各个局域网所采用的通信技术可能的不同的,但是IP屏蔽了底层网络的差异,对于网络通信双方的IP层及其往上的协议来说,它们并不需要关心底层具体使用的是哪种局域网技术。
全栈程序员站长
2022/11/01
9740
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
分片 : 链路层的数据部分 , 就是 IP 分组 , 该分组的 MTU 是 1500 字节 , 当网络层的 IP 分组超过 1500 字节 , 此时就要进行分片 ;
韩曙亮
2023/03/28
7.5K0
【计算机网络】网络层 :  IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
相关推荐
【计网】网络层路由过程 ,理解IP分片与组装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档