一、网络层的背景
我们每天上网------打开浏览器、输入网址、发消息、视频通话------看似轻而易举。可在这条看不见的网络背后,信息如何准确地从我的电脑"跑"到地球另一端?
有人会说:"靠 IP 地址。"
没错,但这只是答案的一半。
在真实的网络世界里,光有地址不够。你必须知道:这条信息要走哪条路?途中能不能被送达?如果中途丢了谁来管?
这些问题的答案,正藏在网络层(Network Layer)------也就是我们今天要讲的主角:IP(Internet Protocol)。
它不是最耀眼的协议,却是整个互联网的"脊梁骨"。如果说 TCP 是互联网的"守信者",那 IP 就是它的"信使"------负责把一切数据包送往目的地。
我们之前说过MAC地址的概念:MAC 地址用来识别数据链路层中相连的节点。
它的长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
其在网卡出厂时就确定了, 不能修改。 mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址, 可能会冲突; 也有些网卡支持用户配置 mac 地址)。
我们知道计算机网络是一层一层叠起来的。最底下是物理层(Physical Layer),负责把电信号、光信号送出去;上面是数据链路层(Data Link Layer),像快递公司在小区内部派送包裹,用 MAC 地址标识每一台机器。
我们曾经以唐僧取经的例子来帮助大家理解MAC地址,但是实际问题是:MAC 地址只在局域网里有意义。
就像你在小区门口叫外卖,写上"B栋302",骑手当然能找到你;但要是换一个城市、换一个省呢?没有城市名、街道号,外卖系统就懵了。
这就是 MAC 地址的局限。它没有"世界观",只认同一个局域网。
于是,人们引入了"IP 地址"这个概念。
它就像给每一台机器都挂上了一张"全球通行证",告诉世界:
"我在地球的某个角落,请把数据送到我这里。"
IP 层的出现,正式让不同局域网之间的通信成为可能------也就是互联网(Inter-Network)这个词最初的意义。

以这个图的主机B与主机C为例,他们直接并不是直接连接的,甚至可能都不在一个局域网里。
所以就会衍生出两个问题:
- 路径选择的问题:我为什么要把信息交给下一个route。
- 怎么把数据交给路由器F的问题。
对于第一个问题,我们可以解答,因为我们要把信息传给C,所以我们需要把信息传给这个route,更准的来说,我们的路径选择的依据就是根据我们的目标,目标决定路径。而路径选择的重要依据就是IP。
IP网络不像电话系统那样需要先建立端到端的连接。它采用的是"逐跳转发"模型。每个路由器只关心一个问题:"为了到达这个目标IP,我的下一站应该是谁?" 它不需要也知道通往目标的完整路径。
每个路由器内部都维护着一张路由表,这就是它的"道路地图"。当数据包到达时,路由器会进行以下操作:
- 查找 :提取数据包中的目标IP地址,并在路由表中进行查找。
- 匹配:遵循"最长前缀匹配"原则,找到最具体的一条路由。
- 转发:根据匹配到的路由条目,将数据包从指定的接口发送给指定的"下一跳"路由器。
而对于问题二,可以转化为局域网通信的问题。
虽然我们心里想的是"把这个IP包发给路由器F",但在物理链路上,我们无法直接操作IP地址。我们必须使用局域网的语言------MAC地址。
这个过程就是由 ARP协议 完成的。
-
问题一(路径选择) 是 网络层(IP) 的核心任务,依靠 IP地址 和 路由表 来解决。它关注的是 端到端 的逻辑。
-
问题二(数据交付) 是 数据链路层(MAC) 的核心任务,依靠 MAC地址 和 ARP协议/交换机 来解决。它关注的是 点到点 的物理传输。
整个互联网的通信,就是这两个过程在不同设备、不同网络间一遍又一遍地交替进行,直到数据包最终到达目的地。
二、重谈TCP/IP
IP 层做的事情其实很朴素:
- 确定目标地址是谁(寻址);
- 想办法把包送过去(转发)。
看似简单,但这两件事决定了整个网络的生死。
举个例子。
你要给朋友寄快递:
- 你得知道对方的收货地址(寻址)
- 你得知道哪条路线能送到(转发)
如果地址写错、路径选错,快递永远到不了。
IP 协议就是在做这件事。
它定义了数据报文的格式(IP 报头),规定了每个包的源地址、目标地址、长度、版本号等信息,然后交给下层去传输。
每经过一个路由器,都会检查这个包的目标地址,决定下一步要送往哪里。
目标决定路径,路径决定命运。
这句话放在网络层上,再贴切不过。
所以IP层的核心作用,就是把数据包 跨网络 的转发到目标主机上去
很多人第一次听说"IP 不保证可靠传输"时会觉得奇怪。
"那要是丢包了怎么办?"
答案是:IP 层不管。
这不是设计缺陷,而是刻意为之。
因为 IP 的使命,是尽力而为(Best Effort)。
它不建立连接,不做重传,不确认,也不记忆状态。
它只负责"把包尽力往前送",就像一个信使,不论风雨,都试图投递。
如果包在中途丢了、超时了、被路由器丢弃了,IP 不会回头,它只会继续处理下一个包。
那谁来保证可靠?
答案是:上层的 TCP(传输层)。
TCP 会检查顺序、确认接收、重传丢包、控制速度......所有"可靠性"的机制都在那里。
这就是分层的智慧:
- IP 负责"通";
- TCP 负责"准";
- 应用层负责"用"。
各司其职,互不干扰。

说到底,IP层只是提供了一种能力,把数据从A主机,跨网络转发到B主机,但是有能力,就一定可以做到吗?
当时不会,这就跟你们班上的学霸,数学有考满分的能力一样,但是就一定能保证每次考试都是满分吗?
如果一定想要我们的这个学霸每次都考150,怎么办呢?
当然是让我们的学校层面专门负责组织一次重考喽,这次不能150,重考一次,不就可以了(太狡猾了)。
而我们的TCP协议,就是负责重考的学校。
三、IP协议头格式
对于这个IP协议的报头,我们仍然先要理解清楚两个问题:
- IP协议如何实现解包以及分包的过程,如何分用?
- IP协议的这些字段分别有什么作用?
我们之前学了TCP,你会发现,TCP协议与IP协议的格式十分相似,所以我们理解也能近似理解:
TCP协议格式:
IP协议格式:

IP协议的解包与封包
我们可以看见,IP协议的报文也分为:报头,选项,以及数据三个部分,其中报头的长度也是20字节。
所以与TCP一样的,我们可以先读取20个字节,把报头字段信息全部读取。随后你会发现,这里也会有个四位首部长度字段,这个字段的作用和TCP里的首部长度作用是完全一样的。
四位二进制的范围是0-15,其同样有个单位:4.
当我们发送的报头加选项的长度为32时,此时四位首部长度值为1000(2进制),也就是8,因为4 x 8 = 32,就是告诉我们,除去20字节长度的报头之外,还有12字节长度的选项需要你读取。
所以报头加选项的长度范围是20-60,选项的取值范围是0-40,所以我们的首部长度的范围就是5-15。
基础IP协议字段介绍
接下来,来简单介绍几个IP协议的字段。
四位版本
它的唯一作用就是标识当前数据包使用的IP协议版本。接收方首先读取这4位,来确定应该如何解析这个数据包的其余部分。
目前,这个字段只有两个值具有实际意义:
-
0100
(十进制 4)- 这表示数据包使用的是 IPv4 协议。
- 这是目前互联网上最主流的协议。当我们说一个设备的IP地址时,默认指的就是IPv4地址(如
192.168.1.1
)。
-
0110
(十进制 6)- 这表示数据包使用的是 IPv6 协议。
- 这是下一代IP协议,旨在解决IPv4地址耗尽的问题。它使用更长的地址(如
2001:0db8:85a3::8a2e:0370:7334
)。
关于IPv6与IPv4的话题我们后面会详细提到。
八位服务类型
这个字段的设计初衷非常明确:让发送方可以告诉网络,这个数据包期望获得哪种类型的服务,从而希望网络能够进行相应的优先级处理和路由选择。
这8位在原始的 IPv4 标准 (RFC 791) 中被划分为两个部分:
比特范围 | 名称 | 作用 |
---|---|---|
0-2 | 优先级 | 定义数据包的优先级(0-7)。 |
3-5 | 服务类型 | 指定数据包在延迟、吞吐量、可靠性方面的偏好。 |
6 | 保留位 | 最初未使用,设为0。 |
一般来说,3 位优先权字段(已经弃用)。而 4 位 TOS 字段, 和1 位保留字段(必须置为 0)。
4 位 TOS 分别表示: 最小延时, 最大吞吐量, 最高可靠性,最小成本。
这四者相互冲突, 只能选择一个. 对于ssh/telnet 这样的应用程序, 最小延时比较重要; 对于 ftp 这样的程序, 最大吞吐量比较重要。
这个 TOS/DiffServ 字段正是网络设备进行差异化转发策略的核心依据之一。
它回答了路由器在面对多个数据包需要同时转发时,一个至关重要的问题:"我应该先转发谁?谁更重要?"
八位生存时间
生存时间 是一个位于 IP 头部的、长度为 8 比特的字段。这意味着它的取值范围是 0 到 255。
它的单位是 "跳",即经过路由器的次数。
TTL 的核心作用只有一个:防止数据包在互联网中无限循环下去。
在复杂的网络环境中,由于路由配置错误或网络拓扑变化,可能会出现 路由环路。即数据包在两个或多个路由器之间来回传递,永远无法到达目的地。如果没有一种机制来终止这种数据包,它们会越积越多,最终耗尽网络资源,导致网络瘫痪。
TTL 就是为解决这个问题而生的"自杀式计数器"。
TTL 的工作机制非常简单而有效:
-
设置初始值:发送端(源主机)在创建 IP 数据包时,会为 TTL 设置一个初始值。
-
不同操作系统的默认值不同:
-
Windows : 通常是
128
-
Linux/Unix/macOS : 通常是
64
-
一些网络设备(如思科路由器)可能使用
255
-
-
这个值可以根据需要由应用程序修改。
-
-
逐跳减一 :数据包每经过一个路由器 ,该路由器在转发此数据包之前,必须将 TTL 值 减 1。
-
判断与丢弃:路由器在减 1 后,会立即检查新的 TTL 值:
-
如果
TTL > 0
:路由器正常转发这个数据包。 -
如果
TTL = 0
:路由器会 丢弃 这个数据包,并向数据的原始发送端发送一个 ICMP 超时消息。
-
十六位总长度
16位总长度 是 IP 协议头中的一个字段,它指示了整个 IP 数据包的总字节数。
- 位置:位于 IP 头部的第 3 和第 4 字节。(紧随版本、IHL 和服务类型字段之后)
- 长度:16 位(2 字节)。
- 单位:字节。
它的核心作用是 告诉接收设备,当前这个 IP 数据包在哪里结束,下一个数据包从哪里开始。
当接收方的网络层从数据链路层收到一串原始的二进制数据流时,它需要一种方法来准确地切分出一个个独立的 IP 数据包。总长度 字段就是这个"切割器"的刻度。
我们都知道总长度 = IP 头部长度 + IP 数据载荷长度
- IP 头部:包括固定的 20 字节和可选的选项字段(最多 40 字节)。
- IP 数据载荷:里面封装的是上层协议(如 TCP、UDP 或 ICMP)传递下来的完整数据。
假设一个 TCP 段长度为 1400 字节,它被传递给 IP 层。IP 层为其加上一个 20 字节的固定头部(没有选项),那么:
总长度 = 20 字节 (IP头) + 1400 字节 (TCP段) = 1420 字节
这个 1420
就会被填入 IP 头部的 16位总长度 字段中。
四、网段划分
背景介绍
先来给大家介绍一下相关概念。
我们的IP地址大家都知道是用32位来存储的,所以我们选择将其划分成四段,每一段有八个比特位,每一段的数据范围就是0-255。
一个IP地址,就变成了这样的形式:255.255.143.32。这也是我们常说的点分十进制的IP地址。
而我们把前面三段,称为网络号,后面一段,称为主机号。
网络号: 保证相互连接的两个网段具有不同的标识。
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号。
以前面的例子,255.255.143就是网络号,32就是主机号。

所谓的子网,其实就是把网络号相同的主机放到一起。
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复。
既然我们的路由器可以将不同子网里面的信息进行转发,那么这个路由器是不是也需要有多个子网对应的IP地址?所以路由器有多个网络接口(物理的或逻辑的)。每个接口都连接到一个独立的子网,并且被配置一个该子网内的IP地址。
在上面这个图例,192.168.128网络号是一个子网的网络号,192.168.144是另外一个子网的网络号,一个路由器连接着这两个子网进行信息的转发,所以这个路由器必须要同时拥有这两个子网对应的网络号的IP地址。
一个子网中的IP地址都是从哪里来的呢?想一想你家里第一个入网的设备是什么?
是不是路由器啊!所以路由器拥有构建子网的能力。
我们链接路由器就是在向路由器申请IP地址。
当我们的信息在我们的子网中传播时,我们看见目的IP跟我们这个子网的网络号不一致,我们就知道这个目的地不在我们这个子网中,从而想给路由器,由它去转发这个信息给其他子网进行判断。
所以一个信息,被转发:
- 根据目标网络号,转发到目的网络号的子网中
- 根据主机号,来进行内网转发。
通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的 IP 地址都不相同。
子网划分
一个 255.255.143.xxx
这样的网络,主机号部分有 8 位(0-255),所以这个网络理论上能容纳 28−2=25428−2=254 台主机(去掉全0的网络地址和全1的广播地址)。
现在,想象一下这是一个拥有200多名员工的公司网络,会有什么问题?
-
广播风暴 :任何一台电脑发出的广播包(比如"谁是192.168.1.1?"),其他所有200多台电脑都能收到并需要处理。网络会变得非常嘈杂和缓慢。
-
安全风险:所有设备都在一个"大房间"里。市场部的电脑和财务部的电脑可以直接通信,没有隔离。
-
管理混乱:如果网络出问题,很难定位是哪一部分的故障。
结论 :把一个公司所有设备都放在一个 X.X.X.0/24
的网络里,是非常低效且危险的。我们需要把这个大网络分割成更小的、易于管理的子网。
这就是我们要进行子网划分的理由。
再给大家举个例子。
我们在校园里,捡到一个钱包,钱包里有一个学生证,没有姓名,只有学号。这个时候,你会怎么归还这个钱包?
我们肯定不会一个一个的去询问:这个是你的钱包吗?
这个就是线性遍历,效率低下,怕不是要问到猴年马月去了。
这个时候,学号的作用就体现出来了。
我们的学号假如是24 42 21 023这样的(假如),他不是一个无意义的划分。一般来说,这些都代表着年级24级,42代表某一个学院的代号,21代表这个专业的编号,023代表他在该专业的编号。
我们把每个学院取一个学院代号,每一个专业都进行专业编号,这个就是子网划分。它本质上是提高了我们搜索的效率。
我们在找到该同学之前,是不会关心它的学院与专业以及编号的,先决定年级,随后在去看学院与专业,最后才去看他的编号。
我们的报文也是一样,在转发的过程中,在到达目的子网之前,路由时只会去看网络号部分,不会去看主机号。到达目标网络号,才进行内网转发。
手动管理子网内的 IP, 是一个相当麻烦的事情:
- 有一种技术叫做 DHCP, 能够自动的给子网内新增主机节点分配 IP 地址, 避免了手动管理 IP 的不便。
- 一般的路由器都带有 DHCP 功能. 因此路由器也可以看做一个 DHCP 服务器。
过去曾经提出一种划分网络号和主机号的方案, 把所有 IP 地址分为五类, 如下图所示(该图出 自[TCPIP])。!
- 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
随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址。
例如, 申请了一个 B 类地址, 理论上一个子网内能允许 6 万 5 千多个主机.。A 类地址的子网内的主机数更多.
然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的 IP 地址都被浪费掉了。
针对这种情况提出了新的划分方案, 称为 CIDR(Classless Interdomain Routing):
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
- 子网掩码也是一个 32 位的正整数. 通常用一串 "0" 来结尾
- 将 IP 地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号
- 网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关
引入子网掩码的根本目的是:打破IP地址分类的桎梏,实现灵活、高效的IP地址分配与管理,以解决地址空间耗尽和路由表爆炸性增长两大危机。
-
有类编址的问题 :假设一个ISP(互联网服务提供商)被分配了8个连续的C类地址:
192.168.0.0/24
到192.168.7.0/24
。在没有CIDR的时代,互联网核心路由器需要为这8个网络维护8条独立的路由表项。 -
CIDR的解决方案:
-
ISP可以告诉全世界:"所有目的地是
192.168.0.0
到192.168.7.255
的流量,都发给我即可。" -
如何用一句话表达这个范围?就是使用一个CIDR前缀:
192.168.0.0/21
。 -
通过计算可以发现,
/21
这个掩码正好覆盖了从192.168.0.0
到192.168.7.255
的所有地址。 -
于是,全球的路由器只需要维护 1条路由表项 (
192.168.0.0/21
) 来代替原来的8条。这极大地减少了路由表的体积,提升了路由查找效率。
-
/21
是 CIDR notation,它表示子网掩码中连续'1'的位数 。子网掩码中,'1'位必须是连续的,'0'位也必须是连续的。中间不能有'1'和'0'交错的情况
二进制表示:
11111111.11111111.11111000.00000000
点分十进制表示(我们更熟悉的形式):
- 前两个
11111111
各等于255
。 - 第三个
11111000
等于248
(计算:128+64+32+16+8=248)。 - 最后一个
00000000
等于0
。
所以,/21
等价于子网掩码 255.255.248.0
。

以例1来说,子网掩码就是/24,我们的主机号0100 0100(68),与子网掩码的后八位进行一个按位与操作结果是全零,代表子网地址范围就是从0开始计算,一共有主机号的位数(8位)个。
以例2来说,子网掩码就是/28,我们主机号0100 0100(68),与子网掩码进行按位与操作结果为0100 0000,就决定了我们的网络号不只是140.152.20,还要加上后面的0100(因为是28,代表网络号要计算到前28位,只有后四位是主机号)。然后这个网段的范围数量就只有8(主机号只有四位),范围为140.252.20.64-140.252.20.79。
可见,IP 地址与子网掩码做与运算可以得到网络号, 主机号从全 0 到全 1 就是子网的地址范围。
特殊的 IP 地址:
- 将 IP 地址中的主机地址全部设为 0, 就成为了网络号, 代表这个局域网
- 将 IP 地址中的主机地址全部设为 1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包
- 127.* 的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1
所以,就算我们的主机号的取值范围是0-255,但实际上已经被占用了两个IP地址了(网络号地址以及广播地址)。

IP地址的数量限制
我们知道, IP 地址(IPv4)是一个 4 字节 32 位的正整数. 那么一共只有 2 的 32 次方 个 IP地址, 大概是 43 亿左右. 而 TCP/IP 协议规定, 每个主机都需要有一个 IP 地址。
这意味着, 一共只有 43 亿台主机能接入网络么?
实际上, 由于一些特殊的 IP 地址的存在, 数量远不足 43 亿; 另外 IP 地址并非是按照主机台数来配置的, 而是每一个网卡都需要配置一个或多个 IP 地址。
CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率, 减少了浪费, 但是 IP地址的绝对上限并没有增加), 仍然不是很够用. 这时候有三种方式来解决:
方案一:动态分配IP地址
- 这是什么? 主要由 DHCP 协议 实现。您的ISP(互联网服务提供商)拥有一个公网IP地址池。当您家的路由器拨号上网时,ISP的DHCP服务器会临时租借一个公网IP给您的路由器。当您断线或租约到期,这个IP就会被回收并分配给其他用户。
- 解决了什么问题? 解决了 "同时在线" 主机数不足的问题。不是每个人都在同一时间上网。这使得ISP服务的用户数量可以远多于其拥有的公网IP数量。
- 局限性:它并没有增加IP地址的绝对数量,只是一种"分时复用"的优化。当所有用户同时在线时,地址依然不够用。
方案二:NAT 技术(网络地址转换)(后面详细介绍)
这是迄今为止最重要、最核心的"续命"技术,它从根本上改变了IP地址的使用模式。
- 核心思想 :"整个家庭或公司内部,对外只使用一个公网IP地址。"
- 它是如何工作的?
- 内部网络 :您的家庭或办公室局域网使用私有IP地址 (如
192.168.1.x
)。这个网络可以有成百上千台设备。 - 边界设备 :您的路由器作为NAT设备,拥有一个私有IP (内网口)和一个公网IP(外网口,由ISP动态分配)。
- "翻译"过程 :
- 当您的电脑(
192.168.1.10
)访问百度时,数据包到达路由器。 - 路由器不仅转发数据包,还会修改它! 它会将数据包IP头中的源IP 从
192.168.1.10
替换 成自己的公网IP ,并记录下这个连接(比如:内网192.168.1.10:5555
对应外网公网IP:8888
)。 - 百度收到请求后,回复给路由器的公网IP。
- 路由器根据之前记录的连接表,将回复数据包中的目标IP 从公网IP替换回
192.168.1.10
,并发送给您的电脑。
- 当您的电脑(
- 内部网络 :您的家庭或办公室局域网使用私有IP地址 (如
- 革命性影响 :
- 极大地节省了公网IP :一个公司、一个家庭、一所学校,无论内部有多少设备,在互联网上看起只是一个(或少数几个)IP地址在活动。
- 带来了副作用:它在一定程度上破坏了互联网"端到端"的设计原则,增加了复杂性,但也意外地提供了一层"防火墙"效果(外部无法直接发起与内网主机的连接)。
方案三:IPv6
这是终极解决方案,但普及缓慢。
-
地址空间 :128位,地址数量是 2^128 个。这不是一个简单的"更多"的概念,而是一个天文数字,足以给地球上的每一粒沙子都分配一个IP地址。
-
不仅仅是地址变长:
- 简化报头:提高了路由器处理效率。
- 更好的安全性:IPsec成为标准组成部分。
- 支持自动配置:无需DHCP也能轻松获取IP地址。
-
为何普及慢?
- 不兼容性:IPv4和IPv6是两个独立的协议,需要复杂的过渡技术(双栈、隧道等)。
- NAT的成功:NAT技术如此有效,使得向IPv6迁移的紧迫性降低了。
- 成本和惯性:升级全球网络基础设施需要巨大的成本和时间。
私有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)。
对于私有地址来说,其只能用来组建局域网,不能出现在公网中:
由于私有IP只能在内网中使用,所以不同的子网,其私有IP地址可以重复。但是公网IP绝对不能出现重复。
网络架设的标准流程是:先进行子网规划,然后进行实施。在公网和私网中,统一采用CIDR(无类别域间路由)的方式,即"IP地址 + 子网掩码"的方法来进行网络建设和路由。
运营商
申请IP,无论是公网IP还是内网IP,在进行网络建设的时候,都是让运营商来做的。

当我们谈 IP 地址的时候,其实是在谈"身份"与"范围"这两件事。
在整个互联网的世界里,公网 IP 就像身份证号,全世界唯一;而私有 IP 则像小区门牌号,只在本小区(子网)里有效。
因此,不同的子网之间,私有 IP 地址可以重复使用,而公网 IP 是严格不能重复的。这也是为什么你的电脑可能是 192.168.1.3
,而我这边的电脑也可以是 192.168.1.3
------我们只是在不同的"家庭局域网"中生活。
1. IP 的分配:从运营商开始
无论你是一个学校、公司,还是家庭用户,IP 地址的分配权都掌握在运营商手里。
当你申请宽带时,实际上你是在向运营商"租用"网络资源,其中最核心的部分,就是一段属于你的 IP 地址空间。
一般来说,运营商会在网络建设时进行大规模的 IP 规划------他们会先根据客户群体划分子网,然后分配网段,配置子网掩码。
这些掩码定义了"哪些位代表网络号,哪些位代表主机号"。这样,整个公网才能以层次化的方式组织起来,不至于乱成一团。
2. 路由器的双重身份:WAN 与 LAN
在家庭网络中,一个路由器通常拥有两个 IP 地址:
- WAN 口 IP:外部网络(例如电信或移动)分配给你的公网或半公网 IP。
- LAN 口 IP :你家庭内部局域网的"网关地址",通常是
192.168.1.1
。
这两个接口分别连接着两个世界------
WAN 口面对外部互联网,LAN 口负责内部的电脑、手机、电视机。
LAN 口下的设备,比如你的电脑 192.168.1.101
、手机 192.168.1.102
,都属于这个小小的子网。
它们之间可以自由通信,但若要访问外部世界,必须通过路由器这个"守门人"。
路由器也分家用和企业使用的路由器。
3. 子网的重复与隔离
值得注意的是,不同家庭的路由器几乎都会使用相同的 LAN 网段,例如:
家A:192.168.1.0/24 家B:192.168.1.0/24 公司C:192.168.1.0/24
这并不会造成冲突,因为它们都处在各自独立的局域网中。
子网内部的 IP 地址不能重复,但不同子网之间重复是完全没问题的。
换句话说,每个路由器其实都在"模拟一个小互联网"。
4. 层层嵌套的网络结构
从宏观上看,你家的路由器本身也是一个"节点",它位于运营商的更大子网之中。
你的家庭网络可以看作是运营商路由器下的一个"分支网络",而运营商路由器又可能接入更上层的骨干网设备。
这种多级结构意味着:
每个路由器既是一个"小型网络的核心",也是"更大网络的成员"。
而最外层的运营商路由器,其 WAN 口 IP 就是真正的公网 IP。
整个互联网就是由无数这样的"层叠子网"构成的。
所以,我们从自己家的路由器发出去的报文,并没有直接到达公网,而是必须先到达运营商构建的一个更大的子网中。
也正是因为如此,我们才需要向运营商交钱:我们的报文必须通过运营商的转发,才能抵达公网
所以,运营商可以因为你欠费不交,从而不让你进入公网,也可以因为你访问的地址非法,从而拦截你。
5. NAT:让内网用户共享公网
问题来了------如果全世界几十亿设备都要独占公网 IP,IPv4 早就不够用了。
那么,如何让多个内网设备共享一个公网 IP?
我们使用最广泛的做法就是------NAT(Network Address Translation,网络地址转换)。
当子网内的主机(例如 192.168.1.101
)想访问外部网站时,路由器会"偷偷换掉"数据包中的源 IP,把它替换成自己的 WAN 口 IP。
然后当服务器返回响应时,路由器再根据 NAT 表(记录了这次通信的映射关系)把包还原回对应的内网主机。
这一套机制像极了一个邮局:
所有信件都写着同一个外部地址寄出(路由器的公网 IP),但邮局内部会贴上一个小标签(端口号或转换表项),确保信件送到正确的房间。
NAT 的出现不仅极大缓解了 IPv4 地址的枯竭问题,还意外地增强了内网安全------外部主机无法直接访问你家电脑,除非你主动建立连接。
6. 部署公网服务:必须"露面"
如果你希望自己的服务器能被公网访问,比如自己写了一个聊天程序、Web 站点或游戏服务器,那么就必须部署在一台具有公网 IP 的主机上。
这类机器一般放在云厂商的数据中心,比如 阿里云、腾讯云、AWS 。
它们拥有稳定的公网 IP,并允许外部访问指定端口。
你在自己家电脑上启动的服务器程序,即使能在内网中正常通信,也很可能无法被外网访问------因为 NAT 把你"藏"了起来。
除非你在路由器上配置端口映射(Port Forwarding),否则外部请求无法穿透 NAT,永远打不进来。
- 一个路由器可以配置两个 IP 地址, 一个是 WAN 口 IP, 一个是 LAN 口 IP(子网IP)
- 路由器 LAN 口连接的主机, 都从属于当前这个路由器的子网中
- 不同的路由器, 子网 IP 其实都是一样的(通常都是 192.168.1.1). 子网内的主机IP 地址不能重复. 但是子网之间的 IP 地址就可以重复了
- 每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN 口 IP 就是一个公网 IP 了
- 子网内的主机需要和外网进行通信时, 路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP), 这样逐级替换, 最终数据包中的 IP 地址成为一个公网 IP.这种技术称为 NAT(Network Address Translation,网络地址转换)
- 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网 IP 的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买。
从运营商划分 IP、到家庭路由器的双口设计,再到 NAT 转换机制,整个 IPv4 网络的设计像是一座层层嵌套的城市。
每一层网络都有自己的"居民"和"边界", 而 NAT 就是那道"城市关口",既保证了秩序,又让有限的资源被最大化利用。
从内网到公网的过程介绍
当你家电脑访问一个公网网站时,比如你在浏览器里输入 www.baidu.com
,
看似只是一个简单的点击,其实背后经历了一场复杂又优雅的"地址接力"。
每一层路由器都像接力赛的中转站,而你的 IP 地址,就在这一站一站的传递与替换中,逐渐走出了局域网,走向了互联网。
1. 第一棒:内网发起请求
假设你的电脑在家里的 Wi-Fi 下,分配到了这样一个私有地址:
电脑IP:192.168.1.101
子网掩码:255.255.255.0
网关(路由器LAN口IP):192.168.1.1
当你访问百度时,浏览器先会通过 DNS 解析得到百度服务器的公网 IP(这个DNS我们后面有空会拓展讲,目前你就只需要知道我们是可以得到一个百度服务的公网IP的),比如:
www.baidu.com → 110.242.68.3
于是浏览器将这一目标地址交给操作系统的网络栈。
网络层打包 IP 报文,写入源 IP(192.168.1.101
)和目标 IP(110.242.68.3
),再交给链路层封装成以太帧。
但接下来出现了第一个问题:
电脑怎么知道这个目的 IP 在不在自己的局域网里?
操作系统会做一次"与子网掩码的按位与运算",判断目标地址与自己是否属于同一网段。
显然,百度的 IP(110 开头)与我们内网的 192 段毫无关系,于是操作系统得出结论:
"目标不在本地网段,需要通过默认网关转发。"
于是这一帧被发给 路由器的 LAN 口(192.168.1.1)。
2. 第二棒:家庭路由器登场
路由器收到这个包,发现它的目的地是"外部网络"。
这时候,NAT(网络地址转换)机制 就开始发挥魔力了。(关于NAT机制我们后面会专门写个文章来详细讲解)
路由器手上有两张网卡:
LAN口IP:192.168.1.1(连你)
WAN口IP:100.86.5.12(连运营商)
它会在自己的 NAT 表中新建一条映射关系:
内网源IP | 内网源端口 | 替换后公网IP | 替换后端口 |
---|---|---|---|
192.168.1.101 | 43562 | 100.86.5.12 | 50123 |
然后它会"修改"你发出的 IP 报文:
- 把源 IP 从
192.168.1.101
改成100.86.5.12
- 把源端口也替换成新的值(通常是随机分配的)
- 同时在 NAT 表中记录下这一次映射
最终,路由器将这个改头换面的数据包发送给上一级网络,也就是运营商的接入层设备。
3. 第三棒:运营商路由器继续转发
在运营商的世界里,用户的家庭路由器其实只是它的一个"子网节点"。
每个用户的 WAN 口 IP(如 100.86.5.12
)都属于运营商分配的一个更大的私网,比如:
100.86.0.0/16
这意味着你的"公网 IP"其实可能还不是真正的公网,而是运营商级 NAT(CGNAT,Carrier-Grade NAT)的一部分。
所以运营商路由器又会进行一次类似的地址转换:
下级节点(用户) | 用户WAN口IP | 运营商出口IP |
---|---|---|
家庭路由器A | 100.86.5.12 | 42.81.56.7 |
家庭路由器B | 100.86.9.22 | 42.81.56.7 |
可以看到,这一层的路由器又把你的源 IP 改成了它自己的公网 IP 42.81.56.7
。
此时,包中已经完全没有你的内网地址痕迹了。
从它的角度看,整个家庭网络只是一个 NAT 表中的"内部节点"。
4. 第四棒:互联网骨干路由转发
当数据包走到这一步,它的源 IP 已经变成了真正的公网 IP(比如 42.81.56.7
)。
此时,它会被一级、二级、三级骨干路由根据目标地址(百度服务器的 IP)进行多次转发。
这一步中,IP 报文的内容基本不再被修改,主要依靠路由表查找下一跳(Next Hop)进行转发。
当 TTL(生存时间)减到 0 时,若还没到目标,则丢弃并返回 ICMP 超时报文。
每次向上进行信息的转发,都是从内网向更上级转发,所以源IP一直会被替换。
所以大家现在就知道为什么NAT技术可以缓解IP地址不足的问题了吧?
因为它单独切分了一部分IP,只用它来做内网,这样IP地址就可以被重复利用了
5. 第五棒:目标服务器接收
最终,百度的服务器收到了这个包。
在服务器看来,发起请求的客户端是:
源IP:42.81.56.7
源端口:50123
它根本不知道你家电脑的 192.168.1.101
。
于是它将响应报文返回给 42.81.56.7
。
6. 第六棒:地址逆变换的回程
当响应返回到运营商出口路由器时,NAT 表开始反向匹配:
- 找到与
(42.81.56.7, 50123)
对应的内部节点(100.86.5.12, 50123)
- 替换目标 IP 和端口
- 将数据包发回家庭路由器
家庭路由器又会执行一次逆变换:
- 找到 NAT 表项
(100.86.5.12, 50123)
→(192.168.1.101, 43562)
- 把目标 IP 改回你的内网 IP
- 将数据包发回你的电脑
最终,你的浏览器收到了百度首页的数据------看似直连,其实是经过两层 NAT 转换、数十次路由转发的结果。
五、路由
路由就是为数据包从源地址到目的地址选择最佳路径,并确保数据包能够正确地在复杂的网络环境中传输。
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程。我们可以以唐僧西天取经的例子来帮助理解
1. 唐僧问路:什么是一跳(Hop)
网络通信的过程,其实就是一场不断问路的旅程。
在数据链路层里,从一个设备到另一个设备的传输区间,称为"一跳(Hop)"。
以太网中的一跳,就是从源 MAC 地址 到目的 MAC 地址之间的一次帧传输。
而在网络层(IP 层)中,数据包在每一跳被路由器接收、查看、再转发,
直到到达目的主机为止------这就像唐僧每到一个村庄,都要问清楚下一站的方向。
"请问去往西天的路怎么走?"
"往东三十里,再过一座桥,就有人告诉你下一步。"
每一个路由器,就是这样一个"路口",负责决定下一步往哪走。
2. 路由表:每个节点的"地图"
要想回答"往哪走",必须有一张地图。
这张地图,就是路由表(Routing Table)。
操作系统中的每个网络节点,无论是主机还是路由器,都维护着一张自己的路由表。
这张表告诉它:
对于某个目标网络(Destination),我应该从哪个接口(Iface)发出去,
如果要经过中间人(下一跳 Gateway),那又是谁?
我们可以使用命令行来查看路由表,例如:
route -n
常见输出如下:
Destination | Genmask | Gateway | Flags | Iface |
---|---|---|---|---|
192.168.10.0 | 255.255.255.0 | 0.0.0.0 | U | eth0 |
192.168.56.0 | 255.255.255.0 | 0.0.0.0 | U | eth1 |
0.0.0.0 | 0.0.0.0 | 192.168.10.1 | UG | eth0 |
在这张表中:
- Destination 表示目标网络地址;
- Genmask 是对应的子网掩码;
- Gateway 是下一跳地址;
- Iface 是出口接口;
- Flags 中的
U
表示该条路由可用;G
表示需要经过网关(即不是直连的网络)。
如果目的 IP 能命中前面的某条路由,就直接按那条规则转发;
如果都没命中,则使用最后一行的 默认路由(Default Route)。
3. 举例:唐僧第一次问路(直连转发)
假设一台主机配置如下:
eth0:192.168.10.2/24
eth1:192.168.56.2/24
默认网关:192.168.10.1
路由表如前。
现在,这台主机要发送一个数据包,目的 IP 是 192.168.56.3
。
第一步,它会依次与路由表进行匹配:
- 先拿目的地址与第一行子网掩码做按位与运算:
192.168.56.3 & 255.255.255.0 = 192.168.56.0
,
与第一行的目的网络192.168.10.0
不符; - 再与第二行掩码比对:
得到的网络号192.168.56.0
与第二行匹配成功!
于是系统决定:
"这条路我认识,就从 eth1 接口走。"
因为 192.168.56.0/24
网络与本机的 eth1
直接相连,
因此这条消息可以直接发到目标主机,无需经过任何路由器。
这就像唐僧问村民:"前面就是宝象国吗?"
村民说:"对啊,就在我们村的后面。"
于是他直接走过去,不需要再问第二次。
4. 举例:唐僧第二次问路(经路由器转发,也是默认路由)
由于浏览器要尽可能的帮助我们进行路由,所以它会设置一个默认路由,意思就是只要我不知道的,一律转发给它(我们期望它会知道)
现在假设要访问的目标 IP 是 202.10.1.2
。
这一次,主机依次检查所有路由条目:
- 与第一行网络号不匹配;
- 与第二行也不匹配;
- 最后一行是默认路由(
0.0.0.0
),命中!
于是主机知道:
"这条路我不熟,但我知道可以先去 192.168.10.1 那里问问。"
于是它把数据包从 eth0
接口发出,
目标 MAC 地址是网关(192.168.10.1)的 MAC 地址。
网关接收到后,会再查看自己的路由表,决定下一跳发往哪里。
如此反复,一跳一跳地接力,直到数据包抵达最终目的地。
这就像唐僧走到分岔口,问路人:"去往天竺的路怎么走?"
路人说:"你先到前面镇子,那里有高人知道下一步的方向。"
于是唐僧再问下一站的人,最终一路西行到灵山。
在命令行里它的形式是:
Destination: 0.0.0.0
Genmask: 0.0.0.0
Gateway: 192.168.10.1
Iface: eth0
意思是:
只要没有命中其他网段,就把包交给 192.168.10.1(路由器)去处理。
而这台路由器再根据自己的路由表判断下一步往哪走。
每一级路由器都可能再有自己的"默认路由",
最终通过层层接力,数据包被送达目标。
IP 的路由机制从来不是"全知全能"的。
没有任何一台机器知道全网所有路径。
每个节点只知道自己负责的那一段路 ,
而整条通信链路,就是由这些局部知识拼起来的全局路径。
这就是网络层最迷人的地方------
一个全球规模的系统,却靠局部规则实现了全局有序。
每一个节点都像取经路上的人,只需回答一句话:"往前走,遇到岔路再问。"
六、分片与重组

我们IP协议头中还有这几个字段没有进行解释,16位标识,3位标志,13位片偏移,是IP 数据报首部(IP Header)中用于"分片与重组"的三个字段,它们共同决定了一个被分片的 IP 包该如何在目标主机中重组。
分片的原因
在 IP 层,每种网络链路都有自己的最大传输单元(MTU, Maximum Transmission Unit)。
- 以太网常见的 MTU 是 1500 字节。
- 如果一个 IP 数据报超过 MTU,就必须被分片(Fragment)后再发送。
分片工作由发送端或中间路由器完成,接收端再根据首部中的信息重新拼回原始数据报。
这个1500字节限制是谁规定的呢?
答案是数据链路层。数据链路层规定单次发送的数据帧有效载荷长度不能超过1500字节。
想理解网络协议栈,其实可以把它想象成一个快递运输系统 。
从用户寄出包裹,到收件人签收,中间要经过一系列分工明确的环节:
打包、贴单、装车、转运、分发......
每一层协议,都扮演了类似的角色。
传输层:合同与信件封装
传输层(TCP / UDP)就像是你和快递公司签订的合同。
-
你决定要寄什么、寄给谁;
-
是"有保证送达的顺丰(TCP) ",还是"不保证送达的平邮(UDP)";
-
TCP 会写清楚每个包的编号、确认签收、丢了要重发;
-
UDP 则是直接发,不问结果。
所以:
传输层关心的是"通信的可靠性和完整性"。
它规定了怎么发、发多大、丢了咋办、怎么确认。
网络层:快递站与路线规划
网络层(IP)就像是快递公司的分拨中心和路由系统 。
它不关心你包裹里是什么,只关心:
-
包裹该发往哪个城市;
-
哪条线路最合适;
-
要不要转车、转站。
当包裹太大、超出了货车限重时,网络层的工作人员会:
把包裹拆成几箱(分片),每箱都打上相同的编号(16位标识),标注好顺序(13位偏移),再分别装车。
到了收件方分拨中心,再根据编号重新拼起来。
所以:
网络层关心的是"路径与寻址"。
它是整个快递系统的"调度中枢"。
数据链路层:货车与路上的那一跳
数据链路层就像是快递公司的货车司机与道路运输规则 。
每次从一个站点发车到下一个站点,就是"一跳(Hop)"。
货车有自己的规则:
-
每辆车有最大载重(MTU);
-
一次最多装 1500 字节的货物;
-
超重?那就分箱(分片);
-
每一趟车都有起点 MAC 地址和终点 MAC 地址;
-
到站后,交接给下一个司机继续送。
所以:
数据链路层负责"点到点"的物理传输 ,
它才是那个真正"跑在路上的人"。
分片是网络层的被迫之举
在网络传输的世界里,"超重" 就意味着"要拆箱"。
当网络层准备发出一个数据包时,它会先看一眼底层链路的"载重限制"(MTU)。
如果发现这个包太大,比如超过了 1500 字节,
那它没得选------只能进行分片(Fragmentation)。
关于分片,我们需要注意的是:
这个分片的工作,完全由网络层负责 。
传输层(TCP、UDP)只负责把"数据"交给网络层发送,
至于怎么拆、拆成几段、怎么贴标签,传输层一概不管。
同理,组装的工作也只能由接收方的网络层 来完成。
它必须等所有分片都到齐,才能拼成原始的完整数据报。
就像快递站的员工要把同一个订单的几个包裹拼起来,
每个箱子上都有相同的16位标识(Identification) ,
每个箱子上还写着它在整单里的顺序(13位片偏移)。
只有所有包裹都到齐,订单才能"签收成功"。
听起来挺方便,但分片其实代价不小。
假设我们有一份 10000 字节 的数据要传输,
而链路层的 MTU 是 1500 字节,那么这个包就要被拆成好几片。
然而,问题来了:
-
每个分片都要单独传输;
-
每个分片都有可能在中途丢失;
-
只要有一个分片丢了,整个数据报就无法重组。
这意味着,原本只要重传一次的大包,现在可能因为任意一个分片丢失,就要整包重发。
网络拥塞、延迟、带宽浪费,都随之上升。
所以我们说:
分片不能成为网络发送的主流方式。
它只是一个"兜底机制",让网络在不得不拆的时候还能工作。
真正优雅的方案是:尽量避免分片的发生。
要避免分片,最好的办法就是------别让网络层收到太大的包。
这个任务,就落在了传输层身上。
在 TCP 协议中,我们学过一个非常重要的概念:
滑动窗口(Sliding Window)
滑动窗口不仅仅是控制"发送速度"的机制,
它还会根据链路的 MTU 动态调整每次发送的报文段大小(MSS,Maximum Segment Size),
以确保 TCP 不会一次性塞进一个"太胖的包",从而触发分片。
可以说:
TCP 的滑动窗口是主动调节者,而 IP 的分片是被动补救者。
前者是理性控制,后者是无奈之举。
分片的具体过程
那么如果我们必须要进行分片了呢?
IP 报文头中有三个关键字段专门用于分片与重组:
字段名 | 长度 | 作用 |
---|---|---|
Identification(标识) | 16 位 | 标识同一个报文的所有分片。重组时通过它判断哪些分片属于同一份数据。 |
Flags(标志位) | 3 位 | 控制分片行为,例如是否允许分片、是否还有更多分片。 |
Fragment Offset(片偏移) | 13 位 | 表示该分片在原始报文中的偏移位置,用于正确还原顺序。 |
16 位标识(Identification)
当主机向外发送一个 IP 报文时,操作系统会为它生成一个 唯一的标识号 ID 。
如果该报文需要被分片,那么:
-
每个分片的 ID 相同;
-
目标主机在接收时,会根据 ID 判断哪些片属于同一个整体;
-
不同的报文,即使来自同一主机,也有不同的 ID 值。
类比:
想象你寄了一个大包裹(ID=2025),因为太大被拆成了 5 个小包裹。
每个包裹上都写着"同一批货 2025",收件人拿到后就知道它们该拼在一起。
3 位标志(Flags)
3 位标志用于控制分片行为:
位次 | 名称 | 作用 |
---|---|---|
bit 0 | 保留位 | 一般固定为 0(为将来扩展预留)。 |
bit 1 | DF(Don't Fragment) | 若为 1,表示"禁止分片"。若报文长度超出 MTU,将被直接丢弃,并返回 ICMP Fragmentation Needed 错误。 |
bit 2 | MF(More Fragment) | 若为 1,表示"后面还有分片";若为 0,表示"这是最后一个分片"。 |
举例:
-
如果一个报文只分成一个片(即没分片),则
DF=0, MF=0
-
如果有多个分片:
-
第1、2、3个片:
DF=0, MF=1
-
最后一个片:
DF=0, MF=0
-
13 位片偏移(Fragment Offset)
该字段标识当前分片相对于原始报文起点的偏移量,单位为 8 字节 。
这意味着:
-
偏移量 × 8 = 实际偏移的字节数;
-
除最后一个分片外,所有分片长度都必须是 8 的倍数;
-
否则拼接后就会出现"缝隙"或"重叠"。
举个例子:
假设原始 IP 数据报有 4000 字节 (去掉首部的净载荷部分),而链路层 MTU 为 1500 字节 ,
则每个分片最多携带 1480
字节的 IP 负载(减去 20 字节的 IP 头)。
分片序号 | 偏移量 | 负载大小 | MF |
---|---|---|---|
1 | 0 | 1480 | 1 |
2 | 1480/8 = 185 | 1480 | 1 |
3 | 2960/8 = 370 | 1040 | 0 |
目标主机接收后,根据:
-
ID 一致
-
偏移量 0、185、370
-
最后一个 MF=0
即可正确拼接成完整的 4000 字节报文。
需要注意的是,我们分片后的每一个新报文,都会带着20字节的报头信息。
通过标志位,我们可以很明显的知道谁是最后一个报文,通过片偏移,我们可以知道谁是第一个报文(片便宜为0),随后要做的就是按偏移顺序组装起来就行
很多人第一次学 IP 分片都会混淆,我们的13位片偏移只有13位,但是它的实际控制范围远超 2¹³。
Fragment Offset 是一个 以 8 字节为单位 的偏移量。
也就是说,报文的实际偏移量 = Offset × 8
。
既然偏移量字段只有 13 位,那么:
-
最大值 = 2¹³ - 1 = 8191
-
实际偏移量(单位:字节)= 8191 × 8 = 65528 字节
也就是说,一个 IP 报文的总载荷最多可达约 65535 字节(含首部) 。
这正好和 IPv4 报文的"总长度字段(16 位)"对应起来。
IPv4 头中的 Total Length 是 16 位,单位是字节,用来表示:
整个 IP 报文(首部 + 数据)的总长度 ≤ 65535 字节。
也就是说,即使不分片,一个 IP 报文的上限也是 65535 字节。
当分片时,每个分片的 offset 必须确保不超过这个范围。
结语
在整个计算机网络体系中,IP 协议就像一个不知疲倦的邮差 。
它不保证信件的安全送达,不关心信件的内容,也不负责追踪丢失的包裹。
它只负责一件事------找到一条通往目标的路,并把包裹交给下一个节点 。
这就是它的使命,也是它的极致之处。
从最初的源主机,到中间一跳又一跳的路由器,再到目标主机的网络层,
每一个 IP 数据报都在执行着一场看似平凡却极其精密的旅行。
在这个旅程里,有丢包的风险、有分片的无奈,也有 NAT 替换地址的智慧。
每一次跳转,都像是唐僧西行路上的一次问路;
每一次路由决策,都是在混沌的网络世界中寻找秩序与方向。
我们常说,TCP 让通信可靠,IP 让通信可达 。
没有 IP,就没有方向;没有路由表,就没有选择。
正是 IP 在默默承担着最底层的"转发之责",
才让我们今天可以轻松地打开网页、传输数据、远程登录另一端的服务器。
而当我们在命令行里敲下一行 ping
,
那一串跳跃的延迟数字,其实正是 IP 在无声奔跑的足迹。
所以,理解 IP,不只是理解一个协议的字段与算法,
更是在理解 互联网秩序的根 ------
一个把混乱的世界,用分层、分片、分发的方式,组织得井井有条的伟大体系。