【网络协议栈】网络层(上)网络层的基本理解、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位总长度:

  1. 4位首部长度:单位是4字节,因为有4位就有(2进制化10进制):[0,15] 再乘上单位 * 4 = [0,60] byte,也就是报头最大长度是60字节,而其中报头固定长度至少有 20 byte、剩下的就是可选项的大小
  2. 16位总长度:16位总长度 = 报头长度(包含选项) + 有效载荷(所以也就是)

其余协议字段:

  1. 8位协议:发送方填充,表示上层协议类型(因为双方主机必须用同一种传输层协议,即主机A的传输层协议是TCP,则接收方也要用TCP协议才行 ),用于判断交给那个协议。

  2. 4位版本:填4就表示IPv4

  3. 8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0)。所以主要的就是4位TOS(转发策略)它分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本。这四者相互冲突, 只能选择一个。(在不同路由转发中选用不同的策略来适应不同的场景)
    例:对于ssh/telnet这样的应用程序, 最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。

  4. 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数一般是64。每次经过一个路由,TTL 就减 1,一直减到0还没到达, 那么就丢弃了。这个字段主要是用来防止出现路由循环(也就是转发出问题了,转发报文是要消耗资源的,所以就需要销毁)。

  5. 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏(不用因为tcp协议也会进行校验)。

  6. 32位源地址和32位目标地址: 表示发送端的ip地址和接收端的ip地址(端口号填到了传输层的16位源端口和目的端口

其中还剩的ip协议中的三个字段:
16位标识、3位标志、13位偏移位,就是用来解决分片组装问题的!
在这里插入图片描述
让我们继续往下看

网络层的分片和组装问题

数据链路层限制:报文(数据帧)在网络中传输不能过大。

对此网络层的分片就是为了应对数据链路层中对帧的限制做出的处理方法,他将过大的报文就行分片,从而满足数据链路层的条件。

从而产生了一系列问题:

  • 网络层分片后,当传递到对方主机后,同样在对方网络层就需要重新将分片的数据帧进行组装
  • 从数据链路层知道了报文的最大大小,从而对于网络层、传输层、应用层都会有对应的大小设置(因为在每一层上都要至少加上报头固定大小)

具体如下图:
在这里插入图片描述
分片和组装都是在双方的网络层进行的,除了网络层外的协议层是不知道的(传输层就是直接把一个报文给到网络层,网络层处理再发给数据链路层)

分片的具体过程

分片是不好的,他提高了丢包的概率,他应该是网络通信的小概率事件。

如何尽可能不分片呢?

控制tcp,也就是tcp发送报文,不能只按照接受能力,直接发送一个大报文,必须按照自己的分片可能性,设置自己数据段的大小(当数据链路层的数据帧限制为1500byte时:1460byte 就是 tcp传送数据的最大段尺寸(MSS))

其中我们先认识下面三个字段:

  1. 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。
  2. 3位标志字段:
    1. 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。
    2. 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文。
    3. 第三位表示"更多分片",如果分片了的话,最后一个分片置为1,否则是0。类似于一个结束标记.
  3. 13位分片偏移(framegament offset)是分片相对于原始IP报文开始处的偏移
    1. 其实就是在表示当前分片在原报文中处在哪个位置。
    2. 实际偏移的字节数是这个值 * 8(为了防止该报文的前一个报文大于213,从而13位的偏移量不够表示。因为13位片偏移只有213 ,而协议中的字段16位总长度最大为(216)byte时,他是不够表示的,所以乘8(23)补上差的3位。
    3. 注:用的时候:将真正的偏移量除8得到13位分片偏移,再后面还原时乘8得到真正的偏移量)。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(乘8了就肯定是其整数倍,否则报文就不连续了)。

具体如下:
在这里插入图片描述

如何确定接受到的报文分片了呢:

  1. 收到的分片时看3位标志中的“更多分片”标志位:若是1就表示分了片。
  2. 若更多分片是0:则看13位偏移量是否大于0,大于0则表示他是该16位标识的结尾

如何确定收全了

  1. 能确定收到开头(标志位位001、片偏移位0)
  2. 能确定收到结尾(标志位为001、片偏移非0)
  3. 也能确定收到中间分片(按照片偏移进行排序,然后进行计算(片偏移等于前面分片的片偏移 + 有效载荷(除去ip报头的分片)))
  4. 最后在直接根据片偏移组合起来

TCP 和 IP在格式上有点像,并且要将报文从A->B就需要:网络的核心能力也就是:TCP/IP协议

附:协议报文封装的过程:
在这里插入图片描述


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量Linux细致内容,早关注不迷路。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用AI制作《职业生涯规划PPT》,10分钟完成

职业生涯规划是大学生活中非常重要的一环。通过制定职业规划,你能够明确未来的职业目标、认清自身的优劣势,进而制定切实可行的计划,以便顺利踏上职业发展的道路。而制作一份精美的职业生涯规划PPT,能有效帮助你在面试、职业规划报…

FPGA高速设计之Aurora64B/66B的应用与不足的修正

FPGA高速设计之Aurora64B/66B的应用与不足的修正 Aurora IP协议的特点 首先基于网上找到的一些资料,来讲述下Aurora高速协议的特点与相关的应用。Aurora 协议在 2002 年由 Xilinx 公司首次提出,是由Xilinx提供的一个开源、免费的链路层串行传输通信协议…

vue2项目启用tailwindcss - 开启class=“w-[190px] mr-[20px]“ - 修复tailwindcss无效的问题

效果图 步骤 停止编译"npm run dev"安装依赖 npm install -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9 创建文件/src/assets/tailwindcss.css,写入内容: tailwind base; tailwind components; tailwind utiliti…

Docker部署Nginx

1. 拉取Nginx镜像 1.1 选择指定版本或latest 在部署Nginx时,选择合适的镜像版本是至关重要的。Docker Hub上提供了Nginx的官方镜像,用户可以根据自己的需求选择使用特定版本的Nginx或者始终使用最新的latest标签。 版本选择的重要性:选择一…

WPF+MVVM案例实战与特效(二十八)- 自定义WPF ComboBox样式:打造个性化下拉菜单

文章目录 1. 引言案例效果3. ComboBox 基础4. 自定义 ComboBox 样式4.1 定义 ComboBox 样式4.2 定义 ComboBoxItem 样式4.3 定义 ToggleButton 样式4.4 定义 Popup 样式5. 示例代码6. 结论1. 引言 在WPF应用程序中,ComboBox控件是一个常用的输入控件,用于从多个选项中选择一…

ctfshow-web入门-反序列化(web271-web278)

目录 1、web271 2、web272 3、web273 4、web274 5、web275 6、web276 7、web277 8、web278 laravel 反序列化漏洞 1、web271 laravel 5.7&#xff08;CVE-2019-9081&#xff09; poc <?php namespace Illuminate\Foundation\Testing{use Illuminate\Auth\Generic…

hive数据查询语法

思维导图 基本查询 基本语法 SELECT [ALL | DISTINCT] 字段名, 字段名, ... FROM 表名 [inner | left outer | right outer | full outer | left semi JOIN 表名 ON 关联条件 ] [WHERE 非聚合条件] [GROUP BY 分组字段名] [HAVING 聚合条件] [ORDER BY 排序字段名 asc | desc…

分段式爬虫和数据采集有什么关系

今天有人问我&#xff1a;分段式爬虫和数据采集有什么关系。 我想了想&#xff0c;我说我认为分段式爬虫其实是数据采集的一种手段或者说一种具体的方法。 咱就说数据采集吧&#xff0c;那就是想办法把各种有用的数据从不同的地方收集过来。这里面就有很多种方式&#xff0c;而…

最新网盘资源搜索系统,电视直播,Alist聚合播放

项目乃是基于 Vue 与 Nuxt.js 技术打造的网盘搜索项目&#xff0c;持续开源并保持维护更新。其旨在让人人皆可拥有属于自己的网盘搜索网站。强烈建议自行部署 更新日志&#xff1a; tv播放 新增Alist源聚合播放 新增批量删除功能 新增博客功能 &#xff08;分支&#xff1…

从零开始使用Intel的AIPC使用xpu加速comfyui

Intel的AIPC使用xpu加速跑comfyui 环境安装python环境搭建驱动及oneAPI安装创建python环境验证环境是否生效 ComfyUI的安装下载、汉化comfyui下载checkpoint 测试使用xpu加速测试使用cpu执行测试 环境安装 python环境搭建 直接下载Anaconda 下载地址 安装好后&#xff0c;通…

关于git使用的图文教程(包括基本使用,处理冲突问题等等)超详细

目录 用户签名,初始化git git提交流程图 提交到本地库 版本穿梭 分支操作 分支合并冲突 团队协作 github的使用 推送代码 克隆 拉取代码 团队协作冲突 团队协作之分支管理 推送分支到分支&#xff1a; 拉去远程库分支到本地库&#xff1a; 本地删除远程分支&am…

Android Studio打包时不显示“Generate Signed APK”提示信息

Android Studio打包时&#xff0c;默认显示“Generate Signed APK”提示信息&#xff0c;如下图所示&#xff1a; 如果在打包时不显示“Generate Signed APK”提示信息&#xff0c;解决办法是&#xff1a; Android Studio菜单栏&#xff0c;“File->Settings->Appearan…

【Go】-gRPC入门

目录 什么是gRPC 从Hello开始的简单使用 proto server端 client端 Proto的语法介绍 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 保留标识符&#xff08;Reserved&#xff09; 从.proto文件生成了什么&#xff1f; 标量数值类型 默…

后端SpringBoot学习项目-用户管理-增删改查

最终代码结构 仓库地址 Entity文件 数据库表设计 entity层实现 文件创建 ● 创建entity文件夹 ● 在entity层创建Java类&#xff0c;名字为User (关键字不可使用) 代码实现 package com.example.drhtspringboot.entity;import com.baomidou.mybatisplus.annotation.IdT…

网络管理之---3种网络模式配置

目标&#xff1a; 了解几个概念&#xff1a; 1.什么是IP&#xff1f;什么是IP地址&#xff1f; 2.什么是桥接、NAT、仅主机模式 3.端口&#xff1f; 4.什么是网络接口命名规则 5.网络管理器 IP&#xff1a;指网络之间互联的协议&#xff0c;是TCP/IP 体系中的网络协议 I…

uniapp解析蓝牙设备响应数据bug

本文章为了解决《uniapp 与蓝牙设备收发指令详细步骤(完整项目版)》中第十步的Array 解析成 number函数bug 1、原代码说明 function array16_to_number(arrayValue) {const newArray arrayValue.filter(item > String(item) ! 00 || String(item) ! 0)const _number16 ne…

【测试框架篇】单元测试框架pytest(3):用例执行参数详解

一、前言 上一篇内容介绍了用例编写的规则以及执行用例&#xff0c;执行用例时我们发现有些print输出内容&#xff0c;结果没有给我们展示&#xff0c;这是因为什么原因呢&#xff1f;接下来我们会针对这些问题进行阐述。 二、参数大全 我们可以在cmd中通过输入 pytest -h 或…

再见 阿里巴巴EasyExcel替代品EasyExcel-Plus即将诞生

最近阿里发布公告通知&#xff0c;停止对EasyExcel 更新和维护&#xff0c;EasyExcel 是一款知名的 Java Excel 工具库&#xff0c;由阿里巴巴开源&#xff0c;作者是玉霄&#xff0c;在 GitHub 上有 30k stars、7.5k forks。 据了解&#xff0c;EasyExcel作者玉霄)去年已经从…

VBA08-if语句

一、单行 If 语句 If x > 10 Then MsgBox "x is greater than 10"二、多行 If...Then...End If 语句 If x > 10 ThenMsgBox "x is greater than 10"y x 5 End If 三、If...Then...Else 语句 If condition Then 当条件为真时执行的代码块stateme…