- 1、本文档共23页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux_TCP_IP_协议栈的关键数据结构Socket_Buffer
Linux TCP/IP 协议栈的关键数据结构 Socket Buffer
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_re
serve 在缓冲区的头部给协议头预留一定的空间。
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 suppo
rtNetworking 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 组织成一个双向链表。当然,这个链表的结
您可能关注的文档
- LED散热技术报告-2013-7-27厦门.pdf
- LED欧洲新标准.pdf
- LED灯具寿命的挑战.pdf
- LED大屏幕操作使用说明.pdf
- LED驱动电源毕业论文(含完整原理图和PCB).pdf
- LEED认证与智能化设计.pdf
- LED显示屏使用与维护手册V1.0-05.pdf
- LED照明基础培训201401.pdf
- LEED认证整理20121224.pdf
- LG0407Y2009-热处理件通用技术条件.pdf
- 2023-2024学年广东省深圳市龙岗区高二(上)期末物理试卷(含答案).pdf
- 2023-2024学年贵州省贵阳市普通中学高一(下)期末物理试卷(含答案).pdf
- 21.《大自然的声音》课件(共45张PPT).pptx
- 2023年江西省吉安市吉安县小升初数学试卷(含答案).pdf
- 2024-2025学年广东省清远市九校联考高一(上)期中物理试卷(含答案).pdf
- 广东省珠海市六校联考2024-2025学年高二上学期11月期中考试语文试题.pdf
- 2024-2025学年语文六年级上册第4单元-单元素养测试(含答案).pdf
- 2024-2025学年重庆八中高三(上)月考物理试卷(10月份)(含答案).pdf
- 安徽省安庆市潜山市北片学校联考2024-2025学年七年级上学期期中生物学试题(含答案).pdf
- 贵州省部分校2024-2025学年九年级上学期期中联考数学试题(含答案).pdf
文档评论(0)