第八章 解复用(Demultiplexing)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
◦ 报文到达时,使用一个操作确定报文要经过的整 条协议路径
分层解复用示意图
为什么要提前解复用?

在用户空间实现协议栈:驱动程序需要确定将数 据包交给哪个应用进程 区分处理:对不同应用的包进行不同处理:
◦ 优先处理重要的包 ◦ 尽早丢弃超载应用的包 ◦ 保证某些应用的服务质量,等等

定制路径:为确定的包处理路径定制高效的处理 代码 快速分发:去除每一层上的解复用代码,以及由 逐层解复用产生的控制开销(进程或线程调用)

◦ DPF在创建代码时,将cell的参数作为立即数硬编 码到机器码中 ◦ 每个cell都有自己特殊的代码,而不是所有cell使用 同一段代码
DPF(续)

利用编译时的知识优化实时安全检查:
◦ 编译时知道任何一个cell指定的最大偏移量,因 此,只需在包处理前检查一次,保证最大偏移 量在当前包的边界内。 ◦ 绝大部分引用的对齐检查在编译时完成,编译 时无法推断的引用才在运行时检查。

CSPF:首次将解复用和包处理分离,并将应用提供 的包过滤器安全地输出到内核。 BPF:用基于寄存器的状态机模型替换了CSPF基于堆 栈的表达式树,以适应底层架构。 Pathfinder:利用推广的trie结构提取包过滤器中的公 共比较,将N个BPF过滤器合并为一个综合过滤器。



DPF:利用动态重编译技术优化了pathfinder的执行。

pathfinder结构是Trie的推广:
◦ 在每个节点上,包头域代替了要查找的字符,哈 希表代替了数组。
Pathfinder的技术细节



Pathfinder的最基本单位称为一个cell 一个cell描述了包头中的一个域(用offset、 length、mask表示)、一个比较值和一个指针 举例:
第八章 解复用
什么是解复用(demultiplexing)

解复用:
◦ 协议实体将收到的报文交付给相应的客户
分层解复用:
◦ 利用包含在报文各层协议头中的解复用域逐层进 行,例如: 以太帧头中的type域 IP头中的protocol域 TCP/UDP头中的dest port域

提前解复用(early demultiplexing):
◦ 检查IP protocol是否为TCP,cell = (9, 1 ,0xff, 6, Ptr): 9:相对于IP头部起始位置偏移9个字节处
1:读取一个字节的内容
0xff:提取整个字节作为比较关键字 6:将提取的关键字与6(TCP协议号)进行比较
Ptr:若匹配,沿指针查找下一个cell

其它优化:
◦ 利用编译时的知识,将对几个较小的相邻域的 访问合并为一次较大的内存访问。
DPF的性能提升
解复用一个包的速度是Pathfinder的1326倍(与平台有关) 添加一个包过滤器的时间是Pathfinder 的 3 倍:

◦ 在增加的插入开销中,动态代码生成占了 40%
8.5 总结
包过滤器(包分类器)
实现提前解复用的数据结构,称为包过 滤器或包分类器。 包过滤器:

◦ 以完整的包头作为输入,将包映射到一条 路径的端点 ◦ 端点代表最终处理该包的应用进程 ◦ 路径代表在包交给端点之前,需要用来处 理该包的一个协议序列
算法设计目标

安全性:
◦ 包过滤器由用户级程序提供,在内核实现, 应确保用户之间不相互影响
Line 和 pattern

将一组cell用指针链在一起,构成一个line。
若一个line中的所有cell匹配一个包,就说这 个line匹配这个包。
直观上,一个line匹配一个协议头,一个cell 匹配协议头中的一个域。 在最简单的情形中,用一个pattern =<hdrlen, line>描述希望进行的匹配,hdrlen给出协议 头的长度。

模型低效:
◦ 表达式树模型经常导致较多的操作,因为不能记 住包的解析状态。
只能解析包头中固定偏移位置的域 为了约束运行时间,没有跳转或循环结构

8.2 Berkeley Packet Filter(BPF)

专为高性能网络监视工具(如tcpdump)而 设计,解决了CSPF的所有问题:
◦ 用基于寄存器的语言替换了基于堆栈的语言,以 与RISC架构相匹配
◦ 使用能力有限的堆栈指令 ◦ 监视堆栈引用,以保证引用与堆栈范围一致 ◦ 检查包的引用,以保证引用在包长范围之内

CSPF的表达式树模型
CSPF的问题

架构不匹配:
◦ CSPF堆栈模型是为PDP-11发明的,和现代的RISC 架构很不匹配
◦ 在RISC架构上运行CSPF需模拟堆栈操作,很低效

高速度:
◦ 解复用必须实时(线速)完成
可组合性:
◦ 应能将N个独立的包过滤器组合为一个复 合的包过滤器,并获得更高的匹配速度
8.1 CMU/Stanford包过滤器(CSPF)


为在Mach OS中允许用户级协议实现而开发
应用程序提供给内核一个包过滤器,用于处理 收到的包。若某个包为应用 A 希望接收的,A的 包过滤器返回“真”。 包过滤器是一段程序,用来对描述包特征的表 达式树进行求值。 由于包过滤器是应用提供给内核的一段程序, 为保证安全性:
举例:Pathfinder的解释开销

cell C = <offset, length, mask, value>,检查数据 包 P 是否匹配 CБайду номын сангаас的最小机器代码是:
8.4 Dynamic Packet Filter(DPF)
动态包过滤器(DPF)利用动态编译技术优 化Pathfinder的执行速度 通过动态重编译为每个新加入的cell生成优化 的代码,消除解释开销:
◦ 使用一个间接操作符将指定偏移位置的域装入寄 存器,从而可以访问非固定偏移位置的域,比如 用Load[14]装入IP头中的IHL字段 ◦ 可以进行比较-跳转操作
◦ 使用一个控制流图模型(状态机)进行计算,可 减少比较操作的次数
BPF的控制流图模型
BPF内置于OS内核
BPF的调用

BPF由用户提供的一组包过滤器组成,每 个包过滤器有一个对应的缓冲区 到达的包首先被网卡驱动程序处理:
Pathfinder的设计思想

合并N个包过滤器为一个复合过滤器:
◦ 将在同一个包头域上进行的比较放在一个 节点中:
比如,将对Ethernet type的查找放在一个节点中
◦ 每个节点实现为一个哈希表,用哈希查找 代替线性查找
Pathfinder的数据结构示例
根节点对应以太帧的 type域,包含过滤器 集合中描述的所有 Ethernet type值。 根节点实现为一个哈 希表,每个哈希表项 包含一个值和一个指 针,指针指向下一个 要查找的节点。 Pathfinder的每个节点 用于匹配包头中的一 个域


举例
Pathfinder的问题

Pathfinder的软件实现达不到线速;若使用硬件 实现,不能处理分片的复杂情况。 Pathfinder的软件实现为什么很慢:

◦ 解释开销:
Pathfinder代码在一定程度上是在解释执行cell
◦ 安全检查开销:
运行时检查包头域的引用是否在包的边界内 实时检查一个包头域的引用是否字对齐

允许一次read()调用返回多个包:
◦ 为区分包的边界,BPF为每个包加上一个头 部,包括一个时间戳和包长度
BPF的扩放性

收到的每一个包必须与每一个包过滤器匹配, 处理时间为O(n):
◦ 对于典型的BPF应用没有问题:一个典型的 BPF应用可能只提供几个过滤器

将BPF应用于提前解复用,有扩放性问题: ◦ 一个繁忙的服务器中,并发的TCP连接数 可能很大,每一个TCP连接可能提供一个 包过滤器。

Pathfinder 推广了 Trie

Trie是一种树结构:
◦ 每个节点包含一个<value, pointer>数组;每个value 对应一个固定字符集中的一个取值,pointer指向 对应该值的一个subtrie。

在Trie上查找一个关键字:
◦ 将关键字划分成字符;从树根开始,用第 i 个字符 作为索引查找路径上的第 i 个节点,得到指向第 (i+1)个节点的指针。
8.3 Pathfinder
为在x-kernel中支持用户级网络而设计 设想有500个过滤器,每个过滤器具有相同的 Ethernet type =IP和 IP protocol =TCP,只是 TCP端口对不同。 如果用BPF实现:

◦ 用到来的包与每个过滤器匹配,需比较500次 Ethernet type 和 500次IP protocol。重复! ◦ 用包的端口号与500个过滤器的端口号逐个比较, 类似于通过线性查找进行精确匹配。 低效!
◦ 若BPF是活跃的,首先调用BPF:
用包头与每个过滤器匹配 对于每个匹配的过滤器,将一定数量的字节(由 过滤器指定)拷贝到对应的缓冲区中
◦ 不与任何一个过滤器匹配的包交给TCP/IP 栈处理
BPF的有用特性

先过滤再缓存:
◦ 若大多数包都不是应用想要的,可以避免 不必要的浪费(缓冲空间,拷贝时间)
相关文档
最新文档