diff --git "a/2024/03/05/\346\226\207\347\214\256\351\230\205\350\257\273-The-BSD-Packet-Filter-A-New-Architecture-for-User-level-Packet-Capture/index.html" "b/2024/03/05/\346\226\207\347\214\256\351\230\205\350\257\273-The-BSD-Packet-Filter-A-New-Architecture-for-User-level-Packet-Capture/index.html" index 97215be..e2876e0 100644 --- "a/2024/03/05/\346\226\207\347\214\256\351\230\205\350\257\273-The-BSD-Packet-Filter-A-New-Architecture-for-User-level-Packet-Capture/index.html" +++ "b/2024/03/05/\346\226\207\347\214\256\351\230\205\350\257\273-The-BSD-Packet-Filter-A-New-Architecture-for-User-level-Packet-Capture/index.html" @@ -27,7 +27,7 @@ - + @@ -388,6 +388,13 @@
论文作者:Steven Ray McCanne, Van L Jacobson
发表会议:USENIX'93
发表时间:January 1993
1992 年的这篇文章首次提出了 BPF,即 “BSD Packet Filter”。最初 Unix中的数据包过滤器是基于 stack 设计的,在 RISC CPU 中运行效率不高。BPF基于 register 设计,比原来的设计快了 10 倍,整体性能比相同环境下的 NIT快 100 倍。
本文主要介绍了 BPF 的设计思路,包括 BPF的整体架构、理论模型(CFG)、伪语言翻译器、BPF 指令集,并给出了一些 BPF过滤器的例子,最终通过测试验证了 BPF的高效性。在文章主要内容的最后,给出了一些 BPF 已有的应用,从侧面说明了BPF 设计的合理性,是真正能够运用到生产环境中的工具。
BPF 的架构设计特点:
BPF 的 2 个主要部件:
当网络数据包到达时:
BPF 相比于 NIT 性能提升的区别是 BPF 在 filter之后才进行数据包的拷贝,而 NIT 是先进行拷贝再进行过滤,因此 NIT浪费了许多 CPU 周期。
针对 BPF 和 NIT 的 packet-to-buffer 时间进行两组测试:
上面的测试结果体现了将 filter 和 tap 2个单独的模块集成到一个单元中带来的巨大性能优势。
Assuming one uses reasonable care inthe design ofthe buffering model,it will be the dominant cost of packets you accept while thepacket filter computation will be the dominant cost of packets youreject.
大部分应用拒绝的包数远远大于接受的包数,因此 filter的性能至关重要。filter 本质上是一个布尔函数,因此有 2 种表示方法:
表达式求值实现上的弊端:
a | b
,我们无需将 a
和 b
的值都计算出来。这对于网络包过滤是很关键的,因为某些子表达式需要经过多层网络栈才能求值另一方面,CSPF 处理的数据有长度限制。
尽管 CSPF 有诸多限制,但是它提出了很新颖的思路:
基于 CFG 的 BPF的伪机器(也就是虚拟机/翻译器)设计基于以下设计约束:
switch
语句译码:为了保证译码效率,采用单地址格式编码这些约束导致采用累加器型机器是最为合适的。
这三节介绍了 BPF 的指令集设计,给出了一些例子,并解释了4 * ([k] & 0xf)
这一寻址方式的设计意图。
BPF虚拟机的操作对象包括:一个累加器、一个寄存器、一个存储器、数据包和一个隐式的PC。
BPF 的指令类型:
通过比较 BPF 和 CSPF 过滤器模型的执行指令数,可以发现 BPF存在显著的性能优势。
BPF 的主要应用:tcpdump、arpwatch 等。
BPF是一个高效的、可伸缩的、可移植的网络监控模型,已经可以运行在大部分的 BSD发行版上。
]]>共计 6 篇文章
+共计 7 篇文章
2023
diff --git a/index.html b/index.html index 79b92a7..8312f45 100644 --- a/index.html +++ b/index.html @@ -261,6 +261,13 @@论文作者:Steven Ray McCanne, Van L Jacobson
发表会议:USENIX'93
发表时间:January 1993
1992 年的这篇文章首次提出了 BPF,即 “BSD Packet Filter”。最初 Unix中的数据包过滤器是基于 stack 设计的,在 RISC CPU 中运行效率不高。BPF基于 register 设计,比原来的设计快了 10 倍,整体性能比相同环境下的 NIT快 100 倍。
本文主要介绍了 BPF 的设计思路,包括 BPF的整体架构、理论模型(CFG)、伪语言翻译器、BPF 指令集,并给出了一些 BPF过滤器的例子,最终通过测试验证了 BPF的高效性。在文章主要内容的最后,给出了一些 BPF 已有的应用,从侧面说明了BPF 设计的合理性,是真正能够运用到生产环境中的工具。
BPF 的架构设计特点:
BPF 的 2 个主要部件:
当网络数据包到达时:
BPF 相比于 NIT 性能提升的区别是 BPF 在 filter之后才进行数据包的拷贝,而 NIT 是先进行拷贝再进行过滤,因此 NIT浪费了许多 CPU 周期。
针对 BPF 和 NIT 的 packet-to-buffer 时间进行两组测试:
上面的测试结果体现了将 filter 和 tap 2个单独的模块集成到一个单元中带来的巨大性能优势。
Assuming one uses reasonable care inthe design ofthe buffering model,it will be the dominant cost of packets you accept while thepacket filter computation will be the dominant cost of packets youreject.
大部分应用拒绝的包数远远大于接受的包数,因此 filter的性能至关重要。filter 本质上是一个布尔函数,因此有 2 种表示方法:
表达式求值实现上的弊端:
a | b
,我们无需将 a
和 b
的值都计算出来。这对于网络包过滤是很关键的,因为某些子表达式需要经过多层网络栈才能求值另一方面,CSPF 处理的数据有长度限制。
尽管 CSPF 有诸多限制,但是它提出了很新颖的思路:
基于 CFG 的 BPF的伪机器(也就是虚拟机/翻译器)设计基于以下设计约束:
switch
语句译码:为了保证译码效率,采用单地址格式编码这些约束导致采用累加器型机器是最为合适的。
这三节介绍了 BPF 的指令集设计,给出了一些例子,并解释了4 * ([k] & 0xf)
这一寻址方式的设计意图。
BPF虚拟机的操作对象包括:一个累加器、一个寄存器、一个存储器、数据包和一个隐式的PC。
BPF 的指令类型:
通过比较 BPF 和 CSPF 过滤器模型的执行指令数,可以发现 BPF存在显著的性能优势。
BPF 的主要应用:tcpdump、arpwatch 等。
BPF是一个高效的、可伸缩的、可移植的网络监控模型,已经可以运行在大部分的 BSD发行版上。
]]>