最近了解Linux的性能优化时, 接触到了BPF(Berkeley Packet Filter)。很有意思也很强大的功能;想把学到的一些基本原理与知识记录下来, 算是一个初步的总结. 这篇文章主要从如下几个方面介绍下BPF:
- BPF的原理
- 什么是eBPF
- 如何在Linux中使用BPF
用过tcpdump
的同学应该都了解pcap
, 实际上pcap
就是基于BPF来实现网络数据包的过滤的. tcpdump
的原理如下图所示: tcpdump
将包过滤的表达式, 如查看某个网口所有udp包, 输入tcpdump -n -i eth0 udp
, 这个表达式通过PCAP库编译成伪机器字节码后, 通过系统调用发送给内核(内核中有对应的机器码解释器)解释执行, 这样只要系统有udp包, 内核都会过滤出来转发给用户进程tcpdump
: