快速包转发实现方式 3 中
(1)内核实现,减少拷贝(In kernel click)
(2) PF_RING BPF, 通过API实现,但有系统开销
(3)内存直接映射,直接访问NIC(缺点crash 内核 )
Netmap:
(1)内存直接映射,但处理了通用户态的 同步问题,自己多了一个
netmap_ring 的中间层
(2)用过ioctl 开启netmap, poll函数进行收发包的同步
对多线程的支持:
如果一个网卡有多个ring(高端一点的网卡 都有), 可以用多个文件描述符
分别制定ring, 所以可以多线程编程
(但是组包是个问题奥)
使用:
pcap_inject : 向网卡发包
pcap_dispatch :从网卡收包
类似实现零拷贝的还有:
(1)NetSlices
参考网址:http://fireless.cs.cornell.edu/netslice/
(2)packetshader
http://shader.kaist.edu/packetshader/
参考的网站
http://info.iet.unipi.it/~luigi/netmap/
最近增加了可做fw的功能,(IPS)