网络层协议——IP协议

目录

一、IP协议

二、IP协议格式

三、网段划分

四、私网IP地址和公网IP地址

五、路由


一、IP协议

IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。

IP协议主要作用是提供一种能力,将数据从A主机传送到B主机的能力。

比如上图,数据需要从主机B到主机C。那么数据首先要从主机B到路由器F,再到路由器G等等,这样一步一步才能最终到达主机C的。而IP协议的用处就是解决数据怎么在网络中,通过路径选择,从一个主机到达目的主机的。 

二、IP协议格式

IP协议如何进行报头和有效载荷的分离(如何解包)?

首先,我们要知道,IP协议的报头是可以携带选项的,所以选项也属于报头的一部分。IP协议采用定长报头的方式,即选项之上的部分大小为固定的20字节。我们在读取了选项之上的部分后,可以拿到4位首部长度,再乘以4它就是报头的总大小,用其减去20字节,就是选项大小。然后就可以读取完成选项。拿到16位总长度减去4位首部长度就是有效载荷了。

注:4位首部长度的单位是4字节。(和TCP一样)

IP协议如何向上进行交付?

由于传输层协议不止一种,因此当IP从底层获取到一个报文并对其进行解包后,IP需要知道应该将分离后得到的有效载荷交付给上层的哪一个协议。 

8位协议:用来标识是TCP还是UDP。通过该字段,就可以知道向上交付时,交付给TCP协议还是UDP协议。

该字段是发送方的IP层从上层传输层获取到数据后填充的,比如是上层TCP交给IP层的数据,那么该数据在封装IP报头时的8位协议填充的就是TCP对应的编号。

其他字段

4位版本:指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。

16位总长度:IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。 

8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示,最小延时,最大吞吐量,最高可靠性,最小成本。

16位首部校验和:使用CRC进行校验, 来鉴别头部是否损坏。

32位源IP地址:表示发送端所对应的IP地址。

32位目的IP地址:表示接收端所对应的IP地址。

8位生存时间:数据报到达目的地的最大报文跳数,一般是64,每经过一个路由器的转发,TTL -= 1,一直减到0还没到达,那么就丢弃报文,这个字段主要是用来防止出现路由循环。

报文在网络传输过程中,可能因为某些原因导致报文无法到达目标主机,比如报文在路由时出现了环路路由的情况,或者目标主机已经异常离线了,此时这个报文就成了一个废弃的游离报文。

为了避免网络当中出现大量的游离报文,于是在IP的报头当中就出现了一个字段,叫做8位生存时间。每当报文经过一次路由,这里的生存时间就会减一,当生存时间减为0时该报文就会被自动丢弃,此时这个报文就会在网络中消散。

分片和组装(16位标识,3位标志,13位片偏移)

经过网络层的封装,数据最终会交付给下层的数据链路层。由数据链路层进行网络上的转发。可是,数据链路层由于物理特征的原因,一般无法转发太大的数据,即数据链路层一次可以转发到网络的报文大小是有限制的(一般为1500,MTU,最大传输单元)。

所以,为了保证数据能够正常在网络中传输,我们就有必要将大小超过MTU的报文进行分片,将其分成一个一个的大小不超过MTU的数据,进行发送。而这个操作是由网络层IP协议完成的。既然能够分片,未来一定需要将分片组装起来,形成一个完整的报文,而组装则是在对方IP协议网络层完成的。 组装和分片就与IP报头中的16位标识,3位标志,13位片偏移,这三个字段有关了。

16位标识:填充的是IP报文的序号。每一个报文的16位标识完全不一样,所以可以帮助确定哪几个分片属于哪一个相同的报文。即同一个报文的分片,16位标识是相同的。

3位标志: 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。第三位表示"更多分片",如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。

13位片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。

站在接收方的角度,我们如何使用三个字段,解决分片与组装的问题。 

1、 需要具有识别报文和报文不同的能力。

不同的报文的标识是不同的。同一个报文的分片,16位标识是相同的。所以,如果未来有大量的分片,我们可以根据16位标识,把标识相同的分片放在一起,它们是属于同一个报文的。

2、需要具有识别报文是否被分片的能力。

如果接收方收到了多个16位标识相同的数据,那么报文很可能是分片了的。再看3位标志的第二位是0,那么是可以分片的。再看3位标志的第三位,如果是1,那么表示就是一个分片报文,因为位于最后的分片该比特位位0,所以我们还需要看13位片偏移,最后一个分片的13位片偏移一定不为0。

总结:3位标志第三位为1,有更多分片,说明是一个分片。虽然3位标志第三位为0,但是13位片偏移不为0,说明是一个分片。

3、需要识别出哪些分片是报文的开始部分,哪些是报文的中间部分,哪些是报文的结尾部分。

开始部分:3位标志第三位比特位为1 && 片偏移为0。

中间部分:3位标志第三位比特位为1 && 片偏移不为0。

结尾部分:3位标志第三位比特位为0 && 片偏移不为0。

4、异常处理:在组装的过程中,任何一个分片丢失了,我们都需要能够识别出来。

首先,我们要知道:分片自身大小 +  分片自身偏移量 = 下一个报文偏移量。 

比如,对于上图的报文,我们分片后得到三个分片。接收方收到后, 先根据16位标识知道他们属于同一个报文。然后根据偏移量排序,偏移量为0的是报文开始,然后偏移量加上自身大小为1000,说明下一个分片的偏移量是1000,找到中间部分分片,接着,中间部分的分片偏移量加上自身大小为1500,说明下一个分片的偏移量为1500。这样就能够按顺序将分片组装了。

假如中间部分的分片丢失了,在开始的分片确认后,其偏移量加上自身大小为1000,可是接收方并没有找到偏移量为1000的分片,这时我们就可以判断中间部分的分片丢失了。而如果我们能够一直计算到结尾,那么就表示我们拿到了报文的全部分片。

分片之后,是每个分片都有一个IP报头,还是只需要第一个分片有IP报头就行了? 

必须要每一个分片都有自己的IP报头!因为接收方一定是通过16位标识,3位标志和13位片偏移来识别找出分片,并进行组装的,而这三个字段都在IP报头中。所以每一个分片都要有自己的IP报头。 

分片具体示意如下图:

为什么不建议对报文进行分片? 

如果一个报文在网络传输过程中没有经过分片,那么只要接收端收到了这一个报文,我们就可以认为该数据被对方可靠的收到了。而如果一个报文在网络传输过程中进行了分片,那么只有当接收端收到了全部的分片并将其成功组装起来,这时我们才认为该报文被对方可靠的收到了。

但如果众多的分片报文当中有一个分片出现了丢包,就会导致接收端就无法将报文成功组装起来,这时接收端会将收到的分片报文全部丢弃,此时传输层TCP会因为收不到对方应答而进行超时重传。 

只要有一个分片报文丢包了也就等同于这个报文整体丢失了,因此分片会增加传输层重传数据的概率。又因为传输层并不知道底层IP对数据进行了分片,当传输层发送出去的报文得不到应答时,传输层就只能将该报文整体进行重传。

综上所述,报文在发送时不建议进行分片。

为了尽量避免报文被分片,作为传输层的TCP协议就需要尽量将大小合适的TCP报文向下交付给IP协议。

三、网段划分

IP地址由网络号和主机号两部分构成。

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

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

不同的子网其实就是把网络号相同的主机放到一起。如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。

所以,我们在进行数据转发的时候,要根据网络号确定目标网络,根据主机号确定目的主机。网络号用来表示不同的区域。网络号在不同的查找过程中是不断变大且收敛的。

为什么要有网络号?

举个例子:小明是某大学2022级计算机学院计算机专业的学生,它的学号为2022017119。如果现在我们想要找到小明,那么根据2022我们知道了他是2022级的学生,再往后看2022017代表了他是计算机学院计算机专业的学生,最后再带上最后三位,我们就知道了他是2022级计算机学院计算机专业,序号为119的学生了。通过学号,在查找的过程中,我们把学号位数不断扩大,进而能够不断缩小查找范围。

IP地址的网络号和学号也是同样的作用。我们可以通过网络号直接定位到我们要去的网段,在查找过程中就能一次排除大量和目标主机不在同一网段的主机,然后再去该网段中查找,这样就可以大大提高检索的效率。

有了以上的概念,我们就可以进行网段划分了。

网段划分

最开始,划分网段的方案就是将IP地址分成下面的五类。 

数据范围:

A类 0.0.0.0到127.255.255.255
B类 128.0.0.0到191.255.255.255
C类 192.0.0.0到223.255.255.255
D类 224.0.0.0到239.255.255.255
E类 240.0.0.0到247.255.255.255

可是,随着网络的飞速发展,这种划分方案的局限性很快就显现出来了,大多数组织都申请B类网络地址,导致B类地址很快就被分配完了,而A类却浪费了大量地址。某个组织申请了一个B类地址,理论上一个子网内能允许6万5千多个主机,A类地址的子网内的主机数更多。然而在实际网络架设中,不会存在一个子网内有这么多主机的情况,因此大量的IP地址都被浪费掉了。而且全球范围内的主机越来越多,那么必然面临着IP地址不够用的情况。

所以,就有了新的划分方案,称为CIDR。

CIDR(Classless Interdomain Routing)

这种方式也就是基于子网掩码的划分方式。引入一个额外的子网掩码来区分网络号和主机号。子网掩码也是一个32位的正整数,通常用一串 "0" 来结尾。将IP地址和子网掩码进行 "&" 操作, 得到的结果就是网络号。

比如在某一子网中将IP地址的前24位作为网络号,那么该网络对应的子网掩码的32个比特位中的前24位就为1,剩下的8个比特位为0,将其用点分十机制表示就是255.255.255.0。

假设该子网当中有一台主机对应的IP地址是192.168.128.10,那么将这个IP地址与该网络对应的子网掩码进行“按位与”操作后得到的就是192.168.128.0,这就是这个子网对应的网络号。

用子网掩码与子网当中主机的IP地址进行“按位与”操作时,本质就是保留了主机IP地址中前24个比特位的原貌,将剩下的8个比特位的值清0了而已,也就是将主机号清0了,所以“按位与”后的结果就是该网络对应的网络号。

简单举个例子,如下图:

假设欧洲的某个用户发送了一个消息给中国四川的某个用户,其目的IP是 0011 0111 ......,将其与路由器的子网掩码 1111 0000 ........,进行按位与,得到 0011 0000 ......,一查路由表,发现是中国,就转发给中国网段的路由器所在的子网。中国网段的路由器拿到目的IP后,将其与自己的子网掩码 1111 1111 0000 0000 ......,按位与,得到 0011 0111 0000 0000 ......,说明目的IP是中国四川的,然后就将报文转发给四川网段的路由器,让它再进行转发。

当然,路由并不是真的这么简单就完了,上面的例子只是便于理解,并不是完整具体的路由操作。下面我们继续深入。

特殊的IP地址 

1、将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网。
2、将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
3、127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1。

四、私网IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址:

10.*:前8位是网络号,共16,777,216个地址。
172.16.到172.31.:前12位是网络号,共1,048,576个地址。
192.168.*:前16位是网络号,共65,536个地址。
包含在这个范围中的,都称为私有IP,其余的则称为全局IP(或公网IP)。

数据如何发送到服务器?

首先,我们需要知道:实际网络通信的基础设施都是运营商搭建的,我们访问服务器的数据并不是直接发送到了对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终数据才能到达对应的服务器。 所以,网段划分、子网划分等工作实际都是运营商做的。

路由器(工作在网络层)是连接两个或多个网络的硬件设备,它能够构建子网,在路由器上有两种网络接口,分别是LAN口和WAN口。

LAN口:表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。对应的地址叫做LAN口IP,也叫做子网IP。

WAN口:表示连接广域网的端口,一般指互联网。对应的的IP地址叫做WAN口IP,也叫做外网IP。

也就是说,一个路由器可以有多个IP地址。路由器LAN口连接的主机,都属于当前这个路由器构建的子网中。

依据下图。不同的路由器,其构建的子网IP其实都是一样的(通常都是192.168.1.1)。但是它们对外来说,自己本身也是别人构建的子网中的一台主机,所以对应的WAN口IP是不一样的,这样就能区分不同的网段。子网内的主机IP地址不能重复,但是在不同子网中的两台主机的IP地址就可以是相同的了。

比如,主机1和主机2构建的子网IP是一样的,但是他们对外通信的WAN口IP不同。在主机1和主机2自己的子网中,也存在IP地址相同的主机。

因为私网IP可以重复也就意味着我们可以在不同的局域网使用相同的IP地址,而在通信的广域网中分配不同的IP,缓解了IP的不足。

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。

所以,数据到服务器的基本过程如下图:

那么响应结果怎么回到客户端主机呢?这里我们还无法解释,只有等到后面才能解释。 

两个不同局域网当中的主机进行通信

数据要从一个局域网发送到另一个局域网,是先将数据经过公网发送到了服务器,然后再由服务器将数据处理后经过公网转发到了另一个局域网,进而交给对应的主机。

五、路由

路由的过程,就是一跳一跳(Hop by Hop) "问路" 的过程。所谓 "一跳" 就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

IP报文的传输过程中会遇到很多路由器,这些路由器会帮助报文进行路由转发,每当报文遇到一个路由器后,对应路由器都会查看该报文的目的IP地址,并查看其维护的路由表,告知该报文下一跳应该往哪跳。

我们可以使用route命令查看Linux服务器上的路由表。

Destination表示该路由器连接的网络地址,也就是其所在网段的IP地址。

Gateway代表的是下一跳地址。

Genmask代表的是子网掩码。

Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

Iface代表的是转发接口。 

路由过程

default,默认网关最后查询。 

当IP报文到达路由器时,路由器就会用该报文的目的IP地址,依次与路由表中的子网掩码 Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果相同则说明该报文下一跳就应该跳去这个子网,此时就会将该报文通过对应的发送接口Iface发出。

如果将该报文的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个报文发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。

这样最后就能够找到目的主机了。

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

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

相关文章

转行3年涨薪300%,我总结了一套产品经理快速入门指南!

想转行的产品小白,初期一定会遇到这个问题——我要如何 0 基础转行产品经理? 要想 0 基础快速转行产品经理,我通过个人实践总结了 5 个关键点,可以参考。 一、熟悉产品经理的工作全流程 转行的产品小白,首先要建立产…

【飞桨AI实战】基于PP-OCR和ErnieBot的智能视频问答

前言 本次分享将带领大家从 0 到 1 完成一个基于 OCR 和 LLM 的视频字幕提取和智能视频问答项目,通过 OCR 实现视频字幕提取,采用 ErnieBot 完成对视频字幕内容的理解,并回答相关问题,最后采用 Gradio 搭建应用。本项目旨在帮助初…

AI预测福彩3D采取888=3策略+杀断组+杀和尾缩水测试5月24日预测第1弹

哈喽,各位亲爱的小伙伴,在发布本期预测结果之前,先对最近的这套算法测试做一下总结。 最近的一套算法采用了88723的容差策略,关于容差策略相信大家都比较清楚:容差可以最大限度的保证初始大底中包含中奖号码&#xff0…

探秘机器学习经典:K-近邻算法(KNN)全解析

在浩瀚的机器学习宇宙中,K-近邻算法(K-Nearest Neighbors,简称KNN)如同一颗璀璨的明星,以其简洁直观的原理和广泛的应用范围,赢得了众多数据科学家的喜爱。今天,让我们一起揭开KNN的神秘面纱,深入探讨它的运作机制、优缺点、应用场景,以及如何在实际项目中灵活运用。 …

Prometheus监控平台配置--监控mysql

上一篇中讲述了怎么安装Prometheus,然后对服务器集群资源信息进行监控并通过grafana展示监控信息,在这一篇中我们只讲和mysql相关的监控,关于prometheus的监控原理以及安装可以看下上一篇。 1.上传 通过rz命令将安装包上传到任意目录&#xf…

linux之防火墙工具

netfilter Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中。 Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户…

21-信号集处理函数

屏蔽信号集 屏蔽某些信号 手动自动 未处理信号集 信号如果被屏蔽,则记录在未处理信号集中 非实时信号(1~31),不排队,只留一个实时信号(34~64),排队,保留全部 信号集…

Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现

目录 一、用Springboot读取本地工作目录的文件和文件结构 1.1、需求介绍 1.2、后端传递数据 1.2.1、语言框架 1.2.2、本地工作目录示范 1.2.3、后端代码 ①controller层 ②service层 ③响应的数据 二、总结 一、用Springboot读取本地工作目录的文件和文件结构 1.1、…

ColossalAI open-sora 1.0 项目技术报告 (视频生成)

项目信息 项目地址:https://github.com/hpcaitech/Open-Sora技术报告: Open-Sora 1:https://github.com/hpcaitech/Open-Sora/blob/main/docs/report_01.mdOpen-Sora 1.1:https://github.com/hpcaitech/Open-Sora/blob/main/docs…

冯喜运:5.24今日晚间黄金原油行情如何操作

【黄金消息面分析】:在经历了连续两个交易日的大幅下跌后,黄金市场在北京时间5月24日欧市早盘迎来了反弹。金价目前位于2338美元/盎司附近,市场对此轮波动表现出浓厚的兴趣。本文将深入分析黄金市场的最新动态,探讨其背后的逻辑&a…

【微信小程序开发】小程序前后端交互--发送网络请求实战解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

安装部署统信UOS服务器操作系统1070e

原文链接:安装部署统信UOS服务器操作系统1070e Hello,大家好啊!今天给大家带来一篇关于安装部署统信UOS服务器操作系统1070e的文章。统信UOS是一款基于Linux的国产操作系统,以其安全性和稳定性受到广泛关注。本文将详细介绍如何安…

FE企业运营管理平台任意文件上传漏洞复现

简介 飞企互联-FE企业运营管理平台 uploadAttachmentServlet存在文件上传漏洞,攻击者可通过该漏洞在服务器端写入后门文件。 漏洞复现 FOFA语法: icon_hash="-1159839950" app=“FE-协作平台” 访问界面返回信息如下所示: POC: /servlet/uploadAttachmentServl…

RabbitMQ(二)七种工作模式

文章目录 概述:工作模式(七种)1. "Hello World!"2. Work Queues(工作队列模式)3. Publish/Subscribe(发布订阅模式)4. Routing5. Topics6. RPC7. Publisher Confirms 详细1. "Hello World!&…

HTML+CSS 响应式导航栏

效果演示 Code <div class="navbar"><input type="checkbox"><span></span><span></span><ul><li><a href="#">点赞</a></li><li><a href="#">关注&…

视频推拉流EasyDSS系统如何在清理缓存文件的同时不影响缓存读写?

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户咨询&#xff0c;视频推…

C语言在VS中使用scanf报错?

我们在使用VS时&#xff0c;用scanf函数&#xff0c;VS会报以下错误&#xff1a; 以下是解决方法&#xff1a; 来到输出窗口&#xff0c;复制以下语句&#xff1a;_CRT_SECURE_NO_WARNINGS 第一种暂时方法 1.在代码的第一行&#xff0c;写下&#xff1a;#define _CRT_SECURE_…

【C语言】深入理解指针(一)(上)

本篇文章将讲解&#xff1a; &#xff08;1&#xff09;内存和地址 &#xff08;2&#xff09;指针变量和细致 &#xff08;3&#xff09;指针变量类型的意义 一&#xff1a;内存和地址 &#xff08;1&#xff09;内存 在讲内存和地址之前&#xff0c;我们讲一个生活中的…

基金/证券项目如何进行非交易日数据补全(实战)

一些大数据开发的项目&#xff0c;特别是基金/证券公司的项目&#xff0c;都经常会涉及到交易日与非交易日的概念。 如果要让你对一张交易日跑批的主表&#xff0c;怎么去补全非交易日的数据呢&#xff1f; 在遇到这种情况的时候&#xff0c;我们要去怎么处理&#xff1f;来&…

Linux(Ubuntu)下MySQL5.7的安装

文章目录 1.看系统本身有没有MySQL2.安装MySQL3.登录MySQL4.修改配置文件my.cnf/mysqld.cnf5.开启远程访问功能5.1 允许其他主机通过root访问数据库5.2 Ubuntu下配置文件修改说明 1.看系统本身有没有MySQL mariadb也是mysql所以要先检查一下系统有没有MySQL 我这台机子是新机子…