信息内容安全技术 计算机网络与信息安全技术研究中心 第二章 高性能捕包平台
2 一个典型数据报文捕获平台就是 libcap 。 libcap 是 Packet capture library 的缩写,即数据包捕获函数库。 原理 : 捕获所有到达本网卡的数据报文 然后放到 Msgbuff 中 用户态的程序从 MSG Buff 读取数据,当 MSG Buff 为空时 阻塞到这里。直到 MSG Buff 被填充数据后, 才被唤醒。 传统报文捕获平台接收报文的过程
3 2 内核接收软中断( net_rx_action )提取接收包,根据它所在的设 备和协议类型传递给各自的包处理器。包处理器用 Dev_add_pack ()注册,如果注册的设备号是零则表明它接收所有设备的包,如 果注册的包类型是( ETH_P_ALL ),则表示它接收所有类型的包。 3 各个处理器对进入自己入口的数据报文进行处理,最后传送到各自 的 MSG BUFF 中,并将阻塞到此的任务唤醒。这样,阻塞在 MSG BUFF 用户态应用程序就可以得到数据报文进行处理了。 1 网络接口收到一个以太数据帧,通过 DMA 传到网卡指向的 BUFF 中, 之后向内核发出一次硬件中断,在中断处理过程中把接收到的数据帧 存入 sk_buff 结构,然后检查硬件帧头,识别帧类型,放入接收队列, 激活接收软中断作进一步处理,最后返回继续接收数据报文。 数据报文从网卡到 MSG Buff 过程如下:
4 操作系统接收数据包的过程
5 传统报文捕获平台接收报文的性能测试 传统报文捕获平台性能测试结果
6 捕获报文过程中影响性能的因素 1 内存操作 内存操作是最耗费 CPU 的一个操作,在不同的机型上 测试读写内存速率的实验。 数据包在用户态和内核态之间的拷贝速率
7 可以看出即使在高性能服务器三上,面对每日剧增的 网络带宽,频繁的内存读写操作仍然会形成瓶颈。 然而在网卡硬中断处理到应用层得到数据包这个过程 中,有很多次对于报文捕获平台来说是没有用的内存操作, 这必然要消耗大量的 CPU 。 如何减少内核态中的无用内存操作是要解决的首要问题。
8 2 数据包在用户态和内核态之间的拷贝 普通捕包平台(如: Libpcap ) 都是通过系统调用(如: rcvmsg )来读取 MSG BUFF 中的数据包的,然而数据从 内核态向用户态拷贝是非常消耗 CPU 的。在服务器三上做 了一项有关于这种拷贝效率的测试,结果如下图。 内核态、用户态数据拷贝性能折线图
9 目前网络带宽日益增大,普通网络报文捕获平台已经 成为大规模宽带网络的入侵检测系统,宽带网络防火墙, 高性能路由器等工程的瓶颈。 因为在大流量下,每秒钟流量可以达到十几万 pps ,峰 值可以达到几十万、上百万 pps 的数据包,并且每来一个 包就产生一次中断,每次中断的现场处理和切换上下文平 均需要耗费至少三个 cpu 周期系统,这对于捕包平台来说 要花费的代价是可想而知的。 对于日益发展的高速网络,迫切需要分析出普通报文捕 获平台的性能瓶颈,研究出高速通信接口,以便有效地提 高主机服务器的响应速度。
10 高性能捕包技术的研究 提供用户程序和网卡之间零拷贝数据包收发,保证分析 程序及时处理网络包, 即零拷贝技术。 零拷贝( zero-copy )基本思想是:数据报从网络设备 到用户程序空间传递的过程中,减少数据拷贝次数,减少系 统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。 实现零拷贝用到的最主要技术是 DMA 数据传输技术和内存区 域映射技术。
11 传统的网络数据报处理,需要经过网络设备到操作系统内存空间, 系统内存空间到用户应用程序空间这两次拷贝,同时还需要经历用户 向系统发出的系统调用。 零拷贝技术则首先利用 DMA 技术将网络数据报直接传递到系统内 核预先分配的地址空间中,避免 CPU 的参与;同时,将系统内核中存 储数据报的内存区域映射到检测程序的应用程序空间(还有一种方式 是在用户空间建立一缓存,并将其映射到内核空间),检测程序直接 对这块内存进行访问,从而减少了系统内核向用户空间的内存拷贝, 同时减少了系统调用的开销,实现了真正的 “ 零拷贝 ” 。
12 Linux 网络数据包接收过程 1. 网卡接收数据包,通过 DMA 传送到主机 2. 网卡向主机发送硬件中断 3. 硬件中断程序将数据包转入接收队列 4. 软中断处理程序对数据包按协议分发 5. 用户程序通过系统调用将数据包拷贝到 用户空间 6. 用户程序进行分析处理
13 网卡 Internet 核心队列 用户缓冲区 协议栈 DMA 缓冲 PF_PACKET 队列 软中断 硬中断 应用程序 用户空间 核心空间
14 网卡 Internet 核心队列 用户缓冲区 协议栈 DMA 缓冲 PF_PACKET 队列 软中断 硬中断 应用程序 用户空间 核心空间
15 研究项目: DUM Dum- Direct User Memory 平台: linux 2.4 Intel 8254X 千兆网卡 目标:提供用户程序和网卡之间零拷贝 数据包收发,保证分析程序及时处理网 络包。
16 Dum 中的关键技术 将大容量的用户内存空间映射到核心 /DMA 空间。 修改网卡驱动接口,直接使用用户空间缓冲。 用户空间应用程序和网卡驱动的同步 。
17 零拷贝中存在的最关键问题是同步问题,一边是处于内核 空间的网卡驱动向缓存中写入网络数据包,一边是用户进程直 接对缓存中的数据包进行分析(注意,不是拷贝后再分析), 由于两者处于不同的空间,这使得同步问题变得更加复杂。
18 参考方法 : 缓存被分成多个小块,每一块存储一个网络数据包并用一数据结构表 示,在包数据结构中使用标志位来标识什么时候可以进行读或写,当网卡 驱动向包数据结构中填入真实的包数据后便标识该包为可读,当用户进程 对包数据结构中的数据分析完后标识该包为可写,这基本解决了同步问题。 然而,由于分析进程需要直接对缓存中的数据进行分析,而不是将数 据拷贝到用户空间后再进行分析,这使得读操作要慢于写操作,有可能造 成网卡驱动无缓存空间可以写,从而造成一定的丢包现象. 解决这一问题的关键在于申请多大的缓存,太小的缓存容易造成丢包, 太大的缓存则管理麻烦并且对系统性能会有比较大的影响。
19 直接使用用户进程缓冲区,减少核心到用户空 间内存拷贝 免去核心频繁内存分配和不必要的协议处理 使用大的缓冲区(可到 GB 级 ) ,减少高峰期丢 包率。 当网络到达包数超过处理能力时,减少不必要 的中断处理和 DMA 。 驱动的改进
20 性能测试 Intel E1000/PRO(intel 82543GX) 千兆 位以太网卡, cisco 3524 交换机, 2x1G PIII 服务器 64 字节小包接收: – libpcap: 13 万 / 秒 vs. dum:70 万 / 秒 64 字节小包发送: 50 万 / 秒 大于 256 字节包可实现线速收发