惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
宝玉的分享
宝玉的分享
月光博客
月光博客
B
Blog
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
N
Netflix TechBlog - Medium
博客园_首页
GbyAI
GbyAI
人人都是产品经理
人人都是产品经理
A
About on SuperTechFans
Y
Y Combinator Blog
L
LangChain Blog
有赞技术团队
有赞技术团队
D
Docker
爱范儿
爱范儿
博客园 - 司徒正美
H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net

博客园 - 人艰不拆_zmc

go2_ros2_sdk 到底是干什么的?从 Go2、官方 SDK、ROS2 一路讲到 SLAM 和 Nav2 买了宇树 Go2 以后怎么二次开发?写给第一次做机器狗项目的人 买了一块 NVIDIA Jetson,怎么在上面安装 ROS2?从 JetPack 到 ROS2 的完整入门指南 NVIDIA Jetson 到底是什么?写给第一次接触机器人和边缘 AI 的人 ROS / ROS2 到底是什么?写给第一次接触机器人开发的人 大模型到底能同时多少人用?一篇看懂并发、排队与容量估算 大模型为什么有快有慢?一篇看懂响应速度背后的关键因素 技术小白也能看懂:大模型里的量化、蒸馏到底是什么意思? Codex 使用技巧:从“会聊天”到“真正能干活” 我终于搞懂了:Codex 对话中插件和 Skill 到底怎么用 我终于搞懂了 Agent Spec:它其实就是 Agent 的“标准设计图” 我终于搞懂了 Tool:原来不只是 Function Calling 里的函数 Skill 里的 Python 脚本,到底是不是 Tool? 我终于搞懂了 Codex 的 Plugin 和 Skill:顺便把 App、MCP 一次理清 我终于搞懂了 Codex 的“应用”:App 到底是什么,怎么添加和维护? 我终于搞懂了 Tool、Function Calling 和 MCP:大模型到底怎么知道该调哪个接口? 我终于搞懂了 MCP:从 HTTP API 到 ERP MCP Server 的完整入门 我终于搞懂了 Codex 的“记忆”是怎么回事 Codex 用久了越来越慢?我的上下文管理小技巧 我终于搞懂了 Codex 里的 Thread、Turn 和 Session 从 Qwen3.8-27B 到 FP8、NVFP4、MoE:一次搞懂几个常见大模型概念 FPS 是什么意思?简单理解 60 FPS、25 FPS 和视频帧率 DeepSeek Harness 明明像 AI Coding 工具,为什么又能用来构建各种 Agent? 使用 Codex 开发项目,怎么才能节约 Token? 模型里的 32K、128K、256K 是什么意思?简单聊聊上下文限制 Codex 一次对话到底会给模型发送什么?以 Spring Boot 项目为例讲清 Context、代码读取与 Token 消耗 AI Agent 中的 Rule 是什么?以 Codex 为例,小白也能看懂 我终于搞懂了 Harness:它不是论文,也不是标准,更不是 Codex 独有 小白也能看懂:RTSP 到底是什么? Codex Token 消耗太快?使用 RTK 压缩终端输出,减少无效 Token
解码IP协议号:网络世界的“货物运单”
人艰不拆_zmc · 2025-12-16 · via 博客园 - 人艰不拆_zmc

引言:网络数据包的“身份标识”

当我们谈论网络通信时,常会提到IP地址和端口号。但在这两者之间,还有一个更为基础、至关重要的概念——IP协议号。它隐藏在每个IP数据包的头部,如同快递包裹上的“内件品名”,默默决定着数据包的最终命运。
理解IP协议号,不仅是掌握网络协议栈的基础,更是我们深入理解隧道技术(如IPIP、GRE)、防火墙策略乃至容器网络插件(如Calico、Flannel)工作原理的钥匙。今天,我们将揭开这个神秘数字的面纱,并以协议号4为例,看它如何驱动整个IPIP隧道通信。

1.什么是IP协议号?

在IP数据包的头部,有一个8位的字段,名为 Protocol(协议),这个字段的值,就是我们所说的协议号。它的取值范围是0-255,其唯一的作用是回答一个核心问题:“这个IP数据包携带的载荷(Data)应该交给哪个上层协议来处理?”

想象一个巨大的物流分拣中心:

  • IP数据包就是标准化的集装箱。
  • IP地址是集装箱上的“收货地址”和“发货地址”。
  • 协议号则是贴在集装箱上的“内件类型”标签,例如“易碎品”、“文件”、“电子产品”。

分拣工人(内核网络协议栈)根据“地址”将集装箱运到正确的城市(目标主机)后,最终需要根据“内件类型”标签,将其交给专门的处理车间(协议处理程序)。协议号就是这个过程中的关键分拣指令。

2.常见的协议号有哪些?

Linux系统维护着一份协议号映射表,通常位于/etc/protocols。以下是一些最常见的协议号:

image

3. 深度剖析:以协议号4(IPIP)为例

协议号4代表IPIP。这是一种“套娃”式的隧道协议:将一个完整的IP数据包(包括IP头)直接封装在另一个IP数据包的数据部分。让我们追踪一个数据包的旅程,看看协议号4是如何在其中扮演“总指挥”的。

场景:​ 

主机A(IP: 10.0.0.1)和主机B(IP: 10.0.0.2)之间建立了一条IPIP隧道。主机A上的容器(IP: 172.16.1.10)试图访问主机B上的容器(IP: 172.16.2.20)。

第1步:封装与贴标(在主机A)

  1. 原始数据包 [172.16.1.10 -> 172.16.2.20]根据路由规则被发送到IPIP隧道设备(如 tunl0)。
  2. IPIP隧道模块(内核驱动)开始工作:它为原始数据包加上一个新的IP头。
  3. 关键一步:在这个新IP头的 Protocol(协议)字段中,内核郑重地填上数字 4。
  4. 封装后的数据包变为:[外层IP: 10.0.0.1 -> 10.0.0.2, 协议号: 4] + [原始IP包: 172.16.1.10 -> 172.16.2.20]。

此时,协议号4就像一个“特快专递”标签,告知网络:“我肚子里装的是VIP货物(另一个IP包),请确保送达后直接交给IPIP专员处理。”

第2步:传输

中间网络的路由器只关心外层IP头的地址(10.0.0.1 -> 10.0.0.2),就像邮递员只根据大信封上的地址投递,不会拆开看里面的标签。数据包被顺利路由到主机B。

第3步:分拣与解封(在主机B)

  1. 主机B的网卡收到数据包,将其递交给内核协议栈。
  2. 内核解析外层IP头,读取到 Protocol​ 字段的值为 4。
  3. 核心动作:内核立刻查询内部的协议处理程序注册表,寻找“谁负责处理协议号4的数据包?”。
  4. 系统注册信息显示:协议号4由IPIP隧道模块处理。
  5. 内核随即调用IPIP处理程序,并将整个数据包交给它。
  6. IPIP处理程序的任务很单纯:剥离外层IP头,露出原始的 [172.16.1.10 -> 172.16.2.20]数据包。
  7. 然后,这个原始数据包被重新投入(re-inject)内核协议栈,就像刚收到一个新包一样。
  8. 内核再次进行路由判断,最终将数据包通过Docker网桥发送给目标容器 172.16.2.20。

整个过程的精妙之处在于:协议号4是指挥内核在数据包接收端进行正确解封的“开关”。没有这个标识,内核会将整个数据包(包括内部的原始IP包)当作无效载荷丢弃。

4.协议号的实际应用

4.1 网络排查

使用 tcpdump可以过滤特定协议号的流量。

# 抓取所有IPIP隧道流量(协议号4)
sudo tcpdump -i any -n "proto 4"
# 抓取ICMP流量(Ping命令)
sudo tcpdump -i any -n "proto 1"

4.2 防火墙配置

在iptables中,可以基于协议号设置规则。

# 允许IPIP隧道流量通过防火墙
sudo iptables -A INPUT -p 4 -j ACCEPT
# 阻止所有GRE隧道流量(协议号47)
sudo iptables -A INPUT -p 47 -j DROP

5.协议号 vs. 端口号

这是一个至关重要的区分:

特性协议号端口号
所在层级 网络层(IP头部) 传输层(TCP/UDP头部)
识别目标 数据包的载荷类型(哪个协议处理?) 主机内的具体进程(哪个程序接收?)
类比 货物类型(文件、衣物、食品) 部门/工位号(销售部、技术部)

简单来说,协议号先决定“包裹”由哪个“大部门”(协议栈中的模块)接手,端口号再由这个部门决定交给哪个“具体员工”(应用程序的进程)。

6.总结

IP协议号是网络协议栈中一个简单却强大的设计。它通过一个8位的数字,优雅地实现了网络层与上层协议的解耦,保证了数据包能被正确地分发给相应的处理程序。
通过深度剖析协议号4在IPIP隧道中的作用,我们不仅看到了一个隧道技术的具体实现,更深刻地理解了“隧道”的本质:依靠协议号这个标识,在接收端触发特定的解封逻辑,从而打通网络孤岛。当你未来面对Flannel的IPIP后端、Calico的IPIP模式,或是任何其他基于隧道的网络方案时,心中都能清晰地浮现出协议号这个“幕后指挥官”的身影。