📃个人主页:island1314
🔥个人专栏:Linux—登神长阶 最后的最后,这里送大家一句话,希望大家于2025年一起奋斗,诸君共勉 💫
🕸️ 之前,我们在这篇 【Linux】: 传输层协议 TCP 已经讲了关于 传输层上,TCP 究竟做了什么,那么实际在网络层中,tcp究竟做了什么,ip 又扮演了什么角色?
现在,我们来看下面一个小故事,方便我们对后面的理解,如下:
张三老爹是教务处主任他要求张三每次数学考试都考100分,张三也很争气,10次数学考试8次都是100分,但是架不住意义可能考了95分。而张三老爹每次必须让张三数学考100分,那张三老爹怎么办呢?他决定之前考试作废,重新考试,如果张三还没有考到,那考试继续作废,直到张三考到100分。
刚才我们两个人,一个教务处主任(张三老爹),张三(儿子)。考试的是张三,他也有能力考到100分,但并不一定每次都考到100。张三没考到没事他还有他老爹,他可以让他儿子继续考。
因此现在我们可以知道,前面 tcp
学的超时重传、确认应答、流量控制等等全都是策略!而具体怎么做全部都是由 ip
来执行!
主机: 配有 IP 地址, 但是不进行路由控制的设备; 路由器: 即配有 IP 地址, 又能进行路由控制; 节点: 主机和路由器的统称;
比如上面图中,主机B 要到达 主机C,它两并不是直接连接的,下面补充两个问题
因此我们可以得到一个小结论: IP = 目标网络+目标主机
举个例子,就比如我们要去旅游,如果要去目标城市 --> 就需要经过一些目标地点(高铁站、酒店 …),最后到达我们最后目的地
因此我们可以得到一个结论:这是一套精心设计过的网络体系!
在学习任何网络协议之前,需要先理解以下两个基本问题:
IP 报头与有效载荷分离
分离方法 (第一层:
version
):指定 IP 协议版本,对于IPv4来说总是4。注意:IPv4和IPv6之间没有直接兼容性。header length
):表示IP报头总长度,单位为4字节。取值范围是【5, 15】(对应于20到60字节),其中5是最常见的值,代表20字节。total length
):指整个IP报文的长度,包括报头和有效载荷。Type Of Service
): 为什么需要16位总长度?
确保接收方完整地接收到整个IP报文。 因为IP报文是以独立报文形式存在,并非像TCP那样的连续字节流,因此需要明确标示出报头和有效载荷的具体长度。
(第二层:涉及到 IP 报文和分片(后面会讲)
framegament offset
): 是分片相对于原始 IP 报文开始处的偏移, 其实就是在表示当前分片在原报文中处在哪个位置, 实际偏移的字节数是这个值 8得到的。 因此 除了最后一个报文之外, 其他报文的长度必须是 8 的整数倍(否则报文就不连续了)如何交付 (第三层:
Time To Live, TTL
):定义了数据报到达目的地前允许经过的最大跳数。通常初始化为64,每经过一个路由器TTL减1,直至归零仍未达目的地则被丢弃。此字段 防止出现路由环路
CRC
)来检测头部错误。如果发现损坏,则丢弃该包,TCP随后会触发重传机制。
引入:
路由器的工作只在网络层,没有 tcp 层。只有两台主机有 tcp 层,src_ip:src_port(进程)->dst_ip: dst_port(进程)
背景说明:
互联网上的所有IP地址都是经过精心设计和规划的。 强调理解IP地址网段划分及子网划分的重要性,不应仅停留在对子网掩码等技 细节的理解上,而要从更宏观的角度去认识这一过程。
宏观理解:
复杂性与挑战:
具体网络划分:
路由器的作用:
子网是由一组网络号相同的主机组成的集合
那么子网是怎样进行管理的呢??
问题背景:
管理设备:在一个子网中,负责管理子网内IP的通常是路由器。
自动管理解决方案:
🤪 我们来讲一个小故事,背景如下:
每个学校都有很多学院如计算机学院、理学院、化工学院、机械学院、电子信息工程学院等等,每个学生也都有自己的学号,这个学号其实是经过精心设置的。这里我们简化一下把 学号 分成 学院号+自己所在院系内的编号。每个学院也都有自己的编号。 每一个学院都有自己院学生会主席并且他还是院群里面的群主,而且他也有属于自己的学号。并且这个学号在全校范围内唯一。每个院学生会主席都还要在加一个校学生会主席群。
事件如下: 今天电子信息工程学院的一名普通学生李四同学把自己学生证丢了,学生证上面其他信息都模糊看不清了,只有学号(101 00101)可以看得清。 然后计算机学院张三同学(学号:000 01001)在校园内捡到这个学生证。张三同学就想把学生证归还给该同学,但这个学生证只有 学号 看的请。可是张三除了自己院学生号清楚并不清楚其他院的学号。
方法如下: 他知道 学号在全校范围内唯一,他要找这个人,因此张三就在食堂门口抓住一个人就问同学你的学号
查找本质是在做排除。如果进行线性遍历,效率太低了,所以就有了我们的方法二,如下:
因此我们可以从上例知道:网络通信本质是把数据交给目标主机
张三:源主机 李四:目表主机 院学生会主席:路由器 院内的群:局域网 校学生会群:公网
捡到的李四钱包中的学号(ip):学院(目标网络)+学号(目标主机)
补充知识:路由器,认识主机,认识网络目标中的转接,局域网到公网中的查找
为什么第二种方法这么快?因为一次排除一群,排除的效率更高。通过校学生会可以直接锁定了电信学院,排除了其他学院,相当于进行了 网络划分
IP地址分为两个部分,网络号和主机号:
根据网络号查找目标网络,进入目标网络后,再查找并对比IP中的主机号,就确定了目标主机。
最开始时提出一种划分网络号和主机号的方案,把所有IP地址分为五类,如下图所示: 如下图所示 (该图出 自[TCPIP])
什么是 A、B、C 类地址?
其中对于 A、B、C 类主要分为两个部分,分别是网络号和主机号。这很好理解,好比小林是 A 小区 1 栋 101 号,你是 B 小区 1 栋 101 号。
我们可以用下面这个表格, 就能很清楚的知道 A、B、C 分类对应的地址范围、最大主机个数。
那么 A、B、C 分类地址最大主机个数是如何计算的呢?
最大主机个数,就是要看主机号的位数,如 C 类地址的主机号占 8 位,那么 C 类地址的最大主机个数:2^8-2=254
为什么要减 2 呢?
因此,在分配过程中,应该去掉这两种情况
什么是D、E类地址?
相比于上面的 A、B、C类, D 类和 E 类地址是没有主机号的,所以不可用于主机 IP,D 类常被用于多播,E 类是预留的分类,暂时未使用。
① 广播地址用于什么? 广播地址用于在同一个链路中相互连接的主机之间发送数据包。
广播地址可以分为本地广播和直接广播两种。
② 多播地址用于什么? 多播用于将包发送给特定组内的所有主机。
多播使用的 D 类地址,其前四位是 1110 就表示是多播地址,而剩下的 28 位是多播的组编号。
从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围,其划分为以下三类:
IP分类的缺点:
缺乏地址层次性: 在同一网络中使用了B类地址,但是无法按照生产、测试、开发等环境来划分地址层次。这种情况下,缺少地址的层次性划分,使得IP地址的管理和分配缺乏灵活性和有效性。
A、B、C类地址的限制:
虽然上面分类很好,但是随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址;
例如,一个B类地址理论上允许单个子网内存在超过65,000台主机;而A类则更多。然而实际网络架设中很少有网络需要如此多的地址空间,导致许多分配出去的地址并未得到充分利用。
为解决上述问题,提出了CIDR机制
CIDR地址表示通常采用IP地址加上斜线后跟随的子网掩码位数,比如 10.100.122.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号。
10.100.122.2/24
表示IP地址为 10.100.122.2
,属于一个使用子网掩码 /24 的网络,该网络的范围是 10.100.122.0
到 10.100.122.255
,可以支持最多254台主机连接(因为0和255分别是网络地址和广播地址,不能用于主机)
还有另一种划分网络号与主机号形式,那就是子网掩码,掩码的意思就是掩盖掉主机号,剩余的就是网络号。
子网掩码用于将IP地址分成网络部分和主机部分。对于IP地址 10.100.122.2/24,子网掩码 /24 表示前面24位是网络部分,后面8位是主机部分。
现在让我解释一下如何计算子网掩码和网络地址:
IP地址: 00001010.01100100.01111010.00000010
子网掩码: 11111111.11111111.11111111.00000000
----------------------------------------------
网络地址: 00001010.01100100.01111010.00000000
最终得到的网络地址是 10.100.122.0
目的IP & 当前路由器的子网掩码 = 该报文要去的目的网络
在上面我们知道可以通过子网掩码划分出网络号和主机号,那实际上子网掩码还有一个作用,那就是划分子网。
子网划分实际上是将主机地址分为两个部分:子网网络地址 和 子网主机地址
下面我们再来看看子网划分的例子,如下: 【案例1】:
例如上面的 IP 地址:140.252.20.68/24
【案例2】:
225.225.255.240 前面28位是网络号,后面4位是主机号~计算思路如下
可见,IP地址与子网掩码做与 & 运算可以得到网络号,主机号从全0到全1就是子网的地址范围
特殊的 IP 地址
loop back
)测试,通常是 127.0.0.1local 设备如下:
我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数。 那么一共只有 2 的 32 次方 个 IP地址大概是 43 亿左右,而 TCP/IP 协议规定每个主机都需要有一个 IP 地址.
那么这是不是意味着一共只有 43 亿台主机能接入网络❓
实际上由于一些特殊的 IP 地址的存在数量远不足 43 亿;另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址.
此时, CIDR
在一定程度上缓解了 IP
地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP
地址的绝对上限并没有增加),仍然不是很够用。这时候有三种方式来解决:
IPv4 首部与 IPv6 首部的差异如下图:
Pv6 相比 IPv4 的首部改进:
NAT是现在内网到公网上数据转发的主流技术。目前我们用IPv6也能访问公网也是用的类似技术
现在我们知道IP地址可以被分成内网IP和公网IP,那么哪些是内网IP?哪些又是公网IP?
那网络既有内网又有公网我们该如何理解呢?
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet 上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址,如下:
IP | 网络号 | 地址数 |
---|---|---|
10.*/ | 前8位 | 共16,777,216个地址 |
172.16./12 ~ 172.31./ | 前12位 | 共1,048,576个地址 |
192.168.*/ | 前16位 | 共65,536个地址 |
注意:只能用上面这三类来组建局域网,而包含在这个范围中的,都称为私有IP。 其余的则称为全局IP(或公网IP)
因此之前我们经常说IP地址具有唯一性,通常谈的是 全局IP 或者说是 公网IP
验证:ipconfig 查看
公网IP在整个网络都不能重复,但私网IP在不同网段内是可以重复的。
公有 IP 地址由谁管理呢?
🤔 为了讨论 IP 报文的分片问题,我们先思考一下为什么 TCP 协议中滑动窗口中的数据,不打包成一个报文发送呢?为什么要一段一段的发?
首先,传输层要依次将报文向下层发送(数据段–>数据报–>数据帧),由于数据链路层规定,单次发送数据帧的有效载荷不能超过 MTU(最大传输单元,以太网的 MTU 是 1500 字节),当一个 IP 数据报的大小超过了网络的 MTU 限制时,就需要进行分成多个数据包交给链路层(分片)!
所以,当 IP报文太长时,要进行分片;但是谁来分片呢?网络层自己分,因此网络层报头中多了3个字段。
首次我们要明确一下,分片是好还是不好呢?
不好,丢包概率增加了
所以,分片不能作为网络发送的主流,那如何不分片呢?
结论:
分片和组装都是IP协议的任务
分片 ① 检查 MTU 限制:
② 分割数据报:
MF(More Fragment)
位用于指示是否还有更多的分片, DF(Do Not Fragment)
位用于指示数据报是否允许进行分片。③ 添加 IP 头部:
④ 发送分片:
组装
注意:
那么这里就要讲讲:
字段 | 解释 |
---|---|
16位标识 | 报文的标识各不相同,分片报文的标识是一致的,可以根据标识查找分片的报文 |
13位片偏移 | 片偏移表示分片报文的有效载荷距原始有效载荷起始位置的偏移量 |
3位标志 | 1位保留,1位禁止分片,1位更多分片:为1表示中间报文,为0表示为结尾报文 |
在网络传输过程中,可能会发生分片丢失的情况。
假设原始数据包的大小为 3020 字节,MTU 为 1500 字节,那么分片丢失情况如下:
第一个分片:
第二个分片(中间分片):
第三个分片:
此时假设第一个丢了 那么片偏移为 0 的分片就没有了,能判断出分片丢失,如果中间的丢了 那么片偏移也对不上,如果最后一个丢了 那么更多分片为 0 的结尾没了,也能判断出分片丢失,这也就解决了接收方如何确定自己收到收全了
结论:如果报文丢失了,如何检验呢?
比如:一个3420字节的IP报文,可以分成3个分别是1480、1480、440,再给加上报头即可
接收端如何判断收到的报文是普通报文还是分片报文?
分片与组装流程如下:
分片细节补充: ① 有效载荷的分片
② 片偏移
③ 分片包含IP报头
我们可以在 IPSHU 上查看全球 IP 的使用情况
背景:当我们想在家中上网时,如果我们已经使用了某个运营商的手机卡,只需要打电话给运营商,联系其安装网络的师傅来安装。
他们通常会带来一个调制解调器(俗称“猫”)和一个路由器,安装人员会将网络账号与密码设置好,接着配置无线网络名称和密码,这样,家里的设备就可以通过WiFi上网了。
网络基础设施的来源
因此,运营商实际上位于用户和互联网服务提供商之间,扮演着基础设施建设者的角色。
网络访问的控制
运营商有权限制你的网络访问,尤其是当你欠费时,他们可以阻止你的数据报文的转发。除此之外,运营商也可以审核你的上网内容。
例如,发现你尝试访问谷歌、推特等被限制的网站时,运营商可以选择不转发你的请求。
在网络架构上,用户必须 经过运营商的网络才能访问外部互联网服务
主要功能:
组建局域网
在上网过程中,通常会遇到两种密码:
解释: ① 上网账号密码:这是你向互联网服务提供商申请宽带服务时获得的一组账号信息。
② 路由器账号密码:实际上这里可以分为两个部分:
因此我们可以知道:如果邻居能够蹭网,则意味着他们知道了你的Wi-Fi密码。这是因为只要知道正确的Wi-Fi密码,任何人都可以连接到你的无线网络上。
每个家庭都有自己的路由器,负责创建家庭局域网,使用 192.168.*
开头的内网IP。当家庭网络连接到互联网时,需要通过运营商的网络。所以家庭路由器实际上跨越了两个子网:
结论:这意味着当数据从家用路由器发出时,先到达运营商的子网,再经过多级路由器,最终转发到公网。
家庭路由器会配备两个IP地址:
同理,运营商的路由器也具有LAN口IP和WAN口IP:
然而,这带来了一个问题:当不同局域网中的设备使用相同的IP地址(例如,192.168.1.201)时,外部服务提供商(如抖音)如何知道数据包应该返回到哪个局域网?
路由器能横跨两个网络,所以要配两个IP,LAN口连接内网,WAN口连接外网。 IP数据包的传输时,路由器将目的IP与路由表进行对比:
个人主机上的 IP 是私有 IP,而且每个路由器都有两个IP地址:
路由器内的主机(如手机、电脑等)使用局域网的IP地址,而这些IP地址在不同的局域网中是可以重复的。
公网和子网的划分通常可以通过IP地址和子网行。
比如,如果从美国发出一个请求,目标IP地址是湖南长沙的服务器
整个互联网的拓扑结构虽然复杂,但这种逐级转发的逻辑是其核心。运营商在地方上建立了本地网络,并将不同子网进行划分,然后通过公网入口路由器与全球互联网连接。
网络模式如下,可以看到,在接入长沙之后,由公网入私网
注意:
私有 IP 不断被替换的过程:NAT 技术(后面会讲) 为了解决 IP 不足问题,采取了 互联网 = 公网+私网 的模式
💤 上面说到,路由器是集连多个子网的设备,子网内的主机如果要访问公网的服务器,其数据需要路由器转发到公网。这就是 路由转发
IP 数据包的传输过程:
那么如何判定当前这个数据包该发送到哪里呢?
路由器的查找结果可能有以下三种:
Linux路由表可以使用 route
命令查看;Windows下使用 route PRINT -4
route PRINT -4
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 10.152.0.1 10.152.19.48 35
10.152.0.0 255.255.0.0 在链路上 10.152.19.48 291
10.152.19.48 255.255.255.255 在链路上 10.152.19.48 291
10.152.255.255 255.255.255.255 在链路上 10.152.19.48 291
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
route
lighthouse@VM-8-10-ubuntu:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 eth0
10.0.8.0 0.0.0.0 255.255.252.0 U 100 0 0 eth0
_gateway 0.0.0.0 255.255.255.255 UH 100 0 0 eth0
Genmask
进行按位与&操作,然后结果与子网掩码对应的目的网络地址 Destination
进行对比,如果匹配则将数据发送到这个子网,通过对应的发送接口 Iface
发出。
default
,其对应的 Flags
是 UG
【案例】:假设某主机上的网络接口配置和路由表如下:
这台主机有两个网络接口:一个网络接口连到 192.168.10.0/24 网络,另一个网络接口连到 192.168.56.0/24 网络
参数介绍:
Destination
:代表的是目的网络地址Gateway
:代表下一跳地址Genmask
:代表的是子网掩码Flags
:U标志表示此条目有效(可以禁用某些条目);G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络是与本机接口直接相连的网络,不必经由路由器转发Iface
:代表的是发送接口转发过程例 1:如果要发送的数据包的目的地址是 192.168.56.3
转发过程例 2:如果要发送的数据包的目的地址是 202.10.1.2
路由可分为静态路由和动态路由:
路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。
1. 数据包接收与目标解析
2. 路由表查询与匹配
路由表结构:路由表条目包含以下字段:
192.168.1.0/24
)。最长前缀匹配(Longest Prefix Match): 路由器逐条比对目标IP与路由表条目:
Target IP & Genmask == Destination ?
匹配则记录,最终选择掩码最长(最精确)的条目。
3. 转发决策与封装
Iface eth0
对应的 192.168.1.0/24
),则直接通过ARP解析目标MAC并转发。Gateway
字段指定的下一跳IP,通过ARP解析其MAC地址。0.0.0.0/0
的默认路由(Flags UG
)。4. 数据链路层重封装
5. 数据包转发与迭代
6. 路由协议同步
1. 包裹到站:快递分拣员接单
分拣员(路由器): “叮咚!收到一个包裹,收件地址是 上海浦东新区张江路888号(目标IP:
202.96.128.5
)! ——先拆开外层纸箱(数据链路层帧),露出里面的 电子面单(IP头部)。”
2. 查地图:全国分拣路线图(路由表)
智能分拣系统: 1️⃣ 扫描地址:
北京朝阳区/24 → 直送朝阳分站(直连网络)
广东深圳/16 → 下一站广州中心(下一跳网关)
其他地址 → 默认发往上海总枢纽(默认路由)
2️⃣ 精确匹配:
“上海浦东新区属于 202.96.128.0/24
片区!下一站派给 浦东分拣机器人(出接口 eth1
)!”
3. 换标签:贴上新快递单(MAC重封装)
分拣机器人:
00:1A:3F
),贴上 下一站专车标签:
🚛 发车人:浦东分拣中心(MAC:AA:BB:CC)
🏁 收件车:张江路快递车(MAC:DD:EE:FF )`4. 跨城接力:快递车的全国巡游
上海浦东分拣中心:
收件人(目标主机): “终于收到包裹!拆箱后发现是 猫粮大礼包(HTTP响应),赶紧喂主子!”
5. 动态修路:智能地图更新(路由协议)
分拣中心协作:
技术概念 | 快递世界版 |
---|---|
目标IP地址 | 包裹收件地址 |
路由表 | 全国分拣地图 |
下一跳网关 | 跨城专线快递车 |
子网掩码 | 片区划分规则(如“浦东新区/24”) |
ARP解析 | 召唤本地送货员 |
TTL | 包裹保质期倒计时 |
OSPF/BGP | 分拣中心战略合作会议 |
场景1:地址不存在(路由黑洞)
ICMP信使: 骑着摩托追上快递车,塞一张 拒收通知单: “Error 404:收货地址是火星吗亲?” 🛵✉️❌
场景2:高速堵车(网络拥塞)
分拣中心AI: 启动 智能绕路模式(动态路由切换): “检测到京沪高速瘫痪!所有包裹改走长江水运!” 🚢🗺️
通过路由转发机制,网络中的数据包可以在不同的网络之间进行传输,实现了跨网络的通信和互联互通。