Linux——IP协议1

news2024/11/18 11:47:06

目录

协议头格式

如何封装和解包

如何交付(分用)

报头每一个字段

分片是怎么做到的


 

        应用层解决的是数据使用的问题。

        在传输层,网络层,数据链路层:解决的是网络通信的细节,将数据可靠的从A主机跨网络发送到B主机。

        可靠性由传输层决定,从主机A送到主机B由网络层决定。

        IP协议主要是提供一种能力,将数据从A主机送到B主机的能力。有这种能力,一定能把数据送给对方吗?不能,有能力是指有很大概率能做成,而不是一定能做成。

         主机: 配有IP地址, 但是不进行路由控制的设备;

        路由器: 即配有IP地址, 又能进行路由控制;

        节点: 主机和路由器的统称;

协议头格式

数据部分有TCP数据段

如何封装和解包

         IP协议也是固定长度的报文,前20个字节就是固定的,也可携带选项。读取前20个字节,就能读取到报头的相关属性了,先读取前20字节,再读取4位首部长度,用首部长度减去20字节,得到的就是选项。如果没有选项,4位首部长度就是5(0101).

        IP采用的是定长报头和子描述字段。

如何交付(分用)

         8位协议表示有效载荷部分表示是UDP还是TCP,根据8位协议决定交给TCP还是UDP。

报头每一个字段

         4位版本:就是IPV4,指定IP协议的版本, 对于IPv4来说, 就是4

        IPV6和IPV4差别:IPV4是4字节,32个比特位来表示IP地址,IPV6用128位比特位表示IP地址。但IPV6和IPV4是不兼容的。现在所有的计算机用的都是IPV4。

        4位首部长度:IP地址表示报头长度用4个比特位表示,即十进制下0-15,4位首部长度有自己的单位,基本单位是4字节,即整个报文的宽度0-32比特位,假设4位首部长度是4,整个报文长度就是4*x,即最终能表示0-60的数字。

        8位服务类型:3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位
TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择一个. 对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要.

         16位总长度:IP数据报整体占多少个字节,有效载荷=16位总长度-4位首部长度*4

        生存时间:当一个报文进行转发的时候,可能会由于路由器问题,导致报文在路由器里长时间转发,经过了大量路由器,为了防止出现环路转发的情况,给每个报文设置了生存时间。  生存时间本质是一个计数器,每转发一次,计数器--,当生存时间为0时,便不在路由器中转发,直接丢弃。

        16位首部校验和:如果首部校验失败,报文就被直接丢弃,我们不用担心报文被丢弃,发送方主机会重传。

        32位源IP:数据包从哪来

        32位目的IP:数据包到哪去。

IP报文的形式和TCP报文非常类似,因此称为TCP/IP协议。

         链路层由于物理特征的原因,一般无法转发太大的数据,链路层有一次可以转发到网络的报文大小的限制。一般是1500字节,一般称为MTU(最大传输单元),若网络层要向下交付2500字节数据,网络层就需要做一件事情:“数据分片。”

        分片之后,又由谁来组装? 谁分片,谁组装(对端网络层),谁污染,谁治理。

        分片是将一个较大的IP报文,分割成多个较小的 ,满足条件的报文,分片的行为是网络层大的,同样组装的行为也必须由对方的网络层做。

        对方为什么要组装?因为对方给自己的网络层是一个完整的TCP报文,接收方在网络层向上交付也必须是一个完整的报文。IP分片和组装的行为,TCP是不知道,不关心的。

分片是怎么做到的

 

         16位标识是IP报文的序号,可根据这个序号区分报文,唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的

        3位标志:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记,一般情况下如果没有被分片,更多分片标志位的最后一位是0。

         13位分片偏移:是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。

        报文长度是1500字节,分成三份,第一个片偏移量0,第二个500,第三个1000.

        更多分片是1代表该分片后面还有分片:如下面这张图里更多分片是1,1,0。

        虽然有分片,但分片行为不是主流,能一次交付就尽量一次交付。

        接收方若要组装,就要识别出报文和报文的不同(通过16位标识区分,不同报文标识不同,相同报文的分片,标识是相同的。)

        还要能识别该报文是否被分片了。如果3位标志的第三位“更多分片”标志位是1,就代表它被分片。

        如果“我”就是最后一个分片,那么我的“更多分片”标志位就是0。13位片偏移一定不为0,因为“我”前面一定有报文。

        即一个报文没被分片,更多分片标志位是0,而且13位片偏移也是0。

        判断是否被分片的伪代码

        当我们收到一批报文时,先尽可能的讲报文的分片,区分出来,并放在一起。

        又识别出哪些分片是开始,哪些分片是中间,哪些分片是结尾呢?

        区分开始:只要是分片的,更多分片是1,片偏移是0。

        区分结尾:更多分片为0,片偏移不是0,中间报文可能会有多个。

        区分中间:更多分片是1,片偏移不是0.

        我们如何保证把分片收全了呢?如果在组装过程中,任何一个分片丢失,也要识别出来,那如何识别呢?

         ID:1234

         根据偏移量来进行升序排序,结合偏移量+自身大小=下一个报文的偏移量大小,来扫描整个报文,如果不匹配,中间一定会有丢失的,如果成功计算到结尾,就一定收取完整了。

         根据3位标志和13位片偏移,可以进行组装。

        在组装过程中,如果某报文丢了,偏移量就会对不上,这样就能找到丢失的片段。

        分片之前,一定是一个独立的IP报文。分片之后,是每一个分片都要有IP报头,还是直接进行分片而且报头跟着第一个分片就行。

         

         答案是每一个分片都要有IP报头,这样才能进行之后的组装,因为如果没有IP报头,接收方无法接收。

        而上图中的3000字节,,MTU是1500,如何分呢?报文标识是1234

第一个报文

         由于进行了分片,新报文的报头也要变,如16为总长度会变小,由3000变为1500.

        对于剩下的1500字节的报文,又该如何发送?

        若直接加报头,则整个报文会变为1520字节

因此我们要继续拆分,拆个1480出来,再添加20字节的IP报头。

之后再对剩余的20字节做同样处理。该偏移量是原始报文的偏移量1500+1480

 

         分片我们严重不推荐,分片坏处是什么?

        在网络层分片和组装的过程中,上层(网络层和应用层)是不知道的,它们只知道这是一个完整的报文,网络通信的时候丢包是有概率的,分片增加了丢包概率。

        上面的问题不是网络层说了算,要彻底解决问题,要在上层的传输层找答案。

         

        

        

        

         

         

        

         

        

         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深入浅出 Spring Security(八)】前后端分离-使用CSRF漏洞保护详讲

CSRF 漏洞保护 一、CSRF 概述二、CSRF 攻击演示三、CSRF 防御令牌同步模式 四、前后端分离使用 CSRFCsrfFilter 源码分析源码一些方法的细究 测试 五、总结 一、CSRF 概述 CSRF(Cross-Site Request Forgery 跨站请求伪造),也可称为一键式攻击…

乐盟互动申请纳斯达克IPO上市,募资2000万美元

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,来自北京的程序化广告平台【乐盟互动】近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票代码(LIAI)&…

SpringBoot社区小区物业管理停车场系统(Java+Layui+MyBatis+Python+Mysql)

wx供重浩:创享日记 对话框发送:69小区 获取完整源码源文件说明文档数据库文件 项目特色 本项目使用现行主流技术与架构模式(控制层、服务层、数据层)代码结构清晰,严格遵循模块化、组件化、接口化思想;关…

mysq在RR级别怎么解决不可重复读和幻读

1、定义 不可重复读: 事务1读取一行,事务2然后修改或删除该行数据并且提交事务,事务1再次读取结果不一样; 幻读:事务1按条件读取查询数据,事务2按照同样的条件新增一条或多条数据并且提交事务&#xff0c…

mysql8查看大事务

文章目录 1、查看大事务的原因2、构建测试数据3、模拟大事务场景4、查询mysql的事务5、查询大事务的详情 1、查看大事务的原因 大事务的特点是执行时间长,长期占有锁不释放,导致其他想操作同一行数据的线程阻塞,如果客户端设置了超时时间&am…

单正态总体和双正态总体的假设检验

1.单正态总体和双正态总体的假设检验 笔者之前的相关笔记: 1.正态总体下常见的抽样分布 2.假设检验(Hypothesis Testing) 个人理解假设检验:先对总体参数提出一个假设值,利用样本信息判断这一假设是采取拒绝该假设还是…

opencv人与摄像头距离检测

参考: https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ WeChat_20230611160620 1、cv2加载摄像头慢解决方法,单独重新cv2.VideoCapture() https://b…

使用vue进行Lodop打印的一些方法

文章目录 使用Lodop进行打印的一般步骤vue中使用lodopkr-print-designer简介打印模板设计器打印预览模板设计页面安装引入 Lodop是一个JavaScript控件,用于在Web应用程序中进行打印操作。 使用Lodop进行打印的一般步骤 下载Lodop控件:首先,你…

对比学习做了什么?

什么是对比学习? 对比学习貌似处于“无明确定义、有指导原则”的状态 什么是对比学习呢?(这个是微信链接)全文比较长,但是逻辑框架还是不错的。 如果想要更快速的了解什么是对比学习或者说对比学习是怎么做的,可以看SimCLR这个模…

全网最详细,软件测试-性能测试岗面试题总结(大全)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 描述一下你们公司…

论文阅读:Denoising Diffusion Probabilistic Models

论文阅读:Denoising Diffusion Probabilistic Models 最近一两年,在图像生成领域,扩散模型受到了越来越多的关注,特别是随着 DALL-E2 以及 Midjourney 的持续火爆,扩散模型也变得越来越流行,之前很多基于 …

C++ 参数的三种传递方式和应用场景

C 参数的三种传递方式分别是值传递、指针传递和引用传递。 值传递 值传递的实质 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参和实参分别占用不同的存储单元。 值传递的特点 值传递的特点是单向传递,即主调函数…

Java Web开发实战经典学习过程笔记

Java Web开发实战经典学习简单笔记 第一章 Java Web 开发简介 1.胖客户端程序指的是,当一个程序运行时需要一个单独的客户端程序支持(如:QQ)。瘦客户端程序在操作时不需要任何其他程序的安装(如:登录网上论坛,只需浏览器即可)。 2…

I.MX6ull UART

一 简介 UART 全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低&…

Self-Attention 自注意力机制

输出形式 李宏毅讲到: 模型的输入是只有一种形式——词向量但是输出的形式却是不唯一的,主要有以下三种: 每一个向量对应一个输出(多对多,且一一对应) 每个序列只有一个输出(多对一) 一个序列对应一个序列(多对多,长…

MySQL 索引的10 个核心要点

文章目录 🍉1. 索引底层采用什么数据结构?为什么不用hash🍉2. B树与B树区别?为何用B树?🍉3. 自增主键理解?🍉4. 为什么自增主键不连续🍉5. Innodb为什么推荐用自增ID&…

代码随想录第59天

1.下一个更大元素II 有两种方法&#xff1a; 1.把两个一样的数组拼起来&#xff1a; // 版本一 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nu…

Chapter7: SpringBoot与数据访问

尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…

《Reinforcement Learning: An Introduction》第4章笔记

Chapter 4 Dynamic Programming 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一类在给定完备环境模型的MDP后用来计算最优策略的算法。动态规划算法在强化学习中因为&#xff1a;1. 假设有一个完美的环境模型&#xff1b;2. 极大的计算代价 实际用处…

树莓派4B连接不了产品开的热点

目的 关于树莓派连接不了产品开的5G热点&#xff0c; 当时还是一头雾水。 参考这篇博客 把思路方向转向了频率&#xff0c; 信道&#xff0c; 通过给的产品A相关规格说明wifi 5.18GHz, 信道36。 于是乎我两款产品A、产品B为例。 树莓派是能连接产品B开的热点&#xff08;5.74…