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 . 10011000000 10101000 00000001 01100100理论上,32 位地址空间可标识约 43 亿台设备(),当初看来完全够用。
2. IP地址的分类:一个过时的“分类”
IPv4 地址按首部若干位进行分类,分为 A、B、C、D、E 五类:
首部标识位 → 决定类别0xxxxxxx A类:0.0.0.0 ~ 127.255.255.25510xxxxxx B类:128.0.0.0 ~ 191.255.255.255110xxxxx C类:192.0.0.0 ~ 223.255.255.2551110xxxx 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 位 | = 16,777,214 | 大型网络 |
| B 类 | 16 位 | 16 位 | = 65,534 | 中型网络 |
| C 类 | 24 位 | 8 位 | = 254 | 小型网络 |
注意:A 类的 8 位网络号中,首位固定为 0(用于标识类别),实际可变的网络号只有 7 位,因此 A 类可用网络数为 (排除全 0 的
0.x.x.x和127.x.x.x保留段),对应1.0.0.0~126.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.011111111.11111111.11111111.000000004. 子网划分
子网划分是从主机号中”借用”若干位作为子网号,将一个大网络切分为多个小网络。
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 位,共 个子网,每个子网可用主机数 :
| 子网 | 网络地址 | 广播地址 | 可用主机范围 |
|---|---|---|---|
| 子网 0 | 192.168.1.0 | 192.168.1.63 | .1 ~ .62 |
| 子网 1 | 192.168.1.64 | 192.168.1.127 | .65 ~ .126 |
| 子网 2 | 192.168.1.128 | 192.168.1.191 | .129 ~ .190 |
| 子网 3 | 192.168.1.192 | 192.168.1.255 | .193 ~ .254 |
4.3 子网划分的价值
- 隔离广播域:广播报文只在子网内传播,降低网络负载
- 安全边界:不同子网之间需经过路由器通信,便于访问控制
- 地址规划:按部门/功能划分子网,管理更清晰
5. 公有 IP 与私有 IP
全球 IP 地址由 IANA(互联网编号分配局)统一管理,分为公有地址和私有地址:
| 类型 | 特征 | 地址范围(私有) |
|---|---|---|
| 公有 IP | 全球唯一,可直接在互联网路由 | — |
| 私有 IP | 仅限内网使用,可重复,不在互联网路由 | 10.0.0.0/8、172.16.0.0/12、192.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,控制平面已将最优路由下发至此):
- 读取 IP 首部的目标地址
- 遍历转发表,找到与目标地址网络号匹配的记录
- 若有多条匹配,选择最长前缀匹配(最具体的路由)
- 按照转发表记录将包转发给下一跳路由器
环回地址
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字节) |
|---|---|---|---|---|---|
| 1 | 1480B | 1500B | 12345 | 1 | 0 (0) |
| 2 | 1480B | 1500B | 12345 | 1 | 185 (1480) |
| 3 | 1020B | 1040B | 12345 | 0 | 370 (2960) |
| 除最后一片外,所有分片的数据长度必须是 8 的整数倍。 |
目标主机重组IP分片
- 重组只在最终目标主机进行,中间路由器绝不重组。
- 主机使用 <标识,源IP,目的IP,协议> 这个四元组来唯一区分一个数据报的所有碎片。收到分片时:
- 根据标识查找或新建重组缓冲区
- 依照片偏移直接将数据拷贝到缓冲区的对应位置
- 当 MF=0 的尾片到达,且从偏移 0 到最末尾的连续数据都已收齐(无空洞),即重组完成,移除分片头交付上层
- 若在一定时间内(如典型 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 分片?:
- 性能差:分片增加了路由器的处理开销。
- 可靠性烂:丢一片就意味着整个数据报作废,TCP 被迫重传整个段,放大丢包惩罚。
- 安全隐患:古老的分片重叠攻击(如 Teardrop)、微小碎片绕过防火墙检测,都是利用分片重组漏洞。
- NAT/中间设备捣乱:某些老旧或配置不当的 NAT、防火墙不能正确转发分片包,导致断流。
一句话总结: 知道 IP 怎么分片重组就够了;实际生产里,要用 PMTUD 和 MSS 彻底绕开它。
五、 路由器组成与工作原理
路由器是网络层的核心设备。不同于交换机仅在局域网内转发数据,路由器负责在异构网络之间进行路径选择和数据转发。现代路由器通过控制平面与数据平面的分离,实现了极高的吞吐性能。
5.1 路由器的体系结构
从功能上看,路由器由两大部分组成:
- 控制层面:运行路由协议(OSPF、BGP 等),负责构建和维护路由表。其本质是路由器的“大脑”。
- 数据层面:根据控制层面生成的转发表,执行具体的比特流转发。其本质是路由器的“肌肉”。
核心组件概览: 输入端口 交换结构 输出端口;上方由路由处理器(CPU)统一指挥。
5.2 输入端口处理 (Input Port Processing)
输入端口是进入路由器的“大门”,处理流程严格遵循协议栈由底向上的解封装过程:
- 物理层/链路层处理:完成信号接收、比特同步及以太网帧解封装。
- 网络层查表 (核心):
- 查找转发表:根据目的 IP 地址查询 转发表。
- 最长前缀匹配 (LPM):当一个 IP 匹配多个路由条目时,选择**掩码最长(网络号最具体)**的那一个。
- 动作处理:
- 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)
输出端口负责将交换结构送来的数据报排队并发送到线路上:
- 排队管理:当进入速率超过链路发出速率时,数据报在缓冲区排队。
- 分组调度:决定谁先走。
- FIFO:先进先出。
- Priority Queuing:高优先级(如语音流量)先走。
- WFQ (加权公平队列):按比例分配带宽,防止小流量被大流量“饿死”。
- 主动队列管理 (AQM):
- 尾丢弃 (Tail Drop):简单粗暴,但会导致 TCP 全局同步(大量 TCP 连接同时降速)。
- RED (随机早期检测):队列达到一定阈值时,随机丢弃报文,提醒发送端减速,避免网络拥塞。
5.5 路由处理器 (Routing Processor)
路由处理器通常是一颗通用的 CPU,其任务是执行“复杂的思考”:
- 构建路由表 (路由表):运行 RIP、OSPF、IS-IS、BGP 等协议。
- 计算转发路径:使用 Dijkstra 等算法计算最优路径。
- 下发转发表:将计算结果(目的网络 下一跳/接口)生成紧凑的 转发表 (转发信息库),推送到线卡(Line Cards)的本地内存中。
- 网络管理:处理 SNMP 协议、SSH 远程登录、告警监控等。
现代高端路由器将转发功能硬件化,路由处理器只负责控制平面,不参与数据平面转发。
六、IPv6 基础
IPv4 的 32 位地址空间(约 43 亿)已接近耗尽,IPv6 将地址扩展到 128 位:
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位 | 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:8329IPv6 地址类型
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 类型
| 类型 | 全称 | 转换内容 | 特点 |
|---|---|---|---|
| 静态 NAT | Static NAT | 一对一固定映射 | 内网服务器对外提供服务 |
| 动态 NAT | Dynamic NAT | 多对多,动态分配 | 公网 IP 池轮询使用 |
| NAPT/PAT | Network Address Port Translation | 多对一,端口区分 | 最常用,家用路由器默认 |
NAPT 工作原理
NAPT(Network Address Port Translation, 网络地址端口转换) 是最常见的实现,通过修改报文的源 IP + 源端口来区分内网连接:
内网设备 NAT 路由器 外部服务器192.168.1.10:1025 → 120.229.x.x:5001 → 目标服务器:80192.168.1.11:1025 → 120.229.x.x:5002 → 目标服务器:80NAT 转换表示例:
| 内网地址:端口 | 外网地址:端口 | 目标地址:端口 | 协议 |
|---|---|---|---|
| 192.168.1.10:1025 | 120.229.x.x:5001 | 139.159.241.37:80 | TCP |
| 192.168.1.11:1025 | 120.229.x.x:5002 | 139.159.241.37:80 | TCP |
回包到达时,NAT 路由器根据目的端口查表,反向转换后转发给对应的内网设备。
NAT 的局限性
- 外部无法主动连接 NAT 内部的服务
- 解决方案:端口映射(Port Forwarding)、NAT 穿透(STUN/TURN/ICE)
- 连接状态依赖路由器
- 路由器重启导致所有 TCP 连接断开
- 转换表项有超时机制,长时间无流量会被清除
- 破坏端到端原则
- IP 地址被修改,某些应用(如 IPSec、FTP、SIP)需要特殊处理
- FTP 需要 ALG(Application Layer Gateway)辅助
- 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) 等组播路由协议负责。