skb->protocol字段应设置为何值?sk_buff协议字段取值疑问
sk_buff中protocol字段的取值说明
- 内核网络栈的规范里,sk_buff的
protocol字段对应skb_network_header指向的网络层协议,这和你观察到的skb_flow_dissect_flow_keys函数行为完全一致。 - 举个实际场景的例子:如果是带VLAN标签的以太网帧,当skb_network_header指向IP头部时,
protocol字段会被设为ETH_P_IP;如果skb_network_header指向VLAN头部,那protocol字段的值就是ETH_P_8021Q。 - 你提到的“最外层/最内层”协议头部对应的标识位置需要明确区分:
- 最外层的链路层封装协议(比如以太网本身),相关标识会存在网卡设备的
dev->type或者链路层头部中,并不存储在sk_buff的protocol字段。 - 最内层的传输层/应用层协议(比如TCP、UDP),则由网络层头部的对应字段来标识(比如IP头内的protocol字段),同样不是sk_buff的
protocol字段负责的范围。
- 最外层的链路层封装协议(比如以太网本身),相关标识会存在网卡设备的
- 总结一下:sk_buff的
protocol字段的核心作用就是标识当前skb_network_header所指向的那一层协议,这是内核网络栈处理流程中的约定规则。
内容的提问来源于stack exchange,提问作者Gabo
相关产品推荐
相关产品推荐

