找回密码
 立即注册
首页 业界区 业界 解码IP协议号:网络世界的“货物运单” ...

解码IP协议号:网络世界的“货物运单”

电棘缣 5 小时前
引言:网络数据包的“身份标识”

当我们谈论网络通信时,常会提到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。以下是一些最常见的协议号:
1.png

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可以过滤特定协议号的流量。
  1. # 抓取所有IPIP隧道流量(协议号4)
  2. sudo tcpdump -i any -n "proto 4"
  3. # 抓取ICMP流量(Ping命令)
  4. sudo tcpdump -i any -n "proto 1"
复制代码
4.2 防火墙配置

在iptables中,可以基于协议号设置规则。
  1. # 允许IPIP隧道流量通过防火墙
  2. sudo iptables -A INPUT -p 4 -j ACCEPT
  3. # 阻止所有GRE隧道流量(协议号47)
  4. sudo iptables -A INPUT -p 47 -j DROP
复制代码
5.协议号 vs. 端口号

这是一个至关重要的区分:
特性协议号端口号所在层级​网络层(IP头部)传输层(TCP/UDP头部)识别目标​数据包的载荷类型(哪个协议处理?)主机内的具体进程(哪个程序接收?)类比​货物类型(文件、衣物、食品)部门/工位号(销售部、技术部)简单来说,协议号先决定“包裹”由哪个“大部门”(协议栈中的模块)接手,端口号再由这个部门决定交给哪个“具体员工”(应用程序的进程)。
6.总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册