6858 字
34 分钟
IP 层概论
2026-06-03

IP 协议全解:地址分类、子网划分与协议栈关联技术#

IP(Internet Protocol) 位于 TCP/IP 参考模型的第三层(网络层),职责是主机与主机之间的通信。它与数据链路层的 MAC 地址形成分工:

层次地址作用传输过程中是否变化
网络层IP 地址全局寻址,跨网段通信不变(无 NAT 时)
数据链路层MAC 地址相邻设备通信逐跳更新

在前序的 [Socket] 文章中,struct sockaddr_in 中存放着 IPv4地址(struct in_addr sin_addr)与端口号(in_port_t sin_port)。IP 是整个 Socket 通信的寻址基础,本文将系统梳理 IP 协议的底层机制。


一、IP基础知识 (可跳过)#

1. IPv4 地址格式#

IPv4 地址由 32位无符号整数表示,为了好记,我们把它切成 4 组 8 位,用十进制加点分开,即点分十进制记法:

192 . 168 . 1 . 100
11000000 10101000 00000001 01100100

理论上,32 位地址空间可标识约 43 亿台设备(2324.3×1092^{32} \approx 4.3 \times 10^9),当初看来完全够用。

2. IP地址的分类:一个过时的“分类”#

IPv4 地址按首部若干位进行分类,分为 A、B、C、D、E 五类:

首部标识位 → 决定类别
0xxxxxxx A类:0.0.0.0 ~ 127.255.255.255
10xxxxxx B类:128.0.0.0 ~ 191.255.255.255
110xxxxx C类:192.0.0.0 ~ 223.255.255.255
1110xxxx D类:224.0.0.0 ~ 239.255.255.255 (组播)
1111xxxx E类:240.0.0.0 ~ 255.255.255.255 (预留)

2.1 A / B / C 类:单播地址#

每个单播地址由两部分组成:网络号(Net ID) + 主机号(Host ID)

类别网络号位数主机号位数最大主机数适用规模
A 类8 位24 位22422^{24} - 2 = 16,777,214大型网络
B 类16 位16 位21622^{16} - 2 = 65,534中型网络
C 类24 位8 位2822^{8} - 2 = 254小型网络

注意:A 类的 8 位网络号中,首位固定为 0(用于标识类别),实际可变的网络号只有 7 位,因此 A 类可用网络数为 272=1262^7 - 2 = 126(排除全 0 的 0.x.x.x127.x.x.x 保留段),对应 1.0.0.0126.0.0.0。类似地,B 类首两位固定为 10,C 类首三位固定为 110为什么主机数要减 2?

  • 主机号全为 0:该网段的网络地址,代表这个网络本身,不分配给设备(如 192.168.1.0)
  • 主机号全为 1:该网段的广播地址,发往该地址的报文会被网段内所有主机接收(如 192.168.1.255)

2.2 D 类:组播地址#

D 类地址(224.0.0.0 ~ 239.255.255.255)用于一对多通信,不划分网络号和主机号。细分如下:

范围用途
224.0.0.0 ~ 224.0.0.255链路本地组播,路由器不转发
224.0.1.0 ~ 238.255.255.255可路由的用户组播地址
239.0.0.0 ~ 239.255.255.255本地管理组播地址

2.3 分类地址的缺陷#

分类寻址的主要问题在于地址空间划分过于粗糙:

  • C 类上限只有 254 台,稍大一点的内网就不够用
  • B 类上限达 65,534 台,绝大多数企业用不完,造成大量地址浪费
  • 无法在地址层面区分网络层级(如部门、子网) 这促使了 CIDR(无分类域间路由) 的提出。
  • Q: 为什么要把IP地址分成”网络号”和”主机号”两部分?为什么不直接用 32 位地址划分成任意大小的网络?
  • A: 实现层次化寻址:便于路由器进行转发决策。网络号标识了设备所属的网络,主机号标识了网络内的具体设备。这样,路由器只需根据目标 IP 的网络号进行转发,而不需要维护整个地址空间的路由信息。如果直接用 32 位地址划分成任意大小的网络,路由器将面临庞大的路由表,难以高效转发数据包,并容易崩溃。

3. CIDR 与 子网掩码:告别死板的类划分#

3.1 CIDR 表示法#

A、B、C 类划分太浪费了,后来被更灵活的 CIDR(无类域间路由)取代。 CIDR(Classless Inter-Domain Routing)彻底废弃了固定位数的网络号划分,改为用 /x 后缀明确标注网络号位数:

10.100.122.2/24
└──────────┘└┘
IP 地址 前 24 位为网络号,后 8 位为主机号

这样,任意连续位数都可以作为网络号,地址分配更灵活。

3.2 子网掩码#

子网掩码是 CIDR 的另一种等价表示方式:网络号对应位置为 1,主机号对应位置为 0。

/24 对应子网掩码:255.255.255.0
11111111.11111111.11111111.00000000

4. 子网划分#

子网划分是从主机号中”借用”若干位作为子网号,将一个大网络切分为多个小网络。

4.1 子网掩码的作用#

子网掩码 (Subnet Mask): IP & 子网掩码 提取 得到网络号。

IP 地址: 192.168.1.100 = 11000000.10101000.00000001.01100100
子网掩码: 255.255.255.0 = 11111111.11111111.11111111.00000000
AND
网络号: 192.168.1.0 = 11000000.10101000.00000001.00000000

默认子网掩码

地址类别默认子网掩码CIDR 表示
A 类255.0.0.0/8
B 类255.255.0.0/16
C 类255.255.255.0/24

4.2 子网划分示例#

对 C 类地址 192.168.1.0/24 借用 2 位主机号作为子网号(子网掩码变为 /26):

原始结构:[ 网络号 24位 ][ 主机号 8位 ]
划分后: [ 网络号 24位 ][ 子网号 2位 ][ 主机号 6位 ]

子网号 2 位,共 22=42^2 = 4 个子网,每个子网可用主机数 262=622^6 - 2 = 62

子网网络地址广播地址可用主机范围
子网 0192.168.1.0192.168.1.63.1 ~ .62
子网 1192.168.1.64192.168.1.127.65 ~ .126
子网 2192.168.1.128192.168.1.191.129 ~ .190
子网 3192.168.1.192192.168.1.255.193 ~ .254

4.3 子网划分的价值#

  • 隔离广播域:广播报文只在子网内传播,降低网络负载
  • 安全边界:不同子网之间需经过路由器通信,便于访问控制
  • 地址规划:按部门/功能划分子网,管理更清晰

5. 公有 IP 与私有 IP#

全球 IP 地址由 IANA(互联网编号分配局)统一管理,分为公有地址私有地址

类型特征地址范围(私有)
公有 IP全球唯一,可直接在互联网路由
私有 IP仅限内网使用,可重复,不在互联网路由10.0.0.0/8172.16.0.0/12192.168.0.0/16
私有地址解决了 IPv4 地址耗尽问题,配合 NAT 技术让内网设备共享一个公网 IP 对外通信。

二、数据平面控制平面#

网络层的核心功能可以按职责划分为数据平面(Data Plane)和控制平面(Control Plane)两个维度,这是理解现代网络架构的基础框架。

路由表与转发表#

理解数据平面和控制平面的关系,关键在于区分两个核心数据结构: 路由表 (RIB, Routing Information Base)

  • 归属控制平面,存储在路由处理器(CPU)的内存中
  • 包含所有已知路由(直连、静态、动态协议学习到的),以及每条路由的度量值、管理距离等属性
  • 由路由协议(OSPF、BGP 等)负责写入和维护
  • 作用是路由决策:从多条可选路径中选出最优路由

转发表 (FIB, Forwarding Information Base)

  • 归属数据平面,存储在接口线卡(Line Card)的专用硬件(TCAM/SRAM)中
  • 只包含从 RIB 中选出的当前生效的最优路由,剥离了协议属性,仅保留目的前缀、下一跳、出接口等转发必需信息
  • 由控制平面将最优路由下发生成
  • 作用是高速转发查找:数据包到达时,硬件直接查询 FIB 执行最长前缀匹配

二者的关系: 控制平面在 RIB 中计算选路,将选出的最优路由安装到 FIB;数据平面只读 FIB,不关心 RIB 的内容。

数据平面(转发平面)#

数据平面又称转发平面(Forwarding Plane),负责每个数据包的实际转发动作,核心问题是”收到包之后往哪发”。 特点:

  • 本地决策:基于转发表(Forwarding Table)进行高速查找,决策在本地完成
  • 硬件级速度:在路由器中通常由 ASIC(专用集成电路) 或 P4 语言编程的交换机实现
  • 逐包处理:每个到达的 IP 包独立决策,不考虑全局拓扑

IP层,数据平面的具体行为就是转发表查找 + 出口选择 + MAC 封装 + 发送

  • 读取 IP 首部目标地址
  • 在 转发表 中执行最长前缀匹配(LPM, Longest Prefix Match)
  • 确定出口网卡和下一跳 IP
  • 通过 ARP 获取下一跳 MAC,封装以太网帧,交给网卡 DMA 发送

控制平面(路由控制)#

控制平面负责路由选择和路由计算,核心问题是”路由表是怎么来的”。 传统控制平面的两条路径:

类型机制路由来源典型协议
传统路由算法每台路由器自行运行路由协议,独立计算路由分布式RIP、OSPF、BGP
集中式 SDN 控制控制器统一计算拓扑,将转发表下发到每台路由器集中式OpenFlow、P4

传统分布式控制平面(路由表/OSPF/BGP)#

路由器之间通过路由协议交换链路状态或路径信息,各自独立计算路由,填充本地路由表。不同协议的选路逻辑有所区别:

  • IGP(OSPF、RIP 等):交换链路状态或距离向量,各自运行最短路径算法(OSPF 使用 Dijkstra,RIP 使用 Bellman-Ford),计算到达各目标网络的最短路径。
  • BGP(外部网关协议):是路径矢量协议,不运行最短路径算法;各路由器交换 AS 路径和可达性信息,基于 Local Preference、AS Path 长度、MED 等多维策略属性进行选路,服从网络策略而非单纯最短路径。
路由协议报文(OSPF LSA / RIP Response / BGP UPDATE)
IGP:各路由器独立运行最短路径算法(Dijkstra / Bellman-Ford)
BGP:各路由器依据策略属性(AS Path、Local Pref 等)执行策略选路
选出最优路由,填充本地路由表(RIB)
将最优路由下发至转发表(FIB),数据平面根据 FIB 转发
  • 缺点:每台路由器需要维护完整的路由协议栈,路由计算分散,难以全局优化。

SDN 控制平面(集中式)#

SDN(Software Defined Networking)将控制平面从路由器中分离出来,由一台SDN 控制器集中维护网络拓扑视图,计算最优路径,并通过 OpenFlow 等南向接口将转发表下发到每台设备。

SDN Controller(控制器)
├─ 维护全局拓扑(L2/L3 视图)
├─ 计算转发路径(最短路径/负载均衡/策略路由)
└─ 下发流表(Flow Table)到每台交换机/路由器
每台设备只需执行数据平面转发
  • SDN 的核心优势:控制平面与数据平面解耦,控制器拥有全局视图,可以做更精细的流量工程(Traffic Engineering),通过 SDN 修改流表(Flow Table)支持各种操作(如转发、Block、泛洪、修改字段)。

Socket 编程中 bind() 绑定的本地地址决定了套接字能接收哪些目标 IP 的入站包,但出站包的实际转发路径仍由内核根据转发表决定,路由表的内容则由控制平面(静态路由或 OSPF/BGP)填充


三、路由控制#

路由表查找#

路由器(或主机内核)根据**转发表(FIB)**决定 IP 包的下一跳(内核路由表本质上也是 FIB,控制平面已将最优路由下发至此):

  1. 读取 IP 首部的目标地址
  2. 遍历转发表,找到与目标地址网络号匹配的记录
  3. 若有多条匹配,选择最长前缀匹配(最具体的路由)
  4. 按照转发表记录将包转发给下一跳路由器

环回地址#

127.0.0.1(localhost)是环回地址,用于同一主机上的进程间网络通信。发往该地址的报文不经过网卡,直接在内核协议栈内部处理。 环回地址范围127.0.0.0/8 (127.0.0.0 ~ 127.255.255.255)

  • 通常使用 127.0.0.1
  • 整个 127.x.x.x 范围都指向本地,可用于多服务隔离
  • 127.0.0.1 给 Web 服务,127.0.0.2 给数据库服务

四、IP 分片与重组:一个过时的“补丁”#

链路层有最大传输单元(MTU)的限制,典型以太网是 1500 字节。当一个 IP 数据报超过该链路的 MTU 时,就需要分片。

分片字段#

IP 首部中三个字段控制分片:

  • 标识 (Identification):16 位,同一个原始数据报的所有分片拥有相同的标识,接收方靠它识别“哪些碎片是一起的”。
  • 标志 (Flags)
    • DF (Don’t Fragment):置 1 则禁止分片,若超过 MTU 直接丢弃并回传 ICMP 报错。
    • MF (More Fragments):为 1 表示后面还有分片,最后一个分片该位为 0。
  • 片偏移 (Fragment Offset):13 位,以 8 字节为单位,表示本分片数据部分在原数据报中的起始位置,这样乱序到达也能正确填入缓冲区。

一个分片实例#

发送 4000 字节的数据报(含 20 字节 IP 头,3980 字节数据),经过以太网(MTU=1500),需要切成 3 片。

每个分片都需要独立的 20 字节 IP 首部,因此单分片最大可承载数据 = 1500 – 20 = 1480 字节,且 1480 正好是 8 的整数倍。

分片负载长度IP总长度标识MF片偏移 (×8字节)
11480B1500B1234510 (0)
21480B1500B123451185 (1480)
31020B1040B123450370 (2960)
除最后一片外,所有分片的数据长度必须是 8 的整数倍。

目标主机重组IP分片#

  • 重组只在最终目标主机进行,中间路由器绝不重组。
  • 主机使用 <标识,源IP,目的IP,协议> 这个四元组来唯一区分一个数据报的所有碎片。收到分片时:
  1. 根据标识查找或新建重组缓冲区
  2. 依照片偏移直接将数据拷贝到缓冲区的对应位置
  3. 当 MF=0 的尾片到达,且从偏移 0 到最末尾的连续数据都已收齐(无空洞),即重组完成,移除分片头交付上层
  4. 若在一定时间内(如典型 60~120 秒)未收齐所有碎片,则丢弃整个数据报,并可能向源站发送 ICMP “分片重组超时” 报文。

致命弱点:任何一个分片丢失,整个原始数据报就会被丢弃,上层协议只能全部重传,效率极低。

路径 MTU 发现:用 DF 位探测最小 MTU#

现代网络默认尽量避免 IP 分片,这依赖 路径 MTU 发现 (PMTUD)

  • 发送端将 IP 首部的 DF 位置 1 发出探测包(通常就是业务数据)。
  • 若途中某路由器因 MTU 小于包长需要分片,但因为 DF=1 而无法分片,它会丢弃该包并向源端返回 ICMP “需要分片但 DF 已置位” 消息,并携带该链路的 MTU 值。
  • 源主机收到后记录该 MTU,后续所有发往同一目的地的数据报都不超过该尺寸。

通过不断调整,最终发现整条路径上的最小 MTU,从源头避免分片

TCP 的配合:MSS 就在做这件事#

TCP 更是通过 最大段大小 (MSS) 在传输层主动消灭 IP 分片。三次握手时,双方各自在 SYN 中通告自己的 MSS 值,实际使用取双方较小的那个。

在以太网环境下:

MSS = MTU (1500) - IP首部 (20) - TCP首部 (20) = 1460 字节

TCP 每次发送的段(包括头部)都不会超过这个大小,因此加上 IP 头后正好等于或小于 1500 字节,从而绝不需要再在 IP 层分片。

  • 为什么建议一定避开 IP 分片?
  1. 性能差:分片增加了路由器的处理开销。
  2. 可靠性烂:丢一片就意味着整个数据报作废,TCP 被迫重传整个段,放大丢包惩罚。
  3. 安全隐患:古老的分片重叠攻击(如 Teardrop)、微小碎片绕过防火墙检测,都是利用分片重组漏洞。
  4. NAT/中间设备捣乱:某些老旧或配置不当的 NAT、防火墙不能正确转发分片包,导致断流。

一句话总结: 知道 IP 怎么分片重组就够了;实际生产里,要用 PMTUD 和 MSS 彻底绕开它。


五、 路由器组成与工作原理#

路由器是网络层的核心设备。不同于交换机仅在局域网内转发数据,路由器负责在异构网络之间进行路径选择和数据转发。现代路由器通过控制平面数据平面的分离,实现了极高的吞吐性能。

5.1 路由器的体系结构#

从功能上看,路由器由两大部分组成:

  1. 控制层面:运行路由协议(OSPF、BGP 等),负责构建和维护路由表。其本质是路由器的“大脑”。
  2. 数据层面:根据控制层面生成的转发表,执行具体的比特流转发。其本质是路由器的“肌肉”。

核心组件概览: 输入端口 \rightarrow 交换结构 \rightarrow 输出端口;上方由路由处理器(CPU)统一指挥。

5.2 输入端口处理 (Input Port Processing)#

输入端口是进入路由器的“大门”,处理流程严格遵循协议栈由底向上的解封装过程:

  1. 物理层/链路层处理:完成信号接收、比特同步及以太网帧解封装。
  2. 网络层查表 (核心)
    • 查找转发表:根据目的 IP 地址查询 转发表。
    • 最长前缀匹配 (LPM):当一个 IP 匹配多个路由条目时,选择**掩码最长(网络号最具体)**的那一个。
  3. 动作处理
    • TTL 递减:将 TTL 减 1,若为 0 则丢弃并发送 ICMP 超时报文。
    • 校验和更新:由于 TTL 变了,IP 首部校验和需要重新计算。 技术亮点:TCAM (三态内容寻址存储器) 为了实现线速转发,高端路由器不使用传统的软件算法查表,而是使用 TCAM 硬件。它可以在一个时钟周期内完成匹配,实现真正的“硬件级”查找。

5.3 交换结构 (Switching Fabrics)#

交换结构决定了路由器的整体吞吐量。常见的实现方式演进如下:

交换方式技术实现性能瓶颈评价
经内存交换CPU 通过 I/O 端口直接控制,数据进出都要经过内存内存带宽限制早期技术,现多用于低端设备
经总线交换输入端口通过共享总线直接将数据传给输出端口总线竞争(一次仅能过一个包)适用于中小型设备
经互联网络交叉开关 (Crossbar) 矩阵,支持 N 对端口同时收发调度算法的复杂度高端核心路由器的标配

扩展:HOL 阻塞 (Head-of-Line Blocking) 如果两个输入端口的数据报都要去同一个输出端口,其中一个被阻塞,而它后面的数据报即使要去空闲的输出端口,也被迫留在队列中。这是影响交换效率的关键因素。

5.4 输出端口处理 (Output Port Processing)#

输出端口负责将交换结构送来的数据报排队并发送到线路上:

  1. 排队管理:当进入速率超过链路发出速率时,数据报在缓冲区排队。
  2. 分组调度:决定谁先走。
    • FIFO:先进先出。
    • Priority Queuing:高优先级(如语音流量)先走。
    • WFQ (加权公平队列):按比例分配带宽,防止小流量被大流量“饿死”。
  3. 主动队列管理 (AQM)
    • 尾丢弃 (Tail Drop):简单粗暴,但会导致 TCP 全局同步(大量 TCP 连接同时降速)。
    • RED (随机早期检测):队列达到一定阈值时,随机丢弃报文,提醒发送端减速,避免网络拥塞。

5.5 路由处理器 (Routing Processor)#

路由处理器通常是一颗通用的 CPU,其任务是执行“复杂的思考”:

  • 构建路由表 (路由表):运行 RIP、OSPF、IS-IS、BGP 等协议。
  • 计算转发路径:使用 Dijkstra 等算法计算最优路径。
  • 下发转发表:将计算结果(目的网络 \rightarrow 下一跳/接口)生成紧凑的 转发表 (转发信息库),推送到线卡(Line Cards)的本地内存中。
  • 网络管理:处理 SNMP 协议、SSH 远程登录、告警监控等。

现代高端路由器将转发功能硬件化,路由处理器只负责控制平面,不参与数据平面转发。


六、IPv6 基础#

IPv4 的 32 位地址空间(约 43 亿)已接近耗尽,IPv6 将地址扩展到 128 位

特性IPv4IPv6
地址长度32 位128 位
地址空间2324.3×1092^{32} \approx 4.3 \times 10^921282^{128},远超地球沙粒总数
首部长度可变(含校验和)固定 40 字节(无校验和)
地址配置需 DHCP支持无状态自动配置(SLAAC)
NAT常用几乎不需要
广播无(用组播替代)

IPv6 地址表示#

128 位地址分为 8 组,每组 16 位,用冒号分隔,每组以十六进制表示:

完整形式:2001:0db8:0000:0000:0000:ff00:0042:8329
省略前导零:2001:db8:0:0:0:ff00:42:8329
连续零组用 :: 代替(只能用一次):2001:db8::ff00:42:8329

IPv6 地址类型#

IPv6 没有广播地址,通信模式分三类:

类型描述
单播(Unicast)一对一,包括链路本地、唯一本地、全局单播
组播(Multicast)一对多,替代 IPv4 广播
任播(Anycast)发往最近的一个节点(用于负载均衡)

与 Socket 的关联struct sockaddr_in6 存放 IPv6 通信端点信息,sin6_addr 字段为 16 字节(128 位)的 IPv6 地址,sin6_flowinfo 支持 QoS 流标签,这是 IPv6 首部的直接映射。


七、IP 协议关联技术#

IP 层本身只负责尽力而为的转发,以下协议围绕 IP 构建了完整的网络管控能力。

ARP:IP 地址 → MAC 地址#

在同一链路上通信,已知目标 IP,需要获取对应的 MAC 地址,由 ARP(Address Resolution Protocol) 完成:

主机 A 广播:「谁是 192.168.1.1,请回复你的 MAC」
主机 B 单播回复:「我是,我的 MAC 是 AA:BB:CC:DD:EE:FF」
主机 C 等收到广播:「我不是这个MAC,我不用回复」
主机 A 缓存该映射,后续直接使用

ARP 表项有时效性,超时自动清除。如果链路上无设备持有该 IP,ARP 请求无人应答,IP 包被丢弃。

DHCP:自动分配 IP#

DHCP(Dynamic Host Configuration Protocol) 让设备接入网络时自动获取 IP 地址、子网掩码、网关、DNS 等信息,流程为 4 步广播交互(DORA 过程):

客户端 DHCP 服务器
│──── DHCP DISCOVER(广播)────────►│ 我在找 DHCP 服务器
│◄─── DHCP OFFER(广播)────────────│ 我能提供 192.168.1.100
│──── DHCP REQUEST(广播)─────────►│ 我接受这个地址
│◄─── DHCP ACK(广播)──────────────│ 确认,租期 24 小时

DHCP 报文类型

报文类型说明
DISCOVER客户端广播寻找 DHCP 服务器
OFFER服务器响应,提供 IP 地址等配置
REQUEST客户端请求使用提供的地址
ACK服务器确认,正式分配地址
NAK服务器拒绝请求
RELEASE客户端主动释放地址
RENEW客户端请求续租

获取的参数

  • IP 地址、子网掩码
  • 默认网关 (Default Gateway)
  • DNS 服务器地址
  • 租约时间 (Lease Time)

客户端使用 UDP 68 端口,服务器使用 UDP 67 端口

租约管理

  • 租约到期前 50%,客户端尝试续租
  • 若续租失败,到期前 87.5% 再次尝试
  • 若服务器返回 NAK 或无法联系,客户端须停止使用该地址

NAT:公私地址转换#

NAT(Network Address Translation) 让内网多台设备共享一个公网 IP 地址,是解决 IPv4 地址枯竭的主要手段。

NAT 类型#

类型全称转换内容特点
静态 NATStatic NAT一对一固定映射内网服务器对外提供服务
动态 NATDynamic NAT多对多,动态分配公网 IP 池轮询使用
NAPT/PATNetwork Address Port Translation多对一,端口区分最常用,家用路由器默认

NAPT 工作原理#

NAPT(Network Address Port Translation, 网络地址端口转换) 是最常见的实现,通过修改报文的源 IP + 源端口来区分内网连接:

内网设备 NAT 路由器 外部服务器
192.168.1.10:1025 → 120.229.x.x:5001 → 目标服务器:80
192.168.1.11:1025 → 120.229.x.x:5002 → 目标服务器:80

NAT 转换表示例

内网地址:端口外网地址:端口目标地址:端口协议
192.168.1.10:1025120.229.x.x:5001139.159.241.37:80TCP
192.168.1.11:1025120.229.x.x:5002139.159.241.37:80TCP

回包到达时,NAT 路由器根据目的端口查表,反向转换后转发给对应的内网设备。

NAT 的局限性#

  1. 外部无法主动连接 NAT 内部的服务
    • 解决方案:端口映射(Port Forwarding)、NAT 穿透(STUN/TURN/ICE)
  2. 连接状态依赖路由器
    • 路由器重启导致所有 TCP 连接断开
    • 转换表项有超时机制,长时间无流量会被清除
  3. 破坏端到端原则
    • IP 地址被修改,某些应用(如 IPSec、FTP、SIP)需要特殊处理
    • FTP 需要 ALG(Application Layer Gateway)辅助
  4. P2P 通信困难
    • 双方都在 NAT 后时,需要 NAT 穿透技术才能直连

ICMP:网络控制报文#

ICMP(Internet Control Message Protocol) 是 IP 的伴生协议,用于传递网络控制信息和错误通知,封装在 IP 数据报中传输。

ICMP 报文分两类:

类型用途典型场景
差错报文通知 IP 包处理错误目标不可达、TTL 超时、分片需要但不可分
查询报文网络诊断ping(Echo Request/Reply)、traceroute

ping 的工作原理

发送方发出 ICMP Echo Request(类型 8)
目标主机收到后回复 ICMP Echo Reply(类型 0)
发送方统计 RTT(往返时延)和丢包率

traceroute 的工作原理: 利用 IP 首部的 TTL(Time To Live,生存时间) 字段:每经过一个路由器 TTL 减 1,为 0 时路由器丢弃报文并回复 ICMP Time Exceeded(类型 11)。traceroute 人为设置 从 TTL=1 开始逐步递增,来故意触发每跳路由器报告的“超时”,收集他们的 ICMP 回复,从而探测整条路径。

ICMP 与 Socket 的关联:当 Socket 发出的 TCP/UDP 包到达不可达的目标时,路由器或目标主机发回 ICMP 差错报文。内核解析后,将对应的 socket 标记为错误状态,下一次 socket 操作会返回对应错误码:

  • ICMP 主机不可达 / 网络不可达 (Type 3, Code 1/0)EHOSTUNREACH / ENETUNREACH,TCP/UDP 均适用
  • ICMP 端口不可达 (Type 3, Code 3) → 仅用于 UDP;目标端口无进程监听时,目标主机返回该 ICMP,Linux 内核将其映射为 UDP socket 的 ECONNREFUSED
  • TCP 的 ECONNREFUSED → 由目标主机回复的 TCP RST 触发(目标端口未监听),与 ICMP 无关;TCP 本身的连接拒绝通过 RST 机制完成,不依赖 ICMP

IGMP:组播组管理#

IGMP(Internet Group Management Protocol) 运行于主机和最后一跳路由器之间,管理组播组的成员关系:

  • 加入:主机向路由器发送 Membership Report,路由器开始向该主机转发对应组播流量
  • 维持:路由器定期发送 General Query,主机回复 Membership Report 表示仍在组内
  • 离开:主机发送 Leave Group 报文,路由器确认无其他成员后停止转发

IGMP 仅管理最后一跳的成员关系,组播流量在路由域内的传播由 PIM(Protocol Independent Multicast) 等组播路由协议负责。

IP 层概论
https://blog.alinche.dpdns.org/posts/net/ip/
作者
Oeasy1412
发布于
2026-06-03
许可协议
CC BY-NC-SA 4.0