UNP Chapter 26 - 数据链路访问
26.1. 概述
Unix上三种最常用的数据链路访问方法
1. BSD的BSD分组过滤器BPF
2. SVR4的数据链路提供者接口DLPI
3. Linux的SOCK_PACKET接口
26.2. BPF: BSD分组过滤器
使用BPF获得分组:
虽然在数据链路嵌入一个分组捕获机制并不困难,BPF的强大威力却在于它的过滤功能。
26.3. DLPI:数据链路提供者接口
使用DLPI, pfmod和bufmod捕获分组
应用进程介入数据链路层只需打开设备(例如le0)并使用DLPI的DL_ATTACH_REQQ请求将它与DLPI附接就可以了。不过为了提高效率,一般还需压入两个流模块:pfmod(在内核中进行分组过滤)和bufmod(缓冲递送给应用进程的数据)
从原理上说,这与上一节所讲的BPF相类似:pfmod在内核中使用伪机器实现分组过滤,bufmod则通过支持捕获长度和读超时来减少系统调用次数和拷贝的数据量。
26.4. Linux:SOCK_PACKET
从数据链路获取所有帧
fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL));
获得IPv4帧
fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP));
26.5. libpcap:分组捕获函数库
libpcap是一个与实现无关的访问操作系统所提供的分组捕获机制的分组捕获函数库。
26.6. 检查UDP的校验和字段
检查名字服务器是否计算UDP校验和的应用程序
图26.4.是本程序中使用函数的汇总
图26.5.为头文件udpcksum.h,它内部还包括了我们自定义的基本头文件unp.h以及一些系统头文件,它们是访问IP及UDP分组头部的结构定义所必须的。