Ame*_*aki 6 packet-capture libpcap
我正在为一个非常高流量的网络编写监控程序(高清视频通过网络流传输).大多数数据包都非常大,我只想看标题(仅限IP和UDP/TCP).当然,我想避免复制整个数据的开销.libpcap是否必须给我一份整个数据包的副本?如果是,是否有符合我需求的图书馆?
小智 6
这里似乎有两个问题:
对于第一个问题:
任何使用libpcap在各种操作系统中运行的机制的代码可能至少完成了一个副本 - 从mbufs/skbuff/STREAMS缓冲区复制到机制的缓冲区.对于Linux,当没有使用tpacket机制时,skbuff 可能只是在PF_PACKETlibpcap使用的套接字的接收队列上排队.
可能有另一个副本 - 从该缓冲区到用户区的副本; 如果libpcap使用"零拷贝"机制,例如Linux tpacket机制(libpcap 1.0及以后默认使用),则不会发生第二个拷贝.如果没有使用零拷贝机制,就会发生这种情况.
但是,如果您正在使用pcap_next()或pcap_next_ex()在Linux系统上使用tpacket机制,则需要一个单独的副本,从内存映射缓冲区到私有缓冲区; 如果你使用pcap_dispatch()或不会发生pcap_loop().
对于第二个问题:
这就是"snaplen"参数pcap_open_live()和为什么pcap_set_snaplen()- 它允许您指定应该捕获不超过"snaplen"字节的数据包数据,这意味着不会复制多个字节.
请注意,此长度包括链接层标头,并且这些标头可以包含"元数据"标头,例如您可能在802.11适配器上获得的radiotap标头.此标头可能是可变长度的(例如,在802.11上,802.11标头是可变长度的,如果您获得radiotap标头,那么它们也是可变长度的).
此外,IPv4和TCP标头都可以有选项,IPv6数据包可以有扩展标头,因此IP和TCP标头的长度也可以变化.
这意味着您可能必须确定要使用的"最坏情况"快照长度; 没有办法明确地说"不要给我任何超过TCP/UDP标头的东西",你只能说"给我不超过N个字节".
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |