解码IP协议号,如何成为网络世界的货物运单?
摘要:引言:网络数据包的“身份标识” 当我们谈论网络通信时,常会提到IP地址和端口号。但在这两者之间,还有一个更为基础、至关重要的概念——IP协议号。它隐藏在每个IP数据包的头部,如同快递包裹上的“内件品名”,默默决定着数据包的最终命运。理解IP
引言:网络数据包的“身份标识”
当我们谈论网络通信时,常会提到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。以下是一些最常见的协议号:
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)
原始数据包 [172.16.1.10 -> 172.16.2.20]根据路由规则被发送到IPIP隧道设备(如 tunl0)。
IPIP隧道模块(内核驱动)开始工作:它为原始数据包加上一个新的IP头。
关键一步:在这个新IP头的 Protocol(协议)字段中,内核郑重地填上数字 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)
主机B的网卡收到数据包,将其递交给内核协议栈。
内核解析外层IP头,读取到 Protocol 字段的值为 4。
核心动作:内核立刻查询内部的协议处理程序注册表,寻找“谁负责处理协议号4的数据包?”。
系统注册信息显示:协议号4由IPIP隧道模块处理。
内核随即调用IPIP处理程序,并将整个数据包交给它。
IPIP处理程序的任务很单纯:剥离外层IP头,露出原始的 [172.16.1.10 -> 172.16.2.20]数据包。
然后,这个原始数据包被重新投入(re-inject)内核协议栈,就像刚收到一个新包一样。
内核再次进行路由判断,最终将数据包通过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中,可以基于协议号设置规则。
