主机与主机通信时,传输层只是保证数据传输的可靠性,但是主机A如何找到一条正确的路径到达主机B,就需要依靠网络层
示例: 假设张三的上层是张三爸爸,张三爸爸是学校的校长,张三成绩很好,有考满分的能力,那张三就一定能考满分吗?不一定!!!如果张三在一次数学考试中考了147分/满分150,没有考到满分,那张三爸爸要如何可靠的保证张三考满分呢?重考一次,没考到满分就重考,直到考到满分,这就保证了张三100%能考满分
网络中,数据可是要100%发给对方的!如何保证呢?
TCP/IP协议是互联网的基础通信协议栈,它通过分层设计实现了高效、可靠的网络通信。其中, 传输层(TCP) 和 网络层(IP) 共同协作,解决了“如何100%可靠地发送数据”的核心问题。


IP协议提供一种把数据报从主机A跨网络送到主机B的能力,只是有非常大的概率能做到,要想100%做到就需要依靠传输层TCP协议。
但是要想传输数据报,就需要标识通信两端双方主机的唯一性,IP协议解决的是主机到主机的问题,而上层TCP解决的是进程到进程的问题(因为有端口号),所以要有方式来标识主机的唯一性,因此每台主机都必须设置IP地址(公网IP,但不仅仅是公网IP)
类比:
我想去故宫玩,就需要先去北京;我先去看兵马俑,就需要先去陕西
数据传输也是类似的,想要从主机A到主机B,就需要先找到主机B所在的局域网

节点: 网络中的任何一个设备,是主机和路由器的统称。 主机: 网络的“终点”,通常是产生或消费数据的设备(如个人电脑、服务器、手机)。它配有IP地址,并且有基本的路由控制能力(例如,判断一个数据包是发往本地网络还是外部网络)。 路由器: 网络的“中转站”,主要功能是在不同网络之间转发数据。它配有多个IP地址(每个接口一个),并且拥有复杂的路由控制能力,通过路由表决定数据包的最佳路径
注意:当代路由器已经是一台小型计算机了,是可以工作在应用层的
IP = 目标网络 + 目标主机
路由的本质理解:路由的时候,本质,是从一个子网,进入另一个子网

先来建立一个共识:网络建设,是经历了几十年的规划建设的。也就是说网络是被设计过的
报文路由的时候,最核心的是理解网络是如何被设计的
那为什么要进行子网划分呢?
举个例子:
解决方案:引入分层结构(子网划分)

关键角色类比
学校是我们在上大学之前就已经设计好的,网络也是如此,那网络是被谁设计的呢?运营商!
所以为什么需要子网划分呢?
“未来找目标主机,先必须查找目标网络”,这正是子网划分的核心价值:
查找目标网络,本质就是淘汰其他网络
所以路由报文,本质就是查找主机的问题,而查找的本质是淘汰的过程。
网络号: 标识一个逻辑网络。所有在同一物理网络下的设备,其IP地址的网络号部分必须相同。
主机号: 在同一个网络内部,唯一地标识一台特定主机。

路由器器至少要配两套IP,而且这两个IP地址必须位于不同的网段(即具有不同的网络号)。
我们电脑中的IP从哪来的?
我们电脑中的IP地址来源主要有两种方式:手动配置和自动获取。 手动配置(静态IP地址): 由网络管理员或用户手动设置固定的IP地址、子网掩码、网关和DNS服务器。这种方式适用于网络设备数量不多,且需要固定IP地址的场景,比如服务器、打印机等。
自动获取(动态IP地址): 大多数家庭网络和办公网络中的电脑、手机等设备通常通过动态主机配置协议(DHCP)自动获取IP地址。工作过程如下:
此外,如果设备无法通过DHCP获取IP地址(例如没有DHCP服务器),操作系统可能会自动分配一个169.254.x.x(IPv4)或fe80::(IPv6)的链路本地地址(Link-Local Address),这样设备只能在同一本地网络段内进行通信,无法连接互联网。
过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类,如下图所示(该图出自 [TCPIP])。

子网划分的本质:把32位比特位进行划分,确定网络号有多少位
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址;
针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)(无类别域间路由):

例子1的详细解释
思路:
网络号是通过将IP地址和子网掩码进行按位与(AND)操作得到的。例如:
子网地址范围由网络号确定:网络号是子网的起始地址,结束地址是网络号加上主机位全1(本例中主机位为8位,所以范围是256个地址,但第一个地址为网络号,最后一个为广播地址)。
例子2的详细解释
思路:
子网划分通过调整子网掩码来分割IP地址空间,从而创建更小的子网。

当一台计算机需要发送一个数据包时,系统会首先判断这个数据包的目的地是否就是本机自身。如果是,则数据包不会进入物理网络,而是通过“环回”机制直接交给本机的接收程序处理。
环回设备的作用:它是一个虚拟的网络接口,用于实现本机内部进程间的网络通信。它使得访问本机服务(如localhost或127.0.0.1)就像访问远程服务器一样,无需经过物理网络,从而更加高效和安全。
我们知道,IP地址(IPv4)是一个4字节32位的正整数,那么一共只有 2的32次方 个IP地址,大概是43亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址.
这意味着,一共只有43亿台主机能接入网络么?
实际上,由于一些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址.
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加), 仍然不是很够用,这时候有三种方式来解决:
另外,IPv6是根本的解决方案,它提供了几乎无限的地址空间(2^128个地址),但由于兼容性、成本和技术迁移的难度,目前仍在逐步推广中。
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都可以,但是RFC 1918规定了用于组建局域网的私有IP地址
包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP);
公网 : 内网(子网/局域网) = 1 :n,即一个公网IP对应多个内网设备。
私有IP地址的作用
私有IP地址是专用于局域网(LAN)或内部网络的地址,由RFC 1918定义,目的是:
为什么私有IP不能出现在公网上?
核心原因:路由不可达 + 回程路径缺失 当一个数据包从内网设备发出,其源IP是私有IP(如 192.168.1.100),目标IP是公网IP(如 8.8.8.8),这个数据包会被发送到 网关(通常是路由器) 。路由器会执行 NAT(Network Address Translation,网络地址转换):
此时,公网上的服务器收到请求后,会将响应发送回 203.0.113.5:60000。路由器接收到该响应后,根据NAT表将目标IP还原为 192.168.1.100:50000,并转发给内网设备。
如果私有IP直接出现在公网上会发生什么?
假设某台设备使用私有IP 192.168.1.100 直接向公网发送数据包:
⚠️ 这就是“因为回不来!!!”的原因。
📌 总结:私有IP地址不是全球唯一的,也不被公网路由器识别,因此不能直接用于公网通信。
我们普通人接触的是“内网” “我们任何普通人,直接接触的,根本不是公网,我们直接接触的是,都是内网,局域网、子网”。

地区或者国家IP的分布:https://zh-hans.ipshu.com/country-list
网络结构分层解析 整个网络可以分为三个清晰的层级:
关键技术与概念
举例说明通信过程
真实的网络结构非常复杂,即涉及到划分公网IP的组织,ICANN,还要在全球范围内进行区域划分,比如亚太,北美,欧洲等,又要考虑各个国家内部的ISP代理,整体拓扑非常复杂,我们简化所有过程,简单理解公网即可
如果把互联网比作一个庞大的数字国家,那么运营商就是它的基础设施建造者、道路规划者、交通管理者和“户籍”管理部门。
他们远不止是“拉网线”那么简单。以下是运营商扮演的四个关键角色:
公网(Public Network)是指面向全球开放、可被互联网任意节点访问的网络空间。公网IP(Public IP Address)是分配给网络设备、服务器或服务的全球唯一标识符,用于在互联网上进行通信。
公网IP由国际组织(如IANA)统一分配给区域互联网注册管理机构(RIRs),例如:
这些RIRs再将IP地址块分配给国家或地区或地区的ISP(互联网服务提供商)或大型企业。
注意:
✅ 因此,分配不是以“国家”为单位,而是以“地区”为单位,再结合实际需求(如网民数量、业务规模)进行分配。
各国运营商向所在地区的RIR申请公网IP资源:
一个地区或国家或地区的网络能力(如可承载的网站数量、云服务规模、物联网设备连接数)直接受限于其拥有的公网IP地址池大小。
例如:
注意:但我们下面为了方便理解和讲解,就简单认为公网IP以国家分配。

核心架构:分层与互联 整个网络可以划分为几个清晰的层级,体现了网络设计中的“分级汇聚”原则:
IP地址规划详解
示例:
✅ 意义:每个国家拥有一个独立的 /8 网段(约1677万IP),用于标识其国家级骨干网络。这是国际层面的路由基础。
在中国 5.0.0.0/8 基础上,再划分子网:
✅ 意义:每个省获得一个 /16 子网(约6.5万IP),构成“国内骨干网”的一部分,省际路由器通过BGP交换路由信息。
以陕西为例:5.1.0.0/16 可再划分为多个市级子网:
✅ 意义:每个城市分配一个 /20 子网(约4096个IP),满足城市级网络需求,同时避免IP浪费。
例如西安本地网络:
✅ 关键点:
路由原理与路径选择
网络地址 | 子网掩码 | 下一跳地址 | 说明 |
|---|---|---|---|
1.0.0.0 | 255.0.0.0 | 1.0.0.1 | 俄罗斯 |
2.0.0.0 | 255.0.0.0 | 2.0.0.1 | 美国 |
3.0.0.0 | 255.0.0.0 | 3.0.0.1 | 英国 |
4.0.0.0 | 255.0.0.0 | 4.0.0.1 | 法国 |
5.0.0.0 | 255.0.0.0 | 5.0.0.1 | 中国(自己) |
5.1.0.0 | 255.255.0.0 | 5.1.0.1 | 陕西 |
5.1.16.0 | 255.255.240.0 | 5.1.16.1 | 西安 |
✅ 路径查找逻辑: 报文到达中国路由器 → 查找目标IP属于哪个子网 → 转发至下一跳。
问题1:俄罗斯访问目标地址 5.1.16.X 的路径
✅ 具体步骤:
问题2:河北报文如何发送至 5.1.16.X
✅ 具体步骤:
在复杂的网络结构中,找出一条通往终点的路线;
路由的过程,就是这样一跳一跳(Hop by Hop) “问路” 的过程. 所谓 “一跳” 就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.

IP数据包的传输过程也和问路一样.
那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表;

假设某主机上的网络接口配置和路由表如下:

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

第二行(32位/4字节) - 分片相关字段 这一行的三个字段共同用于处理数据包的 分片 和 重组。当一个大的数据包要经过一个最大传输单元较小的网络时(如以太网的MTU通常是1500字节),路由器需要将它分割成多个更小的“分片”。
为什么需要分片?
当一个IP数据报的大小超过了网络的MTU(最大传输单元)限制时,就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据长度。
例如,以太网MTU通常为1500字节(含IP头),若IP数据报长度为1550字节,则需分片。
注意:分片发生在发送端或中间路由器,重组只在接收端进行。
分片带来的核心问题
任何一个分片丢失,都表示该报文整体丢失!!!
分片不是主流,被逼为之
如何减少分片?
减少分片的本质,在哪一层?传输层!!!
解决方案:MSS(最大报文段长度) MSS是TCP层的概念,它定义了TCP一次能发送的最大数据块大小。
TCP在三次握手时会协商双方的MSS值。理想的MSS值应为:MSS = MTU - IP首部(20) - TCP首部(20) = 1460字节(对于标准以太网)。
通过设置合适的MSS,TCP可以保证它交给IP层的报文,即使加上IP首部,总长度也不会超过MTU。这样,IP层就完全不需要进行分片了。
另外,滑动窗口是TCP的流量控制机制,它允许发送方在没有收到确认的情况下连续发送多个TCP段。这些TCP段的大小由MSS决定,所以它们不会导致IP分片。如果TCP不进行分段,而是发送非常大的数据块,那么这些数据块在IP层就很可能被分片,从而带来上述问题。
因此,TCP分段(分成一段一段的)和滑动窗口机制是相辅相成的:
TCP之所以要分段,本质是为了将"何时分片、如何分片"的控制权掌握在自己手中,而不是交给不可控的IP层。
如何分片
接收方如何判断一个数据报是否被分片?
依据“标志”字段中的MF位:
如果 片偏移 != 0,则说明这个报文的数据部分在原始报文中的起始位置不是0,它肯定是一个分片(可能是中间或最后一个分片)。
简单总结:只要 MF位为1 或 片偏移不为0,接收方就知道当前收到的是一个分片。
同时,所有分片具有相同的“标识”字段(即16位标识字段),用于区分不同报文的分片。
接收方如何确认所有分片都已收到?
接收端通过以下步骤确认:
如果出现以下三种情况之一,则表示没有收全,重组会失败:
若某个分片丢失(如第一片或中间某片),则整个报文无法重组,会被丢弃。
接收方如何组合形成完整的报文?



假设在IP层,有一个大小为3000字节的报文,如何分片?如何组装呢?
IP数据报的分片过程 IP分片的核心,是依靠IP头部中的三个字段来协同工作:16位标识、3位标志、13位片偏移。
对于一个总长度为3000字节(其中IP头部20字节,数据部分2980字节)的报文,在MTU为1500字节的链路上分片后,每个分片的情况如下表所示:
分片 | 总长度 (字节) | 数据长度 (字节) | MF 标志 | 片偏移 | 偏移量计算 (字节) |
|---|---|---|---|---|---|
1 | 1500 | 1480 | 1 | 0 | 0 × 8 = 0 |
2 | 1500 | 1480 | 1 | 185 | 185 × 8 = 1480 |
3 | 40 | 20 | 0 | 370 | 370 × 8 = 2960 |
具体分片步骤如下:
每个分片都将作为一个独立的数据报进行传输,它们可能经由不同的路径到达目的地。
接收端的分片组装 接收端的IP层负责将这些“碎片”重新拼凑完整,其过程如下: