- 浏览: 325309 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
JQ_AK47:
...
Linux下直接发送以太包 -
winsen2009:
谢谢分享,如果能再来一个列子就更好了,刚接触看完还是不懂的用
UNPv1_r3读书笔记: SCTP编程
本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn
5. 流控算法的具体实现 5.1 PFIFO_FAST PFIFO_FAST是缺省的流控算法,网卡初始化时就是设置该算法为网卡的流控算法,算法比较简单,就 在net/sched/sch_generic.c中定义了,没在单独文件中定义。 5.1.1 操作结构定义 #define PFIFO_FAST_BANDS 3 static struct Qdisc_ops pfifo_fast_ops = { .id = "pfifo_fast", // 私有数据是3个skb数据包链表头 .priv_size = PFIFO_FAST_BANDS * sizeof(struct sk_buff_head), .enqueue = pfifo_fast_enqueue, .dequeue = pfifo_fast_dequeue, .requeue = pfifo_fast_requeue, .init = pfifo_fast_init, .reset = pfifo_fast_reset, .dump = pfifo_fast_dump, .owner = THIS_MODULE, }; 该算法中, 数据队列是3个, 流控算法就是将数据包输入特定的队列, 从特定队列中取数据包。 5.1.2 初始化 static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt) { int prio; // qdisc私有数据指针, 数据包链表头 struct sk_buff_head *list = qdisc_priv(qdisc); // 初始化3个链表头 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) skb_queue_head_init(list + prio); return 0; } 5.1.3 入队 static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc* qdisc) { // 根据数据包的优先级参数挑一个队列头准备将数据包插入该队列 struct sk_buff_head *list = prio2list(skb, qdisc); // 如果当前队列中的数据包数量小于网卡设备允许的输出队列的数量 // 则将该数据包插入该队列 if (skb_queue_len(list) < qdisc->dev->tx_queue_len) { qdisc->q.qlen++; return __qdisc_enqueue_tail(skb, qdisc, list); } // 否则的话丢弃该数据包 return qdisc_drop(skb, qdisc); } // 选队列处理 static inline struct sk_buff_head *prio2list(struct sk_buff *skb, struct Qdisc *qdisc) { // qdisc私有数据指针, 数据包链表头 struct sk_buff_head *list = qdisc_priv(qdisc); // 根据数据包的优先权值确定队列头偏移值 // skb->priority是个32位整数, 只使用最后4位 return list + prio2band[skb->priority & TC_PRIO_MAX]; } // 优先权值到队列号的变换数组, 该数组体现算法内容, 通过修改该数组可以调整算法效果 // 该数组定义中, 优先值(低4位)为1,2,3,5时使用2号队列, 优先值(低4位)为6,7时使用0号 // 队列, 其他值为1号队列 // 在普通情况下skb->priority都是0, 所有应该只使用了1号队列 // 这个数组实际是根据RFC1349中定义的TOS类型值定义的, 在该RFC中TOS就是只有4位有效 static const u8 prio2band[TC_PRIO_MAX+1] = { 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1 }; 5.1.4 出队 static struct sk_buff *pfifo_fast_dequeue(struct Qdisc* qdisc) { int prio; struct sk_buff_head *list = qdisc_priv(qdisc); // 循环3个队列 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) { // 如果队列非空, 返回队列头的那个数据包 if (!skb_queue_empty(list + prio)) { qdisc->q.qlen--; return __qdisc_dequeue_head(qdisc, list + prio); } } return NULL; } 由此可见, 0号队列有最高优先级, 2号队列优先级最低, 只有高优先级队列中的数据都发送完后才发 送低优先级队列中的数据。 5.1.5 重入队 static int pfifo_fast_requeue(struct sk_buff *skb, struct Qdisc* qdisc) { // 队列长度递增 qdisc->q.qlen++; // 使用标准重入队函数将数据插回队列链表 return __qdisc_requeue(skb, qdisc, prio2list(skb, qdisc)); } 5.1.6 复位 static void pfifo_fast_reset(struct Qdisc* qdisc) { int prio; struct sk_buff_head *list = qdisc_priv(qdisc); // 释放三个队列链表中的所有数据包 for (prio = 0; prio < PFIFO_FAST_BANDS; prio++) __qdisc_reset_queue(qdisc, list + prio); // 计数清零 qdisc->qstats.backlog = 0; qdisc->q.qlen = 0; } 5.1.7 输出 输出当前算法的内容信息, 由于PFIFO_FAST算法核心就是prio2band数组, 因此就是将该数组内容输 出到数据包供用户空间获取。 static int pfifo_fast_dump(struct Qdisc *qdisc, struct sk_buff *skb) { // TC优先权数组结构 struct tc_prio_qopt opt = { .bands = PFIFO_FAST_BANDS }; // 将当前prio2band数组内容拷贝到选项数据中 memcpy(&opt.priomap, prio2band, TC_PRIO_MAX+1); // 将结构作为路由属性复制到数据包中供返回 RTA_PUT(skb, TCA_OPTIONS, sizeof(opt), &opt); return skb->len; rtattr_failure: return -1; } ...... 待续 ...... 发表于: 2007-07-28,修改于: 2007-07-29 15:30,已浏览3052次,有评论2条 推荐 投诉 网友: burning423 时间:2007-09-21 08:53:33 IP地址:218.108.51.★ 5.1.2 初始化 static int pfifo_fast_init(struct Qdisc *qdisc, struct rtattr *opt) { int prio; // qdisc私有数据指针, 数据包链表头 struct sk_buff_head *list = qdisc_priv(qdisc); ........................................ struct sk_buff_head *list = qdisc_priv(qdisc);这语句是怎样得到qdisc的私有数据的?我看了qdisc_priv(qdisc)函数的定义,可还是不是很明白.你能否给我解释一下?谢谢了..刚开始看内核的东西.... 网友: yfydz 时间:2007-09-22 21:44:39 IP地址:123.116.100.★ 每种qdisc定义都包括基本的Qdisc结构和后面一些参数, 大小由prive_size指定, 那些参数就是该qdisc的私有数据, 获取私有数据的指针就是从Qdisc起始位置移动标准Qdisc大小就是了
发表评论
-
Linux内核中流量控制(24)
2011-01-10 16:33 2259本文档的Copyleft归yfydz所 ... -
Linux内核中流量控制(23)
2011-01-10 16:30 1566本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(22)
2011-01-10 16:29 1996本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(21)
2011-01-10 16:28 1413本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(20)
2011-01-10 16:27 1584本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(19)
2011-01-10 16:27 2035本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(18)
2011-01-10 16:26 1634Linux内核中流量控制(18) ... -
Linux内核中流量控制(17)
2011-01-10 16:25 2006本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(16)
2011-01-10 16:25 1889本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(15)
2011-01-10 16:24 2034本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(14)
2011-01-10 16:23 2016本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(13)
2011-01-10 16:22 2720本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(12)
2011-01-10 16:21 2187本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(11)
2011-01-10 16:21 3313本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(10)
2011-01-10 16:20 2054本文档的Copyleft归yfydz所 ... -
Linux内核中流量控制(9)
2011-01-10 16:19 1895本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(8)
2011-01-10 16:18 1557本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(7)
2011-01-10 16:18 2988本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(6)
2011-01-10 16:17 1549本文档的Copyleft归yfydz所有,使用GPL发布,可以 ... -
Linux内核中流量控制(5)
2011-01-10 16:16 1787本文档的Copyleft归yfydz所有,使用GPL发布,可以 ...
相关推荐
在Linux内核中,TCP和UDP模块处理连接建立、数据传输、流量控制和拥塞控制等问题。 5. **应用层**:这一层包含各种应用协议,如HTTP、FTP、SMTP等,它们直接与用户交互。Linux内核通过socket API为上层应用提供了与...
【基于Linux内核的BT流量控制的原理与实现】 Linux操作系统以其开源、可定制的特点,在系统开发领域广泛应用,尤其在网络流量控制方面具有显著优势。针对BitTorrent(BT)这种大量占用带宽的P2P协议,Linux内核提供...
4. **网络堆栈**:从硬件接口到应用层协议的整个网络传输流程,如TCP/IP协议族、套接字API、网络设备驱动程序以及流量控制策略。 5. **设备驱动**:内核如何与硬件交互,驱动程序的工作原理,包括字符设备、块设备...
6. 网络子系统的优化:讲述了如何对Linux内核网络性能进行优化,包括内核参数的调优、内核网络数据结构的优化、以及流量控制等。 7. 实用案例分析:通过具体案例分析,展示了在Linux环境下如何进行网络问题的定位、...
TCP协议利用序列号、确认应答、流量控制和拥塞控制等机制确保数据包的可靠交付。与之相对的是UDP协议,它提供了一种简单的、不可靠的、无连接的数据报服务,适用于对实时性要求高的应用。 Linux内核源码剖析- TCP/...
通过分析源码,我们可以了解到数据包的接收与发送过程,理解TCP连接的建立与断开、拥塞控制、流量控制等机制,这对于网络编程和网络故障排查非常有帮助。 此外,Linux内核还涉及中断处理、设备驱动、I/O管理等多个...
【基于Linux内核扩展模块的P2P流量控制】这篇文献主要探讨了如何在Linux操作系统中,通过内核扩展模块来实现对P2P流量的有效控制。P2P(Peer-to-Peer)技术的兴起改变了互联网的中心化结构,使得资源分享更为便捷,...
基于Linux内核扩展模块的P2P流量控制
基于LQL库的流量控制方法可以直接在Linux内核的框架下实现,而不需要使用传统方法中的TC命令解析、netlink传输和内核空间执行的三层结构。这可以提高流量控制的效率和可靠性,同时也可以减少流量控制的延迟和资源...
书中的内容涵盖了从内核基础到高级技术的方方面面,为那些希望提升Linux内核理解和开发能力的读者提供了宝贵的资源。在本文中,我们将探讨几个关键的知识点,包括Linux内核的基本结构、进程管理、内存管理和设备驱动...
2.6.24版本在网络方面加强了IPv6的支持,并改进了网络流量控制算法。 6. **安全与权限管理**:Linux内核采用了用户和组的概念,通过权限系统(如chmod、chown等)来控制文件访问。此外,还有SELinux(Security-...
在介绍每个层次时,作者详细分析了内核源码,并用代码片段解释了如何实现数据包的发送和接收、路由选择、流量控制、拥塞控制等功能。对于TCP/IP协议族中的重要组成部分TCP协议,书中不仅讲解了三次握手和四次挥手的...
接着,作者深入剖析了网络设备数据结构net_device,它包含了设备的配置信息、统计信息、状态标志以及各种管理列表和流量控制字段,这些细节揭示了网络设备如何在内核中被抽象和管理。 通过以上内容,我们可以看到,...
1. **IPROUTE2**:IPROUTE2是Linux内核中用于高级路由和网络配置的工具集,它提供了比标准`route`命令更强大的功能,包括策略路由、多路径路由、隧道配置等。 2. **路由策略数据库**:这是用来定义和执行基于源地址...
2. **内存管理**:Linux内核的内存管理系统负责物理内存和虚拟内存的分配、回收以及页面交换。它采用分页技术,通过页表映射物理地址到虚拟地址,同时通过伙伴系统和slab分配器有效地管理内存块。 3. **文件系统**...
TC 工具基于 Linux 内核的网络设备驱动程序,通过对网络设备的控制,来实现流量控制。TC 的工作原理可以分为以下三个阶段: 1. 流量控制方式:TC 提供了多种流量控制方式,包括 Token Bucket Filter(TBF)、...
在Linux操作系统中,高级路由和流量控制是网络管理员和系统管理员必须掌握的关键技能。这篇文档“Linux高级路由和流量控制HOWTO中文版”由牛老师翻译,为读者提供了深入理解这些概念的宝贵资源。以下是对其中核心...
同时,还会讨论TCP的流量控制和拥塞控制机制,如滑动窗口、慢启动、快速重传和快速恢复算法等,这些都是保证网络通信质量和效率的关键。 其次,关于IP协议,书里会涉及IP地址、子网掩码、路由选择等概念,以及IP分...
TC(Linux 下流量控制工具)详细说明及应用实例 TC 是 Linux 下的一种流量控制工具,用于控制和管理网络流量。它提供了一个灵活的方式来管理网络带宽、延迟和丢包率等网络性能参数,以满足不同应用场景的需求。 TC...