网络层详解

目录

前言

一、IP协议

1、IP协议报头

2、协议字段理解

(1)4位版本

(2)4位首部长度

(3)8位服务类型

(4)16位总长度

(5)标识、标志与片偏移

(6)8位生存时间

(7)8位协议

(8)16位首部校验和

(9)源IP地址与目的IP地址

(10)选项

3、如何封装与解包

4、如何向上交付

5、IP分片

(1)16位标识

(2)3位标志

(3)13位片偏移

(4)疑惑解答

二、网段划分

1、网络号与主机号

2、IP地址分类

3、CIDR技术

4、特殊的IP地址

5、子网划分

6、私有IP地址与公网IP地址


前言

        前面我们介绍了应用层与传输层相关协议,本文主要讲解网络层相关概念与网络层相关协议;

一、IP协议

        网络层主要的协议就是IP协议,我们经常听说的TCP/IP协议簇中便包含该协议;IP协议也是网络层中最主要的协议;

1、IP协议报头

        IP协议报头如下图所示;

2、协议字段理解

(1)4位版本

        该字段主要标识IP协议版本,一般为IPV4,因为IPV6与IPV4并不兼容,该字段可不深究,理解即可;

(2)4位首部长度

        该字段来标识IP报文首部的长度,与TCP协议中的首部长度一样,该字段的单位为4字节,由于IP报文的大小最小为20字节,因此该字段最小值应该为20 / 4 = 5,用二进制来表示就是0101;最大值应该就是60字节了;

(3)8位服务类型

        该字段也只需了解即可,该字段最高3位已经弃用,而接下来4位TOS字段,分别用来标识最小延迟,最大吞吐量,最高可靠性,最小成本;这四者互相冲突,只能选择一个;最后一位为保留位,设置为0即可;

(4)16位总长度

        该字段来表示整个IP报文的长度(包括数据部分),单位是字节,注意,这里与首部长度的不同,首部长度的单位为4字节,这里的单位为字节;

(5)标识、标志与片偏移

        这三个字段为设置IP分片所需字段,具体文章后面会专门讲解;

(6)8位生存时间

        该字段用来表示我们发送的报文在网络上最长的生存时间;该字段最开始的单位为秒,后来被改为了跳数;那么我们会有如下问题;

为什么会有生存时间呢?没有不可以吗?

        当然不可以,实际上,我们的网络上的情况非常复杂,有可能会出现路由环绕等问题,就是在转发IP报文过程中出现路由回路,若没有没有生存时间将会不断的重复转发,这种转发当然会消耗网络资源的,为了避免这种情况IP报文设置了生存时间;

        刚开始时,生存时间的单位为秒,后来随着互联网硬件的发展,路由转发的速度也越来越快,我们发现设置成秒并不合适,因此我们转发一个路由可能仅仅只需要us甚至ns级别,这时我们设置成秒明显就不合适了,因此这个参数也就被改为了跳数,所谓跳数就是经过中间路由次数,没经过一个路由,跳数加一;

(7)8位协议

        这里的8位协议也就是网络层应该向上层中的哪一个协议交付,可能上层位TCP协议,也可能位UDP协议等等,我们要讲IP报文解用后的数据交给上层的指定层;

(8)16位首部校验和

        该字段用于检测我们在进行数据传输中IP首部中的某个数据是否发生错误,用于检测IP首部的正确性;这里可能有小伙伴会有疑惑了,那数据部分不需要进行检测吗?这其实在传输层中,我们讲TCP、UDP协议中就介绍了,这里我们要清楚的是在IP协议中,IP报文中的数据部分就是一个完整的TCP报文或UDP报文等,而在传输层中的这些协议都有差错校验,这个差错校验会讲数据部分进行差错校验,因此在IP报文中的差错校验只需检验首部是否正确即可;

(9)源IP地址与目的IP地址

        源IP地址用于告诉接收端发送端的IP地址是什么?因为在网络通信过程中,往往是双向的,我们要给对端发送数据,对端也要跟我们发送数据,而目的IP是在路由转发过程中告诉中间路由我们要去的IP地址是哪个,用于定位对端主机;

(10)选项

        这个选项是附加字段,我们可加一些特殊功能,对IP协议进行拓展,这里我们仅需了解即可;

3、如何封装与解包

        学习了上面字段,这个问题对我们来说并没有多大难度,我们可以通过字段中的16位总长度 - 4 * 4位首部长度,这样就可以得到我们的有效载荷,封装就是给报文添加报头即可;

4、如何向上交付

        通过8位协议字段我们得到应该交付给上层哪个协议,我们解包后就可以直接交付了;

5、IP分片

        首先我们在了解IP分片之间我们得直到什么是IP分片,所谓IP分片就是将我们的IP报文通过分片技术将IP报文分成一片一片后再发送;

        为什么要进行IP分片呢?一整个IP报文一起发送出去不可以吗?

这里我们需要直到我们IP层的下层,也就是数据链路层,有一个规定,上层交付给我的数据不可以超过MTU,这里MTU也就是 Maximum Transmission Unit,一般为1500字节;因此若传输层给我们网络层交付的数据过大,我们需要进行分片操作;

(1)16位标识

        在分片技术中,该字段用于标识IP报文的序号,若为同一个分片,16位标识相同;

(2)3位标志

        该字段最低为记为 MF(More Fragment),若为0,要么表示该IP报文没有分片,要么表示该IP报文是IP分片后的最后一个IP分片报文;若为1,表示后面还有分片,这时该分片即可能为第一个分片,也可能为最后一个分片;

        次高位记为 DF(Don't Fragment),表示不能分片,若为1表示该IP报文不允许进行分片,若为0时则表示可以分片;

那么要是上层传输层给我们交付的数据大于MTU,而IP报文中的标识被置为1时,那该怎么办呢?

        此时,我们不用考虑别的,直接丢弃该报文即可!

(3)13位片偏移

        该字段为分片后,该分片的起始地址在原分片中的位置;注意,片偏移是以8字节为单位的!

(4)疑惑解答

如何区分是否分片,或是该分片是分片中的哪一块?

没有分片:MF=0,片偏移=0;

分片第一块:MF=1,片偏移=0;

中间分片:MF=1,片偏移>0;

最后一块分片:MF=0,片偏移>0;

中间分片有这么多块,我们怎么知道它们是否收齐?如何组装?

        我们通过16位标识找到所有属于一个IP数据报的分片,我们可以通过上述规则找到第一片与最后一片,我们接着我们可以通过第一片的总长度找到第二片片偏移的字段应该是多少,从而找到第二片,同时也可以用这个方法找到第三片,第四片等等;最终找齐所有分片,找到所有分片不就可以将其组装起来,然后向上交付吗?

我们是否推荐分片?为什么?

        实际上,我们并不推荐分片这种做法,因为我们思考一下,我们将一个IP报文分成多个IP报文然后发送出去,那么若我们丢掉其中一个IP报文,此时完整的IP报文都不可能被我们完整组装起来,此时我们就要将该IP报文丢弃,视作丢包,等待对端重传,这时效率就低很多了,因此一个报文丢失概率与若干个报文其中一个报文丢失的概率想比,低了很多,因此我们不建议进行分片;

二、网段划分

1、网络号与主机号

网络号:保证相互连接的两个网段具有不同的标识;

主机号:同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

注意:通常在同一个网段内的主机可以直接通信,具体原理为局域网通信原理;这里记住即可;

        上述中 /24表示该IP地址中,前24个比特位表示网络号,后面8个比特位表示主机号,也就是192.168.128表示网络号,10表示主机号;

2、IP地址分类

        早期是IP地址被划分位如下几类;

        可是如此划分,很快问题就暴露出来了,我们不难看出,A类地址的可分配的主机数地址为2^24,可一般来说很少有子网可以有这么多主机,B类地址有2^16台主机地址,C类有2^8台主机地址,很多公司都申请B类地址,很快B类地址就被用完了,而申请A类的地址,实际上用不上这么多主机,都浪费了,随着互联网发展,这种情况是IP地址越来越不够用了;因此我们后面便未使用这种方法对IP进行分类,而是采用下面的方法;

3、CIDR技术

        所谓CIDR即是 Classless Interdomain Routing,就是通过引入一个网络掩码来区分网络号与主机号;子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;

例如,一个网路的IP地址为192.168.128.10,子网掩码为255.255.255.0;

        此时我们的网络号就是这两个IP地址按位与的结果,也就是192.168.128.0/24;

4、特殊的IP地址

  • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;

  • 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
  • 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

5、子网划分

        我们的网络是如何进行划分的呢?接下来我将带着大家一起进行一次网络划分,下面所有的划分为小编自己划分,并不为真实划分,小编只是模拟划分来带着大家一起理解子网划分的概念;

        我们假如用IP地址最高八位,来对国家进行划分,如下所示;

        上述图中,我们只划分了5个国家的IP地址,其中每个国家都有一个国家路由器,也就是该路由器能识别别的国家路由IP地址,也就是如下图所示;

        每个国家可能有多个不同地区划分,我们以中国为例,中国有34个省,我们可以用6个比特位表示这些省份,如下图所示;

        我们还可以将上述网络继续划分到每个市,甚至每个县,很显然,我们会发现这样我们的IP地址是非常不够用的,因此有了后面的NAT技术

6、私有IP地址与公网IP地址

        由于IP地址数量的不够,因此诞生了公网IP与私网IP的概念;我们规定以下地址为私网IP地址;

  • 10.*,前8位是网络号,共16,777,216个地址
  • 172.16.到172.31.,前12位是网络号,共1,048,576个地址
  • 192.168.*,前16位是网络号,共65,536个地址

其余均为公网IP地址;私网IP地址就是为了解决公网IP数量严重不足的问题,具体就是使用NAT技术,暂不介绍;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#系列-手把手教你快速了解.NET Framework

.NET Framework .NET Framework是什么.NET Framework构成部分公共语言运行库(CLR)框架类库(FCL)核心语言(WinForms、ASP.NET 和 ADO.NET)其他模块(WCF、WPF、WF、Card Space、LINQ、Entity Fram…

四、C++内存管理

1 C/C内存分布 在学习C的内存管理方式之前&#xff0c;我们先来看一道有关C/C内存分布的题目&#xff1a; 阅读下面的代码&#xff0c;回答相关问题&#xff1a; #include <iostream> using namespace std; int globalVar 1; static int staticGlobalVar 1; int main…

EOCR电机保护器485通讯协议概念

Modbus是由Modicon&#xff08;现为施耐德电气公司的一个品牌&#xff09;在1979年发明的&#xff0c;是全球第一个真正用于工业现场的总线协议。为更好地普及和推动Modbus在基于以太网上的分布式应用&#xff0c;目前施耐德公司已将Modbus协议的所有权移交给IDA&#xff08;In…

性能测试分析案例-定位内核线程CPU利用率太高

环境准备 预先安装 docker、perf、hping3、curl 等工具&#xff0c;如 apt install docker.io linux-tools-common hping3 操作和分析 Linux 在启动过程中&#xff0c;有三个特殊的进程&#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程&#xff0c;这也是系…

2024年五款值得买的云服务器推荐,便宜又好用

作为多年站长使市面上大多数的云厂商的云服务器都使用过&#xff0c;很多特价云服务器都是新用户专享的&#xff0c;本文有老用户特价云服务器&#xff0c;阿腾云atengyun.com有多个网站、小程序等&#xff0c;国内头部云厂商阿里云、腾讯云、华为云、UCloud、京东云都有用过&a…

WPF真入门教程27--项目案例--设备数据实时监测

1、上图看效果 今天要做的一个案例是这样的效果&#xff0c;它能实时监测车间设备有关数据&#xff0c;并以表格和图形显示在界面上&#xff0c;这个比上个案例要复杂些&#xff0c;颜值也高些&#xff0c;通过这个来巩固wpf的技能&#xff0c;用到了命令绑定&#xff0c;样式…

探索PyTorch优化和剪枝技术相关的api函数

torch.nn子模块Utilities解析 clip_grad_norm_ torch.nn.utils.clip_grad_norm_ 是 PyTorch 深度学习框架中的一个函数&#xff0c;它主要用于控制神经网络训练过程中的梯度爆炸问题。这个函数通过裁剪梯度的范数来防止梯度过大&#xff0c;有助于稳定训练过程。 用途 防止…

用三层交换机连接不同的网络—SVI(VLAN,trunk)

1.为什么要使用SVI技术&#xff1a; 如图&#xff0c;举个栗子&#xff1a;我们把网络A和网络B具体化一些&#xff0c;假设网络A为销售部&#xff0c;网络B为研发部。随着销售部的人员不断的增加&#xff0c;销售部网络的交换机端口已经被占完&#xff0c;那么销售部新来的员工…

【qt】sdk写pro写法,cv,onnx,cudnn

我的sdk在OpenCV003项目里&#xff1a; pro中添加 CONFIG(release, debug|release) {LIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntimeLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lonnxruntime_providers_cudaLIBS -L$$PWD/sdk/onnxruntime-x64-gpu/lib/ -lon…

家政服务管理平台

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1选题的背景 现…

怎么做微信秒活动_掀起购物狂潮,引爆品牌影响力

微信秒杀活动&#xff1a;掀起购物狂潮&#xff0c;引爆品牌影响力 在数字化时代&#xff0c;微信已经成为人们日常生活中不可或缺的一部分。作为中国最大的社交媒体平台&#xff0c;微信不仅为人们提供了便捷的通讯方式&#xff0c;还为商家提供了一个广阔的营销舞台。其中&a…

为什么选择CRM系统时,在线演示很重要?

想要知道一款CRM管理系统是否满足企业的需求&#xff0c;操作是否简单&#xff0c;运行是否流畅&#xff0c;最直观的方式就是远程演示。否则&#xff0c;光凭厂商的销售人员介绍一下产品&#xff0c;企业就盲目下单&#xff0c;最后发现功能不匹配&#xff0c;还要赔钱赔时间重…

【笔记------freemodbus】一、stm32的裸机modbus-RTU从机移植(HAL库)

freemodbus的官方介绍和下载入口&#xff0c;官方仓库链接&#xff1a;https://github.com/cwalter-at/freemodbus modbus自己实现的话往往是有选择的支持几条指令&#xff0c;像断帧和异常处理可能是完全不处理的&#xff0c;用freemodbus实现的话要简单很多&#xff0c;可移植…

Elasticsearch基础篇(七):分片大小修改和路由分配规则

Elasticsearch基础篇(七)&#xff1a;分片大小修改和路由分配规则1. 分片1.1 主分片&#xff08;Primary Shard&#xff09;1.2 副本分片&#xff08;Replica Shard&#xff09;1.3 分片路由&#xff08;Routing Shard&#xff09; 2. 分片分配的基本策略3. 分片写入验证3.1 数…

AI RAG应用的多种文档分块代码

在开发 RAG 应用程序时,重要的是要有一个完善的文档分块模式来攫取内容。虽然有很多库可以实现这一目标,但重要的是要了解这一过程的基本机制,因为它是 AI RAG 应用程序的基石。 欢迎关注公众号(NLP Research) 测试文档 在测试文档中,我们将使用亚马逊文档中的大型 PDF…

C#使用CryptoStream类加密和解密字符串

目录 一、CrytoStream的加密方法 二、CrytoStream的解密方法 三、实例 1.源码Form1.cs 2.类库Encrypt.cs 3.生成效果 在使用CryptoStream前要先引用命名空间using System.Security.Cryptography。 一、CrytoStream的加密方法 记住&#xff0c;不能再使用DESCryptoServi…

谷粒学院项目redirect_uri 参数错误微信二维码登录

谷粒学院项目redirect_uri 参数错误_redirect_uri": "http%3a%2f%2fguli.shop%2fapi%2fuce-CSDN博客 修改本地配置 # &#xfffd;&#xfffd;&#xfffd;&#xfffd;˿&#xfffd; server.port8160 # &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#x…

我的隐私计算学习——联邦学习(3)

本篇笔记主要是根据这位老师的知识分享整理而成【公众号&#xff1a;秃顶的码农】&#xff0c;我从他的资料里学到了很多&#xff0c;期间还私信询问了一些困惑&#xff0c;都得到了老师详细的答复&#xff0c;相当nice&#xff01; &#xff08;五&#xff09;纵向联邦学习 —…

网络多线程开发小项目--QQ登陆聊天功能(发文件)

9.1.5、QQ登陆聊天功能&#xff08;发文件&#xff09; 1、需求分析 2、思路分析 3、代码实现 Common: 1) cn.com.agree.qqcommon.MessageType String MESSAGE_FILE_MESSAGE"8";//文件消息2) cn.com.agree.qqcommon.Message private byte[] fileBytes ;private i…

八、Stm32学习-USART-中断与接收数据包

1.通信接口 全双工就是数据的收和发可以同时进行&#xff1b;半双工就是数据的收和发不能同时进行。 异步时钟是设备双方需要约定对应的波特率&#xff1b;同步时钟是设备双方有一根时钟线&#xff0c;发送或接收数据是根据这根时钟线来的。 单端电平是需要共GND&#xff1b;…