当前位置: 首页 > news >正文

【网络】网络层——IP协议

🐱作者:一只大喵咪1201
🐱专栏:《网络》
🔥格言:你只管努力,剩下的交给时间!
图

网络层中,IP协议首部和有效载荷组成的完整数据称为数据报

IP协议

  • 🍉TCP和IP的作用
  • 🍉IP协议
  • 🍉网段划分
    • 🍊IP地址分类
    • 🍊内外IP和公网IP地址
  • 🍉路由
  • 🍉分片与组装
  • 🍉总结

🍉TCP和IP的作用

前面本喵讲解了传输层的TCP和UDP协议,它们主要是用来控制数据在网络中的传输的,像滑动窗口,超时重传,确认应答,拥塞控制等等,都是在控制数据的传输。

在TCP/IP模型中,传输层的下一层是网络层,传输层封装好的数据段并不是直接交给了网络,而是给到了网络层,也就是我们今天要讲解的IP协议。

  • IP协议的作用:定位目标主机,具有将数据报从A主机跨网络送到B主机的能力。

IP层是有这样的能力,但是有能力就一定能办到吗?不一定,只能说有非常大的概率可以办到。

既然是概率问题,就可以通过一些策略让其成为百分之百的事情,比如没有传成功时就重传,直到传送成功,这样一来就保证了IP协议传送数据的可靠性。

  • TCP协议就是给IP协议提供数据传送策略的。

TCP协议又叫传输控制协议,它通过多种机制来保证数据能够可靠的传送到对端主机,但是它并不是执行者,真正的执行者是IP协议,TCP协议只是提供相关的策略让IP协议执行,进而保证数据的可靠传送

🍉IP协议

图
和讲解TCP协议的时候一样,主要字段的作用穿插在后面具体内容中讲解。

  • 4位版本号(version):指定IP协议的版本,对于IPv4来说,就是4,这里本喵主要讲解的就是IPv4。
  • 4位头部长度(header length):IP头部的长度是多少个32bit, 也就是 length * 4 的字节数,和TCP的首部长度一样,4个比特位表示最大的数字是15,因此IP头部最大长度是60字节。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。

4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要,对于ftp这样的程序,最大吞吐量比较重要。

  • 16位总长度(total length): IP数据报整体占多少个字节。
  • 8位协议:表示上层协议的类型,UDP和TCP协议都有编号。
  • 16位头部校验和:使用CRC进行校验,来鉴别头部是否损坏。
  • 字段选项:略。

上面本喵提到的字段理解起来并没有压力,没有提到的字段,在后面的具体内容中会详细讲解。

解包分用:

任何一个协议都必须考虑解包和分用,IP协议也不例外,要考虑对端的IP层是如果将报头和有效载荷分离的,又是将数据交给传输层的哪个协议的?

在IP首部中,有4位首部长度,根据这个字段中的内容可以得到当前数据报报头的长度,首部中还有16位总长度,可以得到整个数据报的长度,二者做差得到的就是有效载荷。

知道有效载荷后,只需要读取固定字节数的有效载荷即可分离报头。

在IP首部中,还有一个8位协议号,这里的编号就是要将数据交给的上层(传输层)协议的编号,如TCP或者UDP等,所以实现分用非常容易。

🍉网段划分

图
如上图所示便是IP层工作示意图,这里有几个基本概念:

  • 主机:配有IP地址,可以进行网络通信的设备,比如电脑,手机等等。
  • 路由器:配有IP地址,又能进行路由控制,也就是将数据从一个节点传送到另一个节点。
  • 节点:主机和路由器的统称。

上面说了,IP协议具有将数据从A主机跨网络可靠的送到D主机的能力,那么IP协议是怎么从主机A找到主机D的呢?

  • 路径选择中,目的IP地址非常重要,它决定了我们的路径该如何走。

图
如上图所示,IP协议报头中有两个IP地址字段,32位源IP地址标识的是主机A所在的位置,32位目的IP地址标识的是主机D所在的位置。IP地址就像生活中的家庭住址等地址一样,都具有唯一性。

  • IP地址 = 网络号 + 主机号

IP地址采用的是点分十进制,IPv4的格式形如192.168.1.1这样的形式,共有四个字节,字节和字节之间用点隔开,每个字节的数字范围是0~2555,所以IP地址理论上的范围是0.0.0.0~255.255.255.255,这个范围中有232个IP地址,也就是42亿多,是不够全球网民使用的。

网段划分:

假设你现在从你的电脑上用微信发送了一条消息,这条消息第一步肯定是到腾讯的微信服务器上,服务器也是一个计算机,也是一个节点,它也有自己的IP地址。

此时你电脑上的数据也知道服务器的IP地址,但是怎么找到呢?你的电脑和服务器之间有无数个节点,难道要把42亿多个IP地址遍历一遍吗?肯定不是的,这样效率太低了。

所以要进行子网的划分:

图
如上图所示,本喵按照国家,省市区为单位来划分子网,实际上的划分并不是这样的,而是按照人口区域来划分的,本喵这样划分只是为了好理解。

世界上有众多国家,每一个国家对应IP地址中4字节中第一个字节里的一个数字,如中国就是10.x.x.x,日本是1.x.x.x这样。

每个国家里又划分为多个行政区,拿中国来说,有34个省(自治区,直辖市,特别行政区),将IP地址中的第二个字节分配给这些省,第一个字节保持不变,如山东就是10.0.x.x,上海就是10.2.x.x这样。

上海市又分为多个区,将IP地址中的第三个字节分配给这些区,第一个和第二个字节保持不变,如浦东就是10.2.0.x,黄埔就是10.2.3.x

每个区中又有多台主机,也就是有多个节点,包括服务器也是一个节点,将IP地址中的第四个字节分配给这些节点,如张三的电脑就是10.2.3.2,腾讯的微信服务器就是10.2.3.4

  • 上面划分和实际情况没有任何对应关系,只是为了方便理解。

图

假设你现在在日本,用微信发了一个消息,当数据到了IP层被封装以后,报头如上图所示,源IP地址是1.1.1.1,目的IP地址是10.2.3.4

数据被发送出去以后,首先到达的是你所在区子网的路由器,路由器发现目的IP中的前三个字节是10.2.3,而整个日本子网的IP地址中第一个字节是1,所以判断这不是发给你所在国家的子网的,就将数据交给了上层路由器,最后到了日本的入口路由器。

  • 每个子网都有一个入口路由器,该路由器是子网内部所有路由器的上层路由器,也叫做默认路由器。

日本的入口路由器和其他国家的入口路由器处于一个子网内,所以它肯定知道IP地址第一个字节是1属于哪个国家的,所以就将这个数据报直接发给了中国的入口路由器。

  • 每一个入口路由器都横跨两个子网,一个是它所在的子网,还有一个是它下一层的子网。

中国的入口路由器横跨所有国家入口路由器所在的子网,和中国内部所有省份所在的子网,所以它清楚的知道每个省份的IP地址中第二个字节的数字是多少。

中国的入口路由器拿到日本入口路由器发来的数据报以后,发现目的IP是10.2.3.4,前两个字节是10.2,对应的是上海市,所以就将数据报直接发送到了上海市的入口路由器。

上海的入口路由器拿到这个数据报后,发现目的IP中的前3个字节是10.2.3,对应的是黄埔区,所以就将数据报直接发送到了黄浦区的入口路由器。

黄埔区的入口路由器发现IP地址是10.2.3.4,对应的是微信服务器,所以就将数据直接发送给了微信服务器的路由器。此时,数据报就被送到了目标地址。


上诉过程中,每一层子网只关注IP地址中的一个字节,越往下层,被确定的字节个数就越多,目标也就越明确,所查找的范围也就越小。

通过子网划分的方式,让数据报每传送一次就能排除大量的IP地址,比起遍历的方式,效率提升的不是一星半点。

  • 子网划分的目的就是提高网络通信数据传输的效率。

可以看到,在数据报传送的过程中,根据IP地址中的前3个字节,可以将数据报通过多个路由器送到目标主机所在子网的入口路由器,此时也就确定了目标主机所在的子网络,所以前三个字节被叫做网络号。

目标主机所在子网的路由器再根据主机号,也就是IP地址中的最后一个字节来确定具体是哪个主机,然后将数据报发送到目标主机上。

  • IP地址中的前3个字节被叫做网络号,最后一个字节被叫做主机号

图
如上图所示,不同网段(子网)的网络号必须不同,但是主机号可以相同,只要保证同一个网段内的所有主机号不同即可。

网络号保证了两个相连的子网具有不同的标识,主机号保证了同一子网内不同主机有不同的标识。

补充知识:

  • IP地址中,主机号为0,如192.168.128.0就代表网络号,等价于前三个字节192.168.128,所以这个IP地址是不能绑定主机的。
  • IP地址中,主机号为1,如192.168.128.1代表当前子网的默认路由器(入口路由器),所以这个IP地址也不能绑定主机。

网段划分是经过设计的,所以说互联网是一个被设计过的世界,那么是谁设计的呢?答案是运营商,在我们国家就是移动,电信,联通三大运行商,其他国家也有自己运营商。

运营商不仅设计了互联网的网段划分,而且搭建了物理层中的通信设备,使得网络数据能够在一根根网线中跑,进行网络通信。

所以说,运营商是底层网络的设计者,我们在使用网络的时候,需要向运营商交钱,因为我们使用了人家的底层设计和设备。


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

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。

那么问题来了,手动管理子网内的IP,是一个相当麻烦的事情。

  • 有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。
  • 一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器。

我们在日常生活中连接家里的wifi时,第一次连接需要输入账号和密码,这其实就是在向路由器申请IP地址,在没有联网的时候,你的设备是没有IP地址的。

🍊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

其中网络号和我们前面网段划分中是一样的,也是用来标识不同的子网的,只是不同类型IP地址网络号的范围不一样,主机号的范围也不一样。

某一个子网会领取几类IP地址去使用,其中用的最多的是B类IP地址,随着网络的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址。

  • 例如,申请了一个B类地址,理论上一个子网内能允许6万5千多个主机,A类地址的子网内能包含的主机数更多。
  • 然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的IP地址都被浪费掉了。

因为有组织已经申请了一个A类IP地址,即使主机数没有那么多,没有用完,但是别的组织也不能申请这个A类的IP地址了,因为网络号是唯一的。

此时就导致A类IP地址存在大量的浪费,而B类IP地址严重不足。

  • 针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)。
  • 也就是现在采用的子网划分方式,不区分IP地址的类型,就像本喵前面划分子网时那样。
  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
  • 子网掩码也是一个32位的正整数,通常用一串 “0” 来结尾。
  • 将IP地址和子网掩码进行 “按位与” 操作,得到的结果就是网络号。
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。

子网掩码的存在就是为了区分网络号和主机号的,可以通过IP地址和子网掩码按位与高效的得到网络号。

子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。

图
如上图所示,一个路由器收到了一个IP数据报,其中目的IP地址是140.252.20.68,该路由器所处网段的子网掩码是255.255.255.0,将IP地址和子网掩码按位与后得到的网络号是140.252.20.0

然后与自己所处网段的网络号进行比较,如果相同,直接将数据给到本网段的子网中,如果不同,则需要跨网段,则将数据给到上一层路由器去处理。

  • 得到的网络号所标识的子网中,节点的地址范围是140.252.20.0~140.252.20.255
  • 也就是主机号从全0到全1。

图
再看一个例子,如上图所示,此时的子网掩码是255.255.255.240,按位与以后得到的网络号是140.252.20.64,作用和上面一样,也是用来判断目的IP是否位于本网段。

P地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68,子网掩码的高24位是1,也就是255.255.255.0

  • 两个例子中,网络号的位数是变化的。

第一个例子中,网络号是前3个字节,第二个例子中网络号是前3个字节加4个比特位,剩下的才是主机号。

  • 数据在传送的过程中,网络号是变化的。

继续拿前面的国家和省市之间网络拓扑结构来说,从日本发送出来的微信消息现在已经交到了中国入口路由器,假设中国网段的子网掩码是255.0.0.0

  • 每个路由器中都维护着一张路由表,里面存放着下层所有子网的网络号和子网掩码。

中国网段入口路由器将IP地址与它所知道的子网掩码遍历,进行按位与,最后发现该IP地址和上海的子网掩码255.255.0.0按位与后得到的网络号和上海的网络号相同,然后将该数据交给上海子网的入口路由器。

上海入口路由器同样进行上面的操作,最后发现该IP地址和黄浦区的子网掩码255.255.255.0按位雨后得到的网络号和黄浦区的网络号相同,然后将该数据交给黄埔区入口路由器。

黄浦区入口路由器根据IP地址中的主机号找到微信服务器,至此,数据完成传送。

  • 在上面数据从中国入口路由器传送到黄浦区入口路由器的过程中,网络号是不停变化的
  • 越上层的子网掩码位数越少,也代表着网络号所位数越少。

特殊的IP地址:

  • 将IP地址中的主机号全部设为0,就成了网络号,代表这个子网,如140.252.20.0
  • 将IP地址中的主机号全部设置为1,就成为了广播地址,用于给同一个子网中的所有主机发送数据,如140.252.20.255
  • IP地址127.*用于本机环回测试,通常是127.0.0.1,只能在本主机上进行网络通信。

IP地址的数量限制:

我们知道,IP地址(IPv4)是一个4字节32位的正整数,一共只有 232个IP地址,大概是43亿左右。而TCP/IP协议规定, 每个主机都需要有一个IP地址,难道这意味着,一共只有43亿台主机能接入网络么?

实际上,由于一些特殊的IP地址的存在,数量远不足43亿。另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。

CIDR(Classless Interdomain Routing) 虽然在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。
  • NAT技术(后面会重点介绍)。
  • IPv6:IPv6并不是IPv4的简单升级版,这是互不相干的两个协议,彼此并不兼容。IPv6用16字节128位来表示一个IP地址,但是目前IPv6还没有普及。

🍊内外IP和公网IP地址

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

  • 10.*,前8位是网络号,后24位是主机号,所以共有16777216个地址。
  • 127.16127.31,前12位是网络号,后20位是主机号,所以共有1048576个地址。
  • 192.168.*前16位是网络号,后16位是主机号,所以共有36636个地址。

在这个范围中的IP地址都称为内网IP(私有IP),其余的都称为公网IP(全局IP)。

图

如上图所示,路由器横跨两个子网,那么它必然配有两个IP地址,一个是WAN口IP,位于上层子网,就像前面网络拓扑结构中,上海市的入口路由器和其他省路由器组成的子网中,WAN口IP就是该路由器在这个网段中的IP地址。

另一个IP地址是LAN口IP,位于当前子网,上海的入口路由器和上海所有区组成的子网中,LAN口IP就是该路由器在这个网段中的IP地址。

  • 和路由器LAN口连接的主机,都属于当前这个路由器的子网中。
  • 子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。

上图中,所有家用路由器的子网IP(LAN口IP)都是192.168.1.1/24,这个IP地址是用来和家里与这个路由器相连的所有设备进来通信的,每一个家用路由器和与它相连的设备组成了一个局域网。

  • 在这个局域网中,路由器的子网IP192.168.1.1就是唯一的。

但是左边的两个家用路由器的WAN口IP不同,因为它两和运营商路由器的LAN口IP组成一个子网(局域网),该子网中的IP地址都是唯一的。

上图中,两个运营商路由器的子网IP又是相同的,都是10.1.1.1/24,因为这个LAN口IP只用于该从属该路由器的子网中通信,在这个子网中也是唯一的。

两个运营商的WAN口IP是不相同的,而且是122.*,这个IP地址是公网IP,所以这两个WAN口IP地址是用来在公网之间通信的。

  • 局域网中:一个子网中所有节点的IP地址都不能相同,要具有唯一性。不同子网中的IP地址可以相同。
  • 公网中:IP地址必须具有唯一性,不论属于哪个子网。

本喵前面画的网络拓扑结构中,是公网网段划分理想示意图,没有加入任何内网,实际上在到达某个省或者某个市就开始采用内网(局域网)的方式了。

就像我们平时在微博,抖音等软件里的评论归属地一样,只能看到所在省,无法看到再具体的信息了,因为省使用的还是公网IP,非常好识别,再网下使用的就是内网IP,就比较复杂了,好识别。


既然不同的内网中可以有相同的IP地址,那么就出问题了:

图
假设我现在从我的电脑上发送了一份数据到服务器上,IP报头如上图所示,源IP地址是192.168.204/24,这是一个内外IP地址,目的IP地址是122.77.241.3/24,这是一个公网IP地址。

图
你将数据从你的电脑上发送出去后,首先交给了家用路由器,家用路由器用子网掩码按位与后发现不是发送到本网段的,然后交给了运营商路由器。

运营商同样判断出不是发送给本网段的,而是要发送给公网中的服务器的,所以运营商路由器将数据发送给了服务器。

服务器收到数据以后通过特定进程处理,处理完进行响应,但是响应数据段到了IP层以后,发现目的IP是192.168.1.1,这是一个内网IP,填入到IP报头中的目标IP地址字段里,然后发到公网中。

但是由于这是一个内网IP,所有运营商路由器都不认识,并且它们的子网中都有这个IP地址,所以就会导致服务器的响应无法传送到我的电脑上。

  • 内网中的主机需要和公网网进行通信时,路由器将IP首部中的目的IP地址进行替换(替换成WAN口IP),这样逐级替换,最终数据包中的目的IP地址成为一个公网IP。
  • 这种技术称为NAT(Network Address Translation,网络地址转换),具体详细内容本喵以后会讲解。

图

如上图所示,在从你的电脑将数据发送到家用路由器时,IP报头中的目的IP是192.168.201/24,是一个内网IP地址。

家用路由器将数据发送给运营商路由器的时候,将IP报头中的目的IP地址替换成了自己的WAN口IP10.1.1.2/24,同样是一个内网IP地址,但是属于你电脑的上一层。

运营商路由器在将数据发送到公网中给服务的时候,将IP报头中的目的IP地址替换成了自己的WAN口IP122.77.241.4/24,这是一个公网IP,在全网都具有唯一性。

此时服务器在处理完数据做出响应时,构建的IP数据报中目的IP就填运营商的WAN口IP地址122.77.241.4/24,将数据发到公网中后可以准确发回运营商路由器,然后再由运营商路由器发给它子网的路由器,最终到了你电脑上。

🍉路由

  • 路由:就是在复杂的网络拓扑结构中找出一条通往终点的路线。

图

  • 一跳: 就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

通俗来说,一跳就是两个节点相连之间的路径。路由的过程就如上图那样一跳一跳的问路的过程。

当IP数据报到达路由器以后,由路由器决定这个数据包是直接发送给目标主机还是需要发给上一层路由器。如果目标IP地址在本网段内就直接发送给目标,否则就发送给上一层路由器。

那么路由器是如何判断当前这个IP数据报该发送到哪里呢?这就要靠每个路由器(节点)内部维护的路由表了。

图
如上图所示,在Linux上,使用route指令可以查看当前机器上的路由表,我们的计算机也有路由功能,也是可以看作一个路由器的。

图
使用上图所示的路由表来讲解,本喵删除了MetricRef两列,因为现在不用关心它是什么意义。

这台主机有两个网络接口,一个网络接口eth0连到192.168.10.0/24网络,另一个网络接口eth1连到192.168.56.0/24网络。

路由表的Destination是目的IP地址,Genmask是子网掩码,Gateway是下一跳地址,也就是下一个路由器IP地址。Iface是发送接口,是物理上存在的接口,该接口通过网线和对应网络相连。

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

  • 转发过程例1: 如果要发送的数据报的目的IP是192.168.56.3

跟第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口将数据报发送出去。

由于192.168.56.0/24正是与eth1接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。

  • 转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2

依次和路由表前几项进行对比,发现都不匹配,说明目的IP不在本网段,按缺省路由条目(最后一行),从eth0接口发出去,发往IP地址为192.168.10.1的路由器,由192.168.10.1路由器根据它的路由表决定下一跳地址。


总的来说,当一个数据报文到来节点后,会经过四步来完成数据报文发送:

  • 遍历路由表
  • 目的IP和路由表中的每一行的子网掩码按位与,确定该数据报要去的目标网络。
  • 对比结果和目标网络
  • 最后通过Iface接口发出报文。

图
如上图红色框所示,IP协议报头中有一个字段叫做8位生存时间(TTL),该字段的值表示跳数

在整个网络拓扑结构中,存在非常多的节点,数据报在发送的过程中会经过这些节点,如果某个或者某些路由器发生故障,则有可能导致数据报在网络中的传送路径变成环状,在固定路由器之间循环,始终到不了目标IP地址。

发送端迟迟得不到应答,就会触发超时重传机制,然后新发的数据报又会陷入到循环中,导致网络中数据越来越多,最后就拥塞了。

此时8位的生存时间就派上用场了,假设生存时间字段的值是10,那么数据报在网络中每进行一跳该值就会减一,如果减到0这个数据报就消亡了。

  • 8位生存时间的最大值是255,也就是说一个数据报最多进行255跳。
  • 255跳可以到达整个网络中的任何一台主机了,不会存在还没有到达数据就消亡了,除非路由出现了问题。
  • 在数据传送的过程中,类似于多叉树的模型,每一跳就在向下遍历,能排除相当多的主机。

🍉分片与组装

图
如上图所示,IP协议报头的第二行就是用来实现分片与组装的。

为什么要分片?

我们知道,在TCP/IP模型中,网络层的下一层是数据链路层,网络层中的IP协议并不是把数据直接发送到了网络中,而是交给了数据链路层,数据链路层才是真正将数据发送到网络中。

数据链路层中使用的是MAC帧协议,该协议规定自己的有效载荷不能超过1500个字节。虽然可以修改,但是这里我们不考虑,就按默认情况来说。

图
如上图所示,IP层位于TCP层和数据链路层之间,IP层发送的数据是TCP层交付下来的,交付多少就向数据链路层发多少。

此时TCP层交付给IP层3000个字节的数据,IP层向下交付的时候,数据链路层说它最多只要1500个字节,否则就不要。

  • 数据量的多少并不是IP层决定的,而是由TCP层决定的。

所以此时IP层就非常委屈,上面是领导要求发送3000个字节,下面员工只能处理1500个字节,面对这个矛盾,IP层只能自己想办法,所以就将数据分片,分成多个数据包,每个数据包不超过1500个字节,然后分多次交付给数据链路层。

同样的,当这些分开的数据报发送到对端后,对端的IP层需要进行组装,将分片的数据拼装成一个完整的数据。

  • 分:自己的IP层完成。
  • 组:对端的IP层完成。
  • TCP层和数据链路层完全不关心IP层进行了分片,实现了高度解耦。

图
再来看,IP报头第二行的32位字段:

  • 16位标识(id):发送的每一个数据报该标识都是唯一的,如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的。
  • 3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU(1500个字节) IP数据报就会丢弃报文。

第三位表示更多分片,如果该数据报被分片了的话,这个第三位就是1,最后一个分片由于不会再分了,所以是0。

图
如上图所示,将3000字节的数据报分片为两个1500字节的数据报,每个数据再加一个IP报头,其中第一个数据报是3000字节的前半部分,它被分片了,所以报头中的第三个标志位是1。

第二个数据报是3000字节的后半部分,它没有再分片,所以IP报头中的第三个标志位是0。

  • 13位分片偏移(framegament offset):是分片相对于原始IP报文开始处的偏移,实际偏移的字节数是这个值 * 8 得到的。

继续看前面分片的图片,第一个数据报是从头开始分片的,所以片偏移量就是0,第二个数据报是从1500字节处开始分的,所以片偏移量值*8就是1500。

除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了),本喵按照1500字节拆分就不是8的整数倍。


  1. 对端IP层收到数据报后怎么知道这是一个被分片了的数据报?

数据链路层不关心IP层是否分片了,它只管发,所以对端的IP层收到数据报后需要知道这是一个被分片了的报文。

  • 如果更多分片标志位(第三个标志位)是1,说明该数据报被分片了。
  • 如果更多分片是0,并且片偏移值大于0,说明该数据报被分片了。
  1. 同一个报文的所有分片对端是如何识别出来的?

由于16位标识符的存在,对端收到的数据报中,标识符相同的数据报组合起来就是一个完整的数据报。

  1. 哪一个数据报是第一个分片,哪一个是最后一个分片?

更多分片标志位是1,片偏移量是0,说明这是第一个分片。更多分片标志位是0,片偏移量大于0,说明这是最后一个分片。

  1. 哪个分片在前,哪个分片在后?

将所有分片的片偏移量按照升序排序,就可以知道哪个分片在前,哪个分片在后。

  1. 有没有收全或者丢失分片呢?

当前分片的起始位置+自身数据长度,如果等于下一个分片中的片偏移量,说明这两个分片是挨着的,如次反复判断,便能判断出是否收全了,只要有一次判断结果不相等,那么就说明有数据片丢了。

  1. 怎么保证对端组装起来的报文是正确的?
  • IP协议有16位首部校验和,校验通过会分发给上层TCP协议。
  • TCP协议也有校验和,可以判断出数据是否是正确的。

假设传送一个报文的成功率是99%,将一个长的数据报分片成两个以后,两个数据报的传送的成功率就是99%2 = 98.01%,这个大数据报传送的成功率就降低了。

一个数据报被分片成多个,任意一个丢失就会导致对端IP层组装失败,从而导致发送发TCP层超时重传。

  • 分片和组装并不好,而且这种情况也并不是经常的,并不是主流方式。

🍉总结

IP协议中,最重要的字段就是IP地址,IP协议是专门负责路由的,所以要重点理解整个网络的拓扑结构,包括子网划分,公网和内网(局域网)的划分和路由。

相关文章:

【网络】网络层——IP协议

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 网络层中,IP协议首部和有效载荷组成的完整数据称为数据报。 IP协议 🍉TCP和IP的…...

动力电池系统介绍(十三)——高压互锁(HVIL)

动力电池系统介绍(十三) 一、高压互锁梗概1.1 高压互锁原理1.1 高压互锁内部结构1.2 高压互锁分类1.3 高压互锁原则 二、高压互锁常见故障2.1 高压互锁开关失效2.2 端子退针导致开路2.3 互锁端子对地短路2.4 动力电池内部故障 三、高压互锁故障排查 一、…...

C# 一种求平方根的方法 立方根也可以 极大 极小都可以

不知道研究这些干啥&#xff0c;纯纯的浪费时间。。。 public static double TQSquare(double number){Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX1 0, diff 9999999999, diffTemporary 0;for (int i 0; i < 654321; i){if (random1…...

爬虫逆向实战(十二)--某交易所登录

一、数据接口分析 主页地址&#xff1a;某交易所 1、抓包 通过抓包可以发现登录是通过表单提交的 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块&#xff0c;可以发现有两个加密参数password和execution 请求头是否加密&#xff1f; 无响应是…...

【C++入门到精通】C++入门 —— list (STL)

阅读导航 前言一、list简介1.概念2.特点 二、list的使用1.list的构造2.常见的操作⭕std::list类型的增、删、查、改 三、list与vector的对比温馨提示 前言 文章绑定了VS平台下std::list的源码&#xff0c;大家可以下载了解一下&#x1f60d; 前面我们讲了C语言的基础知识&…...

SOLIDWORKS有限元分析

SOLIDWORKS是一款广泛使用的三维计算机辅助设计软件&#xff0c;同时它还具有强大的有限元分析功能。有限元分析是一种工程分析方法&#xff0c;它将复杂的实体分解成许多小的有限元素&#xff0c;以便对其进行数学建模和分析。SOLIDWORKS的有限元分析功能可以帮助工程师预测和…...

Kotlin Flow 冷流

协程&#xff1a;Flow 1、Flow是什么&#xff1f; 处理异步事件流可取消&#xff1a;通过取消协程取消Flow组合操作符&#xff1a;复杂逻辑处理缓冲和背压&#xff1a;发送和接收时用不同速度处理&#xff0c;实现流量控制、避免数据丢失 2、传统事件处理方案&#xff1a;同…...

Android Socket使用TCP协议实现手机投屏

本节主要通过实战来了解Socket在TCP/IP协议中充当的是一个什么角色&#xff0c;有什么作用。通过Socket使用TCP协议实现局域网内手机A充当服务端&#xff0c;手机B充当客户端&#xff0c;手机B连接手机A&#xff0c;手机A获取屏幕数据转化为Bitmap&#xff0c;通过Socket传递个…...

【云原生,k8s】Helm应用包管理器介绍

目录 一、为什么需要Helm&#xff1f; &#xff08;一&#xff09;Helm介绍 &#xff08;二&#xff09;Helm有3个重要概念&#xff1a; &#xff08;三&#xff09;Helm特点 二、Helm V3变化 &#xff08;一&#xff09;架构变化 &#xff08;二&#xff09;自动创建名…...

两个内网之间的linux服务器如何互相登录?快解析内网穿透

如果两个内网之间的linux服务器需要互相登录&#xff0c;或需要互相访问内网某个端口&#xff0c;担忧没有公网IP&#xff0c;可以使用的方法有 ngrok, 但并不方便&#xff0c;我们只需两条 SSH 命令即可。 SSH 内网端口转发实战SSH 内网端口转发实战 先给出本文主角&…...

sql server 存储过程 set ansi_nulls set quoted_identifier,out 、output

SQL-92 标准要求在对空值(NULL) 进行等于 () 或不等于 (<>) 比较时取值为 FALSE。 当 SET ANSI_NULLS 为 ON 时&#xff0c;即使 column_name 中包含空值&#xff0c;使用 WHERE column_name NULL 的 SELECT 语句仍返回零行。即使 column_name 中包含非空值&#xff0c…...

1046:判断一个数能否同时被3和5整除

【题目描述】 判断一个数n 能否同时被3和5整除&#xff0c;如果能同时被3和5整除输出YES&#xff0c;否则输出NO。 【输入】 输入一行&#xff0c;包含一个整数n。&#xff08; -1,000,000 < n < 1,000,000&#xff09; 【输出】 输出一行&#xff0c;如果能同时被3…...

优漫动游零基础如何学习好UI设计

智能时代的来临&#xff0c;很多企业都越来越注重用户体验这一块&#xff0c;想要有一个吸引用户的好页面&#xff0c;UI设计师岗位不可或缺&#xff0c;如今越来越多的人想要学习UI设计技术&#xff0c;那么对于零基础小白如何学习好UI设计呢? 零基础小白如何学习好UI设计…...

Android岗位技能实训室建设方案

一 、系统概述 Android岗位技能作为新一代信息技术的重点和促进信息消费的核心产业&#xff0c;已成为我国转变信息服务业的发展新热点&#xff1a;成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网&#xff0c;以其巨大的信息交换能力和快速渗透能力…...

Mysql系列:Mysql5.7编译安装--系统环境:Centos7 / CentOS9 Stream

Mysql系列&#xff1a;Mysql5.7编译安装 系统环境&#xff1a;Centos7 / CentOS9 Stream 1&#xff1a;下载mysql源码包 https://dev.mysql.com/downloads/mysql/5.7.htmldownloads 选择MySQL Community Server>source_code>Generic Linux (Architecture Independent)…...

Docker容器与虚拟化技术:Dockerfile部署LNMP

目录 一、理论 1.LNMP架构 2.背景 3.Dockerfile部署LNMP 3.构建Nginx镜像 4.构建MySQL容器 5.构建PHP镜像 6.启动 wordpress 服务 二、实验 1.环境准备 2.构建Nginx镜像 3.构建MySQL容器 4.构建PHP镜像 5.启动 wordpress 服务 三、问题 1.构建nginx镜像报错 …...

elementUI date-picker 日期格式转为 2023/08/08格式

<el-form-item label"基线日期:" prop"baselineDate"><el-date-pickertype"date"v-model"form.baselineDate"placeholder"选择日期"format"yyyy/MM/dd"change"(date, type) > changeTime(date, …...

生成式 AI 在泛娱乐行业的应用场景实践 – 助力风格化视频内容创作

感谢大家阅读《生成式 AI 行业解决方案指南》系列博客&#xff0c;全系列分为 4 篇&#xff0c;将为大家系统地介绍生成式 AI 解决方案指南及其在电商、游戏、泛娱乐行业中的典型场景及应用实践。目录如下&#xff1a; 《生成式 AI 行业解决方案指南与部署指南》《生成式 AI 在…...

elementPlus——图标引入+批量注册全局组件——基础积累

因为我们要根据路由配置对应的图标&#xff0c;也要为了后续方便更改。因此我们将所有的图标注册为全局组件。&#xff08;使用之前将分页器以及矢量图注册全局组件的自定义插件&#xff09;&#xff08;所有图标全局注册的方法element-plus文档中已给出&#xff09; 全局注册…...

国标GB28181安防视频平台EasyGBS显示状态正常,却无法播放该如何解决?

国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台&#xff0c;可实现的视频功能包括&#xff1a;实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强&#xff0c;支持将…...

告别模糊人像:AI驱动的面部增强新方案

告别模糊人像&#xff1a;AI驱动的面部增强新方案 【免费下载链接】DZ-FaceDetailer a node for comfyui for restore/edit/enchance faces utilizing face recognition 项目地址: https://gitcode.com/gh_mirrors/dz/DZ-FaceDetailer 在数字图像处理领域&#xff0c;人…...

深度学习驱动的图像去雾:2023年最新算法与应用实践

1. 图像去雾技术的现状与挑战 清晨打开窗户&#xff0c;如果外面雾气弥漫&#xff0c;我们往往会等雾散了再拍照。但计算机视觉系统可没这个耐心——自动驾驶汽车必须实时看清路况&#xff0c;无人机巡检得在雾天正常工作。这就是图像去雾技术存在的意义。2023年&#xff0c;随…...

LazyLLM架构设计揭秘:低代码如何支撑复杂多Agent系统

LazyLLM架构设计揭秘&#xff1a;低代码如何支撑复杂多Agent系统 【免费下载链接】LazyLLM 项目地址: https://gitcode.com/gh_mirrors/la/LazyLLM 在当今AI应用开发领域&#xff0c;构建复杂的多Agent系统往往需要大量的工程投入和专业知识。然而&#xff0c;LazyLLM框…...

3步释放华硕笔记本潜能:G-Helper轻量化控制工具的极致优化指南

3步释放华硕笔记本潜能&#xff1a;G-Helper轻量化控制工具的极致优化指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

ECharts Gallery弃用后,这4个替代网站让你轻松搞定数据可视化(附优缺点对比)

ECharts Gallery弃用后&#xff0c;这4个专业级替代方案深度评测 当ECharts官方Gallery宣布停止维护时&#xff0c;许多数据可视化开发者突然失去了一个重要的灵感来源和代码参考平台。作为国内最流行的可视化库之一&#xff0c;ECharts的生态系统中其实还隐藏着多个高质量的替…...

python基于微信小程序的直播带货商品数据分析系统的爬虫可视化

目录需求分析与系统架构设计微信小程序数据爬取方案数据存储与清洗数据分析与可视化系统集成与部署注意事项项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与系统架构设计 明确系统目标为爬取微信小程序直播带货商品数…...

7大应用场景:如何用计算机视觉技术彻底改变足球比赛分析?

7大应用场景&#xff1a;如何用计算机视觉技术彻底改变足球比赛分析&#xff1f; 【免费下载链接】sports computer vision and sports 项目地址: https://gitcode.com/gh_mirrors/sp/sports 在当今数字化体育时代&#xff0c;足球场精准定位技术正以前所未有的方式改变…...

从朱诺到威尼斯:一个可持续旅游模型如何‘开箱即用’解决你的美赛问题二

从朱诺到威尼斯&#xff1a;可持续旅游模型的跨场景迁移实战指南 模型迁移的核心挑战与解决框架 当我们将一个城市的可持续旅游模型迁移到另一个城市时&#xff0c;表面上看似乎只需要更换数据输入&#xff0c;但实际操作中会遇到三个维度的挑战&#xff1a; 1. 资源禀赋差异 自…...

网络安全学习攻略宝典,从菜鸟到高手的必由之路

想成为一名真正的黑客到底该怎么学&#xff1f; 从0开始又该从何学起呢&#xff1f; 很多人想学习网络安全&#xff0c;却不知道从何下手。别迷茫&#xff0c;这篇文章为你指明方向&#xff0c;无论你是零基础小白&#xff0c;还是有一定基础想提升的人&#xff0c;都能从中找…...

CentOS 7.6 + Intel Parallel Studio XE 2017:手把手搞定VASP 5.4.4编译环境(附License激活避坑指南)

CentOS 7.6环境下Intel编译器与VASP 5.4.4的深度配置实战 在计算材料科学领域&#xff0c;VASP作为电子结构计算的黄金标准工具&#xff0c;其性能高度依赖底层编译环境的优化。本文将带您深入探索如何在CentOS 7.6系统上&#xff0c;通过Intel Parallel Studio XE 2017构建高性…...