- 1
- 0
- 约1.54万字
- 约 19页
- 2016-12-06 发布于重庆
- 举报
linuxtcpip協议栈分析
sk_buff结构可能是linux网络代码中最重要的数据结构,它表示接收或发送数据包的包头信息。它在include/linux/skbuff.h中定义,并包含很多成员变量供网络代码中的各子系统使用。
这个结构在linux内核的发展过程中改动过很多次,或者是增加新的选项,或者是重新组织已存在的成员变量以使得成员变量的布局更加清晰。它的成员变量可以大致分为以下几类:
Layout 布局
General 通用
Feature-specific功能相关
Management functions管理函数
这个结构被不同的网络层(MAC或者其他二层链路协议,三层的IP,四层的TCP或UDP等)使用,并且其中的成员变量在结构从一层向另一层传递时改变。L4向L3传递前会添加一个L4的头部,同样,L3向L2传递前,会添加一个L3的头部。添加头部比在不同层之间拷贝数据的效率更高。由于在缓冲区的头部添加数据意味着要修改指向缓冲区的指针,这是个复杂的操作,所以内核提供了一个函数skb_reserve(在后面的章节中描述)来完成这个功能。协议栈中的每一层在往下一层传递缓冲区前,第一件事就是调用skb_reserve在缓冲区的头部给协议头预留一定的空间。
skb_reserve同样被设备驱动使用来对齐接收到包的包头。如果缓冲区向上层协议传递,旧的协议层的头部信息就没什么用了。例如,L2的头部只有在网络驱动处理L2的协议时有用,L3是不会关心它的信息的。但是,内核并没有把L2的头部从缓冲区中删除,而是把有效荷载的指针指向L3的头部,这样做,可以节省CPU时间。
1. 网络参数和内核数据结构
就像你在浏览TCP/IP规范或者配置内核时所看到的一样,网络代码提供了很多有用的功能,但是这些功能并不是必须的,比如说,防火墙,多播,还有其他一些功能。大部分的功能都需要在内核数据结构中添加自己的成员变量。因此,sk_buff里面包含了很多像#ifdef这样的预编译指令。例如,在sk_buff结构的最后,你可以找到:
struct sk_buff {
???? ... ... ...
#ifdef CONFIG_NET_SCHED
???? _ _u32???? tc_index;
#ifdef CONFIG_NET_CLS_ACT
???? _ _u32???? tc_verd;
???? _ _u32???? tc_classid;
#endif
#endif
}
它表明,tc_index只有在编译时定义了CONFIG_NET_SCHED符号才有效。这个符号可以通过选择特定的编译选项来定义(例如:Device Drivers Networking supportNetworking options QoS and/or fair queueing)。这些编译选项可以由管理员通过make config来选择,或者通过一些自动安装工具来选择。
前面的例子有两个嵌套的选项:CONFIG_NET_CLS_ACT(包分类器)只有在选择支持“QoS and/or fair queueing”时才能生效。
顺便提一下,QoS选项不能被编译成内核模块。原因就是,内核编译之后,由某个选项所控制的数据结构是不能动态变化的。一般来说,如果某个选项会修改内核数据结构(比如说,在sk_buff里面增加一个项tc_index),那么,包含这个选项的组件就不能被编译成内核模块。
你可能经常需要查找是哪个make config编译选项或者变种定义了某个#ifdef标记,以便理解内核中包含的某段代码。在2.6内核中,最快的,查找它们之间关联关系的方法, 就是查找分布在内核源代码树中的kconfig文件中是否定义了相应的符号(每个目录都有一个这样的文件)。在 2.4内核中,你需要查看Documentation/Configure.help文件。
2. Layout Fields
有些sk_buff成员变量的作用是方便查找或者是连接数据结构本身。内核可以把sk_buff组织成一个双向链表。当然,这个链表的结构要比常见的双向链表的结构复杂一点。
就像任何一个双向链表一样,sk_buff中有两个指针next和prev,其中,next指向下一个节点,而 prev指向上一个节点。但是,这个链表还有另一个需求:每个sk_buff结构都必须能够很快找到链表头节点。为了满足这个需求,在第一个节点前面会插入另一个结构sk_buff_head,这是一个辅助节点,它的定义如下:
struct sk_buff_head {
?? /* These two members must be first. */??? struct sk_buff???? * next;???
??? stru
您可能关注的文档
- LED培訓资料.doc
- LDZX-30KBS高壓灭菌锅标准操作规程.doc
- LED圖像拼接处理器用户手册内容V11.doc
- LED基本知識材料.doc
- LED基礎知识-LED光源的封装(讲义).doc
- LDZX型立式壓力蒸汽灭菌器操作规程.doc
- LED培訓资料2013.doc
- LedshowTW2011圖文编辑软件用户手册.doc
- LED基礎知识2.doc
- LED基礎知识MicrosoftWord文档.doc
- 2026年预防为主,生命至上安全培训课件.pptx
- 2026年三级安全教育.pptx
- 2026年检测业务安全培训.pptx
- 2026年消防动火培训.pptx
- 2026年重大事故隐患专项排查整治行动清单.pdf
- 2026年健康义普急救.pptx
- 2025—2026学年度四川省广元市苍溪县九年级上学期期末考试历史试题(含答案).docx
- 2025—2026学年度四川省泸州市合江县马街中学校九年级上学期期末历史试题(含答案)(九上_九下第二单元).docx
- 2025—2026学年度云南省曲靖市宣威市民族中学等校联考九年级上学期期末模拟历史试题(含答案).docx
- 2025-2026学年科普版七年级下册英语Unit7 Being a Smart Shopper素养测评卷(含答案).docx
最近下载
- 银行客户经理财富管理业务操作手册.docx VIP
- 广美附中2024年数学试卷.pdf
- 非处方药目录(全集).doc
- 注册会计师-税法-基础练习题-第六章城市维护建设税法和烟叶税法-第三节教育费附加和地方教育附加.docx VIP
- 俄语视听说基础教程3全套课件.pptx
- 2025年《可爱的中国》新疆地方教材(小学版)教案范文.docx VIP
- 常州大学《数据结构与算法分析》2022-2023学年期末试卷.doc VIP
- 常州大学《数据结构》2021-2022学年期末试卷.doc VIP
- 常州大学《数据结构与算法分析》2021-2022学年期末试卷.doc VIP
- 注册会计师-税法-基础练习题-第六章城市维护建设税法和烟叶税法-第二节烟叶税法.pdf VIP
原创力文档

文档评论(0)