【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)
绪论
“It does not matter how slowly you go as long as you do not stop.”。本章是自上而下的进入网络协议栈的第三个篇幅–网络层–,本章我将带你了解网络层,以及网络层中非常重要的IP协议格式和网络层的分片组装问题,后面将持续更新网络层敬请期待,早关注不迷路。
话不多说安全带系好,发车啦(建议电脑观看)。
OSI定制的七层网络协议栈(其中上三层合并为应用层):
网络层
网络层其简单理解就是在复杂的网络环境中确定一个适合的路径
其中典型的协议就是IP协议
IP协议
从上图(网络通信过程)中不难观察出,发送报文就像我们走路一样是需要选择路径的,对于报文传输路径的选择就是基于IP协议
IP协议能力:
将数据包跨网络从B主机送到C主机,并选择优秀的路径
(但注意的是并不一定100%能将报文送达)
可以把传输层和网络层看成:
父亲希望儿子能考个好大学:
父亲:提供可靠的策略:保证能上学
张三:提供执行能力:努力学习考大学
父亲对应的就是:Tcp,提供可靠的方案保证报文能高效、准确的送达。
儿子对应的就是:Ip,进行路径的选择。
Tcp + Ip : A -> B
目的:将数据包可靠的从A->B主机
- IP地址 = 目标网络 + 目标主机
目标网络:网络号
目标主机:主机号(先有印象即可后面在网段划分处细讲) - 网络号: 保证相互连接的两个网段具有不同的标识(也就是所谓的网段(IP地址和子网掩码相与),相同网段下不能出现重复主机号)
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号(可以大概理解成一个地方不能出现重复的东西)
注意的是:
- 网络不是凭空产生的,有人专门建设(由运营商建设)
- 网络世界是被精心设计过的和操作系统一样
一些基本概念
- 主机: 配有IP地址, 但是不进行路由控制的设备;
- 路由器: 即配有IP地址, 又能进行路由控制;
- 节点: 主机和路由器的统称;
协议头格式
只要有协议就离不开:
- 如何报头和有效分离
- 如何将有效载荷正确的分用
分离:通过 首部长度和16位总长度:
- 4位首部长度:单位是4字节,因为有4位就有(2进制化10进制):[0,15] 再乘上单位 * 4 = [0,60] byte,也就是报头最大长度是60字节,而其中报头固定长度至少有 20 byte、剩下的就是可选项的大小
- 16位总长度:16位总长度 = 报头长度(包含选项) + 有效载荷(所以也就是)
其余协议字段:
-
8位协议:发送方填充,表示上层协议类型(因为双方主机必须用同一种传输层协议,即主机A的传输层协议是TCP,则接收方也要用TCP协议才行 ),用于判断交给那个协议。
-
4位版本:填4就表示IPv4
-
8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)。所以主要的就是4位TOS(转发策略)它分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本。这四者相互冲突, 只能选择一个。(在不同路由转发中选用不同的策略来适应不同的场景)
例:对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。 -
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数。一般是64。每次经过一个路由,TTL 就减 1,一直减到0还没到达, 那么就丢弃了。这个字段主要是用来防止出现路由循环(也就是转发出问题了,转发报文是要消耗资源的,所以就需要销毁)。
-
16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏(不用因为tcp协议也会进行校验)。
-
32位源地址和32位目标地址: 表示发送端的ip地址和接收端的ip地址(端口号填到了传输层的16位源端口和目的端口)
其中还剩的ip协议中的三个字段:
16位标识、3位标志、13位偏移位,就是用来解决分片组装问题的!
让我们继续往下看
网络层的分片和组装问题
数据链路层限制:报文(数据帧)在网络中传输不能过大。
对此网络层的分片就是为了应对数据链路层中对帧的限制做出的处理方法,他将过大的报文就行分片,从而满足数据链路层的条件。
从而产生了一系列问题:
- 网络层分片后,当传递到对方主机后,同样在对方网络层就需要重新将分片的数据帧进行组装
- 从数据链路层知道了报文的最大大小,从而对于网络层、传输层、应用层都会有对应的大小设置(因为在每一层上都要至少加上报头固定大小)
具体如下图:
分片和组装都是在双方的网络层进行的,除了网络层外的协议层是不知道的(传输层就是直接把一个报文给到网络层,网络层处理再发给数据链路层)
分片的具体过程
分片是不好的,他提高了丢包的概率,他应该是网络通信的小概率事件。
如何尽可能不分片呢?
控制tcp,也就是tcp发送报文,不能只按照接受能力,直接发送一个大报文,必须按照自己的分片可能性,设置自己数据段的大小(当数据链路层的数据帧限制为1500byte时:1460byte 就是 tcp传送数据的最大段尺寸(MSS))
其中我们先认识下面三个字段:
- 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
- 3位标志字段:
- 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。
- 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文。
- 第三位表示"更多分片",如果分片了的话,最后一个分片置为1,否则是0。类似于一个结束标记.
- 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移。
- 其实就是在表示当前分片在原报文中处在哪个位置。
- 实际偏移的字节数是这个值 * 8(为了防止该报文的前一个报文大于213,从而13位的偏移量不够表示。因为13位片偏移只有213 ,而协议中的字段16位总长度最大为(216)byte时,他是不够表示的,所以乘8(23)补上差的3位。
- 注:用的时候:将真正的偏移量除8得到13位分片偏移,再后面还原时乘8得到真正的偏移量)。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(乘8了就肯定是其整数倍,否则报文就不连续了)。
具体如下:
如何确定接受到的报文分片了呢:
- 收到的分片时看3位标志中的“更多分片”标志位:若是1就表示分了片。
- 若更多分片是0:则看13位偏移量是否大于0,大于0则表示他是该16位标识的结尾
如何确定收全了
- 能确定收到开头(标志位位001、片偏移位0)
- 能确定收到结尾(标志位为001、片偏移非0)
- 也能确定收到中间分片(按照片偏移进行排序,然后进行计算(片偏移等于前面分片的片偏移 + 有效载荷(除去ip报头的分片)))
- 最后在直接根据片偏移组合起来
TCP 和 IP在格式上有点像,并且要将报文从A->B就需要:网络的核心能力也就是:TCP/IP协议
附:协议报文封装的过程:
本章完。预知后事如何,暂听下回分解。
如果有任何问题欢迎讨论哈!
如果觉得这篇文章对你有所帮助的话点点赞吧!
持续更新大量Linux细致内容,早关注不迷路。
相关文章:
【网络协议栈】网络层(上)网络层的基本理解、IP协议格式、网络层分组(内附手画分析图 简单易懂)
绪论 “It does not matter how slowly you go as long as you do not stop.”。本章是自上而下的进入网络协议栈的第三个篇幅–网络层–,本章我将带你了解网络层,以及网络层中非常重要的IP协议格式和网络层的分片组装问题,后面将持续更新网…...
数据库类型介绍
1. 关系型数据库(RDBMS) 关系型数据库是最常见的一类数据库,它们通过表(Table)来存储数据,表之间通过关系(如主键和外键)来关联。 • MySQL:开源的关系型数据库管理系统&…...
一步一步从asp.net core mvc中访问asp.net core WebApi
"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何…...
linux中kubectl命令使用
一.命令介绍 kubectl 是 Kubernetes 集群管理的命令行工具,用于与 Kubernetes API 交互。你可以通过它来管理和操作 Kubernetes 集群中的资源,如 Pod、Deployment、Service 等。下面是如何在不同操作系统上下载和使用 kubectl 的方法。 二.下载 kubect…...
Linux 系统结构
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。 1. linux内核 内核是操作系统的核心,具有很多最基本功能,它…...
ESP32-S3设备智能化升级,物联网无线AI语音交互,让生活更加便捷和有趣
在人工智能和物联网技术的推动下,无线AI语音交互技术正在成为智能设备的新选择。这种技术的发展,不仅改变了我们与设备的沟通方式,更开启了一个新的智能交互方案。 想象一下,通过简单的语音指令,就能控制家中的灯光、…...
Python的函数(补充浅拷贝和深拷贝)
一、定义 函数的定义:实现【特定功能】的代码块。 形参:函数定义时的参数,没有实际意义 实参:函数调用/使用时的参数,有实际意义 函数的作用: 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…...
oracle查询字段类型长度等字段信息
1.查询oracle数据库的字符集 SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER NLS_CHARACTERSET; 2.查询字段长度类型 SELECT * FROM user_tab_columns WHERE table_name user AND COLUMN_NAME SNAME 请确保将user替换为您想要查询的表名。sname为字段名 这里的字…...
C语言 | Leetcode C语言题解之第559题N叉树的最大深度
题目: 题解: /*** Definition for a Node.* struct Node {* int val;* int numChildren;* struct Node** children;* };*/int maxDepth(struct Node* root) {if (!root) {return 0;}int depth 0;// 创建空队列const int qCap 10e4 1;str…...
光流法(Optical Flow)
一、简介 光流法(Optical Flow)是一种用于检测图像序列中像素运动的计算机视觉技术。其基于以下假设: 1.亮度恒定性假设:物体在运动过程中,其像素值在不同帧中保持不变。 2.空间和时间上的连续性:相邻像素之…...
Rancher的安装
1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面(GUI)。对于不熟悉 Kubernetes 复杂的命令行操作(如使用kubectl)的用户来说,通过 Rancher 的界面可以方便地进行资源管理。例如,用户可以在…...
【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备
【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备 通过路由器的后台,查看当前在线设备,受到网卡版本的影响,有时会有部分设备看不见MAC和分配的IP。此时,可以借助命令行工具扫描子网下所有连…...
Ubuntu22.04安装DataEase
看到DataEase的驾驶舱,感觉比PowerBI要好用一点,于是搭建起来玩玩。Dataease推荐的操作系统是Ubuntu22.04/Centos 7。 下载了Ubuntu22.04和DataEase 最新版本的离线安装包 一.安装ubuntu22.04 在安装的时候,没有顺手设置IP地址信息ÿ…...
Taro React-Native IOS 打包发布
http网络请求不到 配置 fix react-native facebook::flipper::SocketCertificateProvider‘ (aka ‘int‘) is not a function or func_rn运行debug提示flipper-CSDN博客 Xcode 15(iOS17)编译适配报错_no template named function in namespace std-CS…...
【卷积神经网络CNN】基于深度学习动物图像识别系统(完整系统源码+数据库+开发笔记+详细部署教程+启动教程)✅
目录 【卷积神经网络CNN】基于深度学习动物图像识别系统(完整系统源码数据库开发笔记详细部署教程启动教程)✅ 一、项目背景 二、项目目标 三、项目创新点 四、项目功能 五、开发技术介绍 六、数据库设计 七、启动步骤 八、项目功能展示 九、开…...
图像处理椒盐噪声
椒盐噪声,也称为脉冲噪声,是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。这些白点和黑点会在图像中随机分布,导致图像中…...
推荐一款完全开源的多端仓库管理系统
简介 模块 安装 UI展示 开源地址 今天给大家介绍一款完全开源的仓库管理系统,本系统采用Python语言开发。 简介 该库存管理系统是目前福特亚太区售后物流仓储供应链流程。离开福特后,开始了这个项目。为了帮助一些有需要的人。OneAPP 理念。支持扫…...
python 爬虫 入门 六、Selenium
Selenium本来是一个自动测试工具,用于模拟用户对网站进行操作。在爬虫领域也有其用处。 一、下载安装Selenium及附属插件 pip install Selenium 安装完成后还需要安装一个浏览器驱动,来让python能启动浏览器。 如果是Edge或者其他基于Chromium的浏览器…...
ReactPress:重塑内容管理的未来
ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,欢迎一起共建,感谢Star。 ReactPress:重塑内容管理的未来 在当今信息爆炸的时代,一个高效、易用的内容管理系统࿰…...
w035基于web的学科竞赛管理
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件࿰…...
Java:JVM
1.JVM内存区域的划分 一个Java写的程序跑起来,就得到了一个Java进程 JVM 上面运行的字节码指令; 进程:操作系统资源分配的基本单位; 内存区域的划分: 1.程序计数器 在内存空间里(比较小的空间),保存了下一个要执行的指令的内存地址(元数据区的地址); 这里的"下一条…...
Windows下mysql数据库备份策略
Windows下mysql的增量备份和全量备份,并利用schtasks设置定时任务执行bat脚本。 一、备份要求 序号 备份类型 备份频次 备份时间 1 增量备份 每周一-每周六各一次 18:00:00 2 全量备份 每周日一次 18:00:00 二、备份方法 2.1增量备份 2.1.1准备工作…...
基于SSM的校园美食交流系统【附源码】
基于SSM的校园美食交流系统 效果如下: 管理员主页面 用户主页面 美食信息页面 美食资讯页面 修改密码页面 论坛中心页面 研究背景 随着高校信息化建设的不断推进,校园生活日益丰富多样,学生对于美食的需求与探索也愈发旺盛。然而ÿ…...
2024 年Postman 导入和导出 cURL 命令图文教程
Postman 导入和导出 cURL 命令图文教程...
ArcGIS从Excel表格文件导入XY数据并定义坐标系与投影的方法
本文介绍在ArcMap软件中,从Excel表格文件中批量导入坐标点数据,将其保存为.shp矢量格式,并定义坐标系、转为投影坐标系的方法。 已知我们有一个Excel表格文件(可以是.xls、.xlsx、.csv等多种不同的表格文件格式)&#…...
【vue】echarts地图添加蒙版图片,多图层地图实现天气信息展示
实现原理:多层图层叠加实现复杂的信息展示。 <template><div class"wrapper"><el-drawertitle"天气信息":modal"iszz":visible.sync"weatherinfo":direction"direction"><drawer:labelnam…...
MyBatis几种SQL写法
目录 1. 批量操作:通过标签支持批量插入 2. 批量操作:通过标签支持批量更新 3. 批量操作:通过标签支持批量删除 4. 动态SQL 3. 多条件分支查询 4. SQL语句优化:使用标签避免多余的AND或OR关键字。 5. 注解方式使用MyBatis 6. 一对多 7. 多对一&…...
蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】
目录 1:HAA9809特性 2:典型应用电路 3:CTRL管脚控制信息 4:一线脉冲控制方式 5:输入电阻,调节放大增益 6:输入电容,调节频响 7:总结 矽源特ChipSourceTek-HAA9809…...
Webpack知识点—publicPath
文章目录 一、publicPath的定义和作用二、publicPath的配置方式三、publicPath的注意事项四、publicPath的常见问题和解决方法五、Vite 如何修改publicPathWebpack的publicPath是一个重要的配置项,它用于指定打包后生成的静态资源文件在浏览器中的访问路径。 一、publicPath的…...
【JAVA】Java基础—面向对象编程:构造方法的重载
在Java中,构造方法的重载允许一个类定义多个构造方法,这些构造方法可以具有不同的参数列表。通过构造方法的重载,我们可以根据不同的需求创建对象,并以不同的方式初始化对象的属性。 我们可以将构造方法的重载比作一个餐厅的菜单…...
西部数码网站建设助手/网络策划方案
本文主要介绍在单机单数据库多实例的环境下,实现MySQL主从复制功能基本流程:1.MySQL主从复制介绍2.主从复制数据库实战环境准备3.在主库Master上执行操作配置4.在MySQL从库上执行的操作过程5.启动从库同步开关,测试主动复制配置情况6.MySQL主…...
如何用flash做网站/营销技巧培训
环境:VC toolkit 2003 SystemC 2.0.1 为了找出SystemC定义了哪些全局变量/静态变量,我在crt/src/crt0dat.c的 void _initterm(_PVFV * pfbegin, _PVFV * pfend) 函数中设下断点,at Line 598: if ( *pfbegin ! NULL ) …...
手机微信官方网站/宁波网站制作优化服务公司
U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的U-Boot命令。U-Boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在<include/command.h>头文件中定义 #define U_BOOT_CMD(name,ma…...
江苏无锡最新疫情/宁波百度seo排名优化
mysql 增加用户(注意:因为MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)格式:grant select on 数据库.* to 用户名登录主机 identified by 密码第一种:增加一个用户c密码为123123,让他可以在任何主机上登录&…...
怎么看网站后台什么语言做的/今天今日头条新闻
夜光序言: 倔强是最难改的脾气。 假如要改,也要倔强地去改。 不用改,只有倔强的人才温柔。 怎见得呢? 譬如说,穿着讲究,就是对自己的温柔。 正文: 1. 理解文本和二进制打开方式的区别…...
全国网站建设公司排名/强强seo博客
计算机领域有句话:“计算机的任何问题都可以通过增加一个虚拟层来解决”。另言之:"All problems in computer science can be solved by another level of indirection"。其主要思想是将调用者和被调者隔离开,既屏蔽细节࿰…...