河南省网站建设百度推广代理
在Linux内核网络子系统中,协议栈的实现依赖于两个关键注册机制:inet_add_protocol()
和 inet_register_protosw()
。它们共同构建了完整的网络通信能力,但服务于协议栈的不同层级和场景。本文将通过代码实例和架构分析,揭示二者的本质区别与协同关系。
一、问题起源:协议注册的两种路径
观察内核初始化代码(net/ipv4/af_inet.c
):
static int __init inet_init(void) {// 路径1:注册IP层协议处理器if (inet_add_protocol(&tcp_protocol, IPPROTO_TCP) < 0) goto out;// 路径2:注册套接字操作接口inet_register_protosw(inetsw_array); }
其中 inetsw_array
包含TCP、UDP等协议的定义:
static struct inet_protosw inetsw_array[] = {{ // TCP条目.type = SOCK_STREAM,.protocol = IPPROTO_TCP,.prot &#