BPF初探 - Android中BPF运用实例

本文深入探讨Android 7.1中BPF(Berkeley Packet Filter)的使用,特别是在DhcpClient中的实践。BPF作为一种高效的包过滤机制,允许自定义规则筛选数据链路层的网络包。在DHCP过程中,由于客户端在成功获取IP前无法接收响应,BPF被用于捕获特定特征的DHCP回复包。通过JNI填充过滤规则并绑定到packet socket,实现包过滤。完成过滤后,DhcpClient解析回复以获取IP地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要介绍在Android中对BPF的使用及其解析,参考Android 7.1源码
注:阅读本文需要一定的网络协议基础
参考文章:https://www.freebsd.org/cgi/man.cgi?query=bpf&sektion=4&manpath=FreeBSD+4.7-RELEASE

什么是BPF

  伯克利包过滤器(Berkeley Packet Filter,简称BPF),以协议无关的方式提供指向数据链路层的原始接口,网络上的所有数据包都可以通过这种机制进行访问。伯克利包过滤器以一种字符设备存在,如"/dev/bpf0""/dev/bpf1"等,这些字符设备的文件描述符都通过BIOCSETIF ioctl与特定的网络接口进行绑定,每一个网络接口都可以和多个绑定的监听者共享,因此每个文件描述符下的过滤器可以看到被过滤出的包。
  
BPF在Android中的运用
  
  使用BPF过滤报文非常高效,且规则自定义非常强大,tcpdump中就是使用了BPF进行包过滤。在Android中,很早就使用了BPF,典型的一个例子就是DhcpClient,作为dhcp过程的请求方,在发出dhcp request之后,就是通过BPF过滤对应特征的报文来确定是否dhcp成功,同时获取dhcp server分配的IP地址。

/** frameworks/base/services/net/java/android/net/dhcp/DhcpClient.java*/

// - We use a packet socket to receive, because servers send us packets bound for IP addresses
//   which we have not yet configured, and the kernel protocol stack drops these.
// - We use a UDP socket to send, so the kernel handles ARP and routing for us (DHCP servers can
//   be off-link as well as on-link).
private FileDescriptor mPacketSock;

  为什么要使用BPF来实现dhcp这一项功能?上面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值