网络层 IP协议【计算机网络】【协议格式 || 分片 || 网段划分 || 子网掩码】
博客主页:花果山~程序猿-CSDN博客
文章分栏:Linux_花果山~程序猿的博客-CSDN博客
关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!
目录
一,前提
二,IP协议格式
三,IP数据包分片
三,网段划分
1.子网掩码
网段的理解
例子
2. NAT技术
私有IP与公有IP
NAT工作原理示例
私有ip访问外部网站(内部到外部)
外部网站响应(外部到内部)
3. 路由
嗨!收到一张超美的图,愿你每天都能顺心!
一,前提
在学习网络层之前,我们可以回顾一下上一层——传输层,这里以TCP协议为例,TCP业绩叫传输控制协议,需要保证报文传递的可靠性,将应用层下达的数据进行拆分,形成一个个TCP段(通过序列号保证可靠传输和有序接收,通过确认,检测,重传等机制),然后再向网络层进行交付,而在接收机器上传输层等待下层向上交付,这个中间的过程传输层则不关心。
传输层保证的是数据的可靠性,以及数据丢失重传等策略,网络层功能又什么? (为了避免误导,这里用AI回答)
网络层,主要职责是负责数据包在网络中的传输和路由选择,它是实现不同网络之间互联的基础。
二,IP协议格式
属性讲解
三,IP数据包分片
第二层属性比较特殊,在了解这些之前,我们首先理解一下分片概念。
我们知道一个IP数据包支持6.5w字节,这里提前透露数据链路层的知识,数据链路层每次传输字节数是有限制的,假设只支持1500字节,那么IP数据包就需要分片,同时需要多次传递。(对于分片的策略有这个功能,但并不推荐,原因可以查查资料)
进行分片后就容易出现问题,如下面问题:
1. 在接收方网络层进行组装时,如何保证数据片的是同一份IP报文,顺序,以及完整性?
首先我们先认识一下这三个属性信息:
- 16位标识(id): 标识唯一主机发送的报文。如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的。——保证分片为同一份IP数据包
- 13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。
- 3位标志字段:
- 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。
- 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文.
- 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0。类似于一个结束标记。
三,网段划分
我们知道IPv4最大可以容纳42亿台主机,同时我们知道IPv4也即将面临地址不够用的情况,面对不够用的情况,人们想出了子网掩码,私有IP&公网IP的方式来缓解IP地址的枯竭。
首先我们得有一个全球的视角,IP地址有32位,每个国家也都需要IP地址资源,从左侧开始(255.255.255.255),假设美国拿1开头的IP,中国拿2开头的IP资源,国家以这样的方式来划分IP资源,然后在国内再进行划分(以中国为例),河北省拿21...开头的ip,河南拿22...开头的ip,通过这样的方式将IP地址划分,知道单个主机,这样就会形成两个部分,也就是要说的 IP 地址有两个部分:网络号 + 主机号
网络号 : 保证相互连接的两个网段具有不同的标识 ;主机号 : 同一网段内 , 主机之间具有相同的网络号 , 但是必须有不同的主机号 ;关于网段定义,我们后面聊完私有IP,公网IP后说。
- 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
- 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.
在曾经也有一些如何设置主机号和网络号方案,如下:
但这方案的弊端也很明显,大部分的企业或者组织更愿意选择B类的方案,导致B类方案地址缺乏,更重要的是并不是所有企业分配到的IP地址都能被使用,因此缺少一种动态分配网络号与主机号的占比的方案,称为CIDR(Classless Interdomain Routing),由此子网掩码出现。
1.子网掩码
网段的理解
这些IP地址共享相同的网络部分,意味着它们位于同一个逻辑网络或者可以无需通过路由器直接相互通信的网络部分。
更具体地说,当一个大的IP地址空间被划分为若干小的、可管理的部分时,每一个这样的部分就称为一个网段。这个划分过程通常是通过应用一个子网掩码来实现的,子网掩码决定哪些位表示网络部分,哪些位表示主机部分。
例子
假设我们有一个IP地址 192.168.1.10
和子网掩码 255.255.255.0
。
- IP地址
192.168.1.10
转换为二进制是11000000.10101000.00000001.00001010
- 子网掩码
255.255.255.0
转换为二进制是11111111.11111111.11111111.00000000
通过与运算,我们可以确定网络部分:
11000000.10101000.00000001.00000000
(即192.168.1.0
)
所以,网段指的是所有具有相同前三部分(网络部分)的IP地址集合,也就是所有形如 192.168.1.x
的地址(其中x代表可能的主机号部分,范围通常是1到254)。在这个例子中,192.168.1.0
到 192.168.1.255
就构成了一个网段,所有这些地址都在同一个逻辑网络中,理论上可以直接互相通信,不需要路由器来进行跨网段的路由。
可IPv4的地址仍旧不够用,CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然
- 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;(上限没有提高,只是提高了利用率)
- IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及(有一部分原因是NAT技术大大缓解了IPv4的地址缺失);
- NAT技术(后面会重点介绍);
2. NAT技术
NAT(Network Address Translation,网络地址转换)技术通过允许一个私有网络内的多个设备共享一个或少数几个公有IP地址访问互联网,从而有效缓解了IPv4地址的紧缺问题。这里通过一个简化例子来说明NAT的工作原理:
私有IP与公有IP
首先,了解一下概念:
- 私有IP地址(局域网):这些地址在RFC 1918中定义,用于内部网络,不能直接在互联网上路由。常见的私有IP地址段包括:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。
- 公有IP地址(全球级的广域网):全球唯一的IP地址,可以直接在互联网上路由,但数量有限(多为一些大型跨国企业)。
NAT工作原理示例
假设有一个小型企业网络,内部有三台电脑,它们的私有IP地址分别为:
- 电脑A: 192.168.1.10
- 电脑B: 192.168.1.11
- 电脑C: 192.168.1.12
这个企业只有一个公有IP地址,例如:203.0.113.42,由路由器管理并用于外部通信。
私有ip访问外部网站(内部到外部)
- 电脑A请求访问互联网:电脑A想要访问一个外部网站,它发送的数据包源IP是其私有IP(192.168.1.10)。
- 路由器进行NAT转换:路由器接收到这个数据包后,使用NAPT(Network Address Port Translation,网络地址端口转换)技术,将数据包的源IP地址替换为公有IP地址(203.0.113.42),同时记录下这个转换关系(源私有IP、源端口到公有IP、新的端口号)。
- 数据包转发:修改后的数据包,现在拥有公有IP地址和一个新的端口号,被路由器转发到互联网上。(这里我们可以联想在学习mysql时,云服务器向公网开放时,要选择接收任一源IP的请求连接,你不会知道那个路由器会为你转发)
外部网站响应(外部到内部)
- 外部响应:当外部服务器响应时,它将数据包发送到公有IP地址(203.0.113.42)和之前路由器分配的新端口号。
- 路由器转换回私有IP:路由器根据之前的转换记录,识别出这个数据包是给电脑A的,然后将目标IP地址和端口号转换回电脑A的私有IP地址(192.168.1.10)和原来的端口号,再将数据包转发给电脑A。
通过这种方式,NAT技术使得企业网络内的多台设备可以共享同一个公有IP地址访问互联网,极大地节省了公有IP地址的消耗,缓解了IPv4地址的紧缺问题。同时,由于私有IP地址对互联网是隐藏的,这也增加了网络的安全性。
3. 路由

本质上是数据结构上图论部分,感谢兴趣的可以订阅我的高阶数据结构专栏,这里就了解一下。
高阶数据结构_花果山~程序猿的博客-CSDN博客
结语
本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获,请动动你发财的小手点个免费的赞,你的点赞和关注永远是博主创作的动力源泉。
相关文章:

网络层 IP协议【计算机网络】【协议格式 || 分片 || 网段划分 || 子网掩码】
博客主页:花果山~程序猿-CSDN博客 文章分栏:Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一,前提 二&…...

Python学习笔记14:进阶篇(三)。类的终结篇,类的导入和模块的导入。
前言 这篇文章属于类知识的最后一篇,带一点点其他知识,学习内容来自于Python crash course。 关注我私信发送Python crash course,分享一份中文版PDF。 类的导入 在学习的时候,包括之前,我都是在一个文件中把所有代…...
C++ lambda表达式举例
C lambda表达式 Lambda表达式是一种简洁的方式来创建匿名函数,可以直接在函数调用的地方定义,主要用于简化代码。 Lambda表达式的基本语法如下: [capture](parameters) -> return_type {// function body };示例1:基本用法 …...
持续总结中!2024年面试必问 20 道设计模式面试题(五)
上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(四)-CSDN博客 九、请解释代理模式(Proxy Pattern)及其类型。 代理模式(Proxy Pattern)是一种结构设计模式,…...

嵌入式面经111题答案汇总(含技术答疑)_嵌入式项目源码分享
111道嵌入式面试题答案汇总专栏链接(承诺免费技术答疑) --> 《嵌入式/C面试题解析大全》 1、简介 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业工作经验,整理超全面111道嵌入式面试…...

鸿蒙开发通信与连接:【@ohos.connectedTag (有源标签)】
有源标签 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import connectedTag from ohos.connectedTag;connectedTag.init init(): boolean 初始化有源标签芯片。 需要权限&#…...
在线编程工具
1.C语言在线编程 https://www.jyshare.com/compile/11/ 2.java在线编程 https://www.w3cschool.cn/tryrun/runcode1?langjava 3.Python在线编程 https://www.python123.io/index/playground/python?ivk_sa1024320u...

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点
目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码!启动! [LitCTF 2023]Flag点击就送! 相关知识点 1.intval 绕过 绕过的方式: 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息,所以想到使用dis…...

Vue49-props属性
一、当同一个组件标签被使用多次 因为data属性写的是函数形式! 二、需求:老王也想用<Student>组件,但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性,接收的这三个参数,是被保存在…...

CVE-2020-1957 漏洞复现
先声明一下,免杀还是会更的,不过中间可能会穿插一下渗透的内容!!! 踩坑点: 在一开始翻阅了CSDN之后,发现不同文章之间存在出入,于是最后去了CVE的官方文档,和参考一些国…...

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w
01 中国电信股份有限公司浙江分公司 🔷招聘岗位:系统架构师 🔷岗位职责: 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护,做好相关产数项目的支撑。 2、根据信息安全管理要求,负责客户…...

LLVM后端 td文件 tablegen 模式匹配 寄存器 指令集 calling convention
目录 一、寄存器 1.1 寄存器定义 1.2 寄存器分类 二、指令集 2.1 指令集定义 2.2 模式匹配 2.2.1 PatFrags与PatFrag 2.2.2 OutPatFrag 2.2.3 PatLeaf 2.2.4 ImmLeaf 2.2.5 IntImmLeaf和FPImmLeaf 2.2.6 Pat 2.2.7 ComplexPattern 2.3 指令合法化 2.3.1 Promote…...
嵌入式交叉编译:frp
参考 LINUX FRP下载编译_linux编译frpc-CSDN博客 编译 make -f Makefile.cross-compiles 检查 $ make -f Makefile.cross-compiles Build darwin-amd64... Build darwin-amd64 done Build darwin-arm64... Build darwin-arm64 done Build freebsd-amd64... Build freebsd-…...

SpringBoot实现的大文件上传
前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题,以提高文件传输的效率和稳定性。 首先,大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间,因为较小的文件片段更容易快…...
【Python高级编程】用 Matplotlib 绘制迷人的图表
用 Matplotlib 绘制迷人的图表 引言 Matplotlib 是 Python 中广泛使用的绘图库,用于创建各种图表和可视化。本文将逐步指导您使用 Matplotlib 绘制基本图表,包括折线图、条形图和散点图。 安装 Matplotlib 使用 pip 安装 Matplotlib: pi…...

【UML用户指南】-19-对基本行为建模-用例图
目录 1、组成结构 2、表示法 3、一般用法 3.1、对主题的语境建模 3.2、对主题的需求建模 4、常用建模技术 4.1、对系统的语境建模 4.1.1、设计过程 4.2、对系统的需求建模 4.2.1、设计过程: 5、正向工程 UML 中的用例图是对系统的动态方面建模的 5 种图之…...

mysql密码过期的修改(Your password has expired. ..)
参考文章:mysql密码过期的修改方法(your password has expired)_我是知青-RuoYi 若依 (csdn.net) 问题:Your password has expired. To log inyou must change it using a clientthat supports expired passwords. 解决方式&…...

vivado SLR
描述 超级逻辑区(SLR)是包含在堆叠硅中的单个FPGA芯片 互连(SSI)设备。堆叠式硅互连(SSI)技术使用无源硅 具有微凸块和硅通孔(TSV)的内插器,用于组合多个FPGA管芯 切片&a…...
【CSS】深入了解圆角属性border-radius
border-radius 是 CSS 中的一个非常有用的属性,它允许你创建具有圆角边框的元素。这个属性可以应用于一个元素的四个角,或者分别应用于每个角。下面我们将深入了解 border-radius 的使用方法和一些高级技巧。 基本用法 你可以通过为 border-radius 指定…...

LabVIEW与C#的区别及重新开发自动测试程序的可行性分析
LabVIEW和C#是两种广泛使用的编程语言,各自有不同的应用领域和特点。本文将详细比较LabVIEW与C#在自动测试程序开发中的区别,并分析将已完成的LabVIEW自动测试程序重新用C#开发的合理性。本文帮助评估这种转换的必要性和潜在影响。 LabVIEW与C#的区别 开…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...