网络层详解

目录

前言

一、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技术,暂不介绍;

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

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

相关文章

C2855 命令行选项“/Zc:referenceBinding“与预编译头不一致和C2855 命令行选项“/Zc:__cplusplus“与预编译头不一致

在VS2019和Qt5.12.12环境下,笔记本上编译这个工程没有问题,把工程拷贝到台式机上,一样的配置,但是报如下错误: 打开项目的命令行配置如下: 解决办法:在编译选项"/Zc:referenceBinding"…

Ubuntu server搭建dhcp服务器

安装 直接使用一下命令进行安装 apt-get install isc-dhcp-server 以下就是安装好的图片 然后进入dhcp目录 cd /etc/dhcp 进入后用ls查看当前目录存在哪些文件 使用如下进入dhcp.conf vim dhcpd.conf 红:设置ip域和子网掩码 绿:设置ip池范围 黄…

永磁同步电机的磁场定向控制

目录 概述 通过系统仿真验证行为 探索模型架构 生成用于集成到嵌入式应用程序的控制器 C 代码 指定控制器模型的参考行为 创建 PIL 实现 准备用于 PIL 测试的控制器模型 测试生成的代码的行为和执行时间 结论 此示例说明从电机控制算法生成 C 代码并验证其编译行为和执…

【java八股文】之Java基础篇

1、Java有哪几种数据类型 基本数据类型:byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节) char(2字节&a…

BP神经网络(公式推导+举例应用)

文章目录 引言M-P神经元模型激活函数多层前馈神经网络误差逆传播算法缓解过拟合化结论实验分析 引言 人工神经网络(Artificial Neural Networks,ANNs)作为一种模拟生物神经系统的计算模型,在模式识别、数据挖掘、图像处理等领域取…

基于Flask的高并发部署方案

文章目录 Flask方案简介服务端代码客户端代码 Gevent Flask方案简介安装示例 gunicornFlask 部署服务简介安装示例 在AI部署方案中,Flask是最常用的方案!本文列举几种最常用基于Flask的部署方案。 Flask方案 简介 Flask 是一个轻量级的 Python Web 框架…

Python Pandas 中的 shift() 函数,实现数据平移的完美利器!

更多Python学习内容:ipengtao.com shift() 是 Pandas 中一个常用的数据处理函数,它用于对数据进行移动或偏移操作,常用于时间序列数据或需要计算前后差值的情况。本文将详细介绍 shift() 函数的用法,包括语法、参数、示例以及常见…

【算法】最佳牛围栏(二分,前缀和,双指针)

题目 农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。 围起区域内…

【Android开发】不同Activity之间的数据回传实例(二)星座测算游戏

一、功能介绍 该项目实现的功能主要有: 在程序的首页界面可以输入用户的姓名,并且可以通过下方的日历栏选择自己的出生日期。输入完成后,点击星座测算按钮,则程序跳转到星座分析界面。在该界面上显示用户的个人信息,…

HarmonyOS 开发基础(八)Row和Column

HarmonyOS 开发基础(八)Row和Column 一、Column 容器 1、容器说明: 纵向容器主轴方向:从上到下纵向交叉轴方向:从左到右横向 2、容器属性: justifyContent:设置子元素在主轴方向的对齐格式…

货拉拉智能监控实践:如何解决多云架构下的故障应急问题?

一分钟精华速览 在月活超千万的大规模业务背景下,货拉拉遭遇了多云环境下的监控碎片化、规划无序等问题。为了应对这些挑战,货拉拉开发了一站式监控平台——Monitor。该平台的部署有效地实现了对核心应用的监控和报警全覆盖,显著提高了应急响…

写点东西《Docker入门(上)》

写点东西《Docker入门(上)》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络: Docker 存储: Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…