Pf_ring (翻译)
一,研究开源的
Mmp_libpcap 没有解决数据到网卡的效率问题,
1. 网卡收到的数据被拷贝到环形缓冲区中,PF_RING 套接字依赖于环形缓冲区
1. 套接字被创建时,创建环形缓冲区, 不同的套接字创建不同的环形缓冲区.
2. 当套接字绑定网卡时,这个网卡一直在可读模式,一直到该套接字被释放
3. 当从网卡接受数据时(当然一般是通过 DMA ,直接内存访问),驱动向协议栈提交数据
(linux 通过 netif_receive_skb 和 netif_rx 函数,依赖于轮询是否启用),而 pf_ring 套
接字时,每一个包会被拷贝一份到环形队列中, 或者丢弃,如果 buffer 为满的时候,也
被丢弃
4. 用 PF_RING 套接字接受数据,默认不直接传输到上层,而是被拷贝到环形队列后,丢
弃掉,这样会增加性能,因为没有必要被上层处理,只是被环形队列处理
5. ring 缓冲区映射到用户空间通过 mmap
6. 用户应用程序向访问 ring buffer , 需要打开文件,调用 mmap() ,获得指向环形 buffer 句
柄
7. 内核拷贝数据到环形队列,并且移动写指针,用户空间操作方法相同
8. 新到的数据包把以前的数据包覆盖,如果用户空间已经读结束,内存不在分配,只是简
单覆盖
9. 缓存的长度,是完全由用户配置的,对所有的 sockets 都一样。