UNPv1第二十六章:数据链路访问
2016-04-26 14:38
281 查看
1. 概述
目前大多数操作系统都为应用程序提供了访问数据链路层的手段,它使得应用程序拥有如下功能:监视数据链路层上的所收到的分组,这使得我们可以在普通计算机系统上通过tcpdump来检测网络,而无需使用特殊的硬件设备
作为普通应用进程而不是内核的一部分运行某些程序
Unix上三种最常用的数据链路访问方法
BSD的BSD分组过滤器BPF
SVR4的数据链路提供者接口DLPI
Linux的SOCK_PACKET接口
2. BPF: BSD分组过滤器
虽然在数据链路嵌入一个分组捕获机制并不困难,BPF的强大威力却在于它的过滤功能。为了减少开销,BPF使用以下三种技术:
(1)BPF过滤由内核完成,以减少从BPF拷贝到应用进程的数据量。
(2)每个分组只有部分数据由BPF传递给应用进程,被称为捕获长度。大多数应用进程只需要分组头部,而不需要分组数据,这同样减少了内核到用户空间的数据拷贝量。
(3)BPF缓冲递送给应用进程的数据,该缓冲只有在已满或者读超时发生时才拷贝给应用进程。超时值可由应用进程指定。
3. DLPI:数据链路提供者接口
应用进程介入数据链路层只需打开设备(例如le0)并使用DLPI的DL_ATTACH_REQQ请求将它与DLPI附接就可以了。不过为了提高效率,一般还需压入两个流模块:pfmod(在内核中进行分组过滤)和bufmod(缓冲递送给应用进程的数据)从原理上说,这与上一节所讲的BPF相类似:pfmod在内核中使用伪机器实现分组过滤,bufmod则通过支持捕获长度和读超时来减少系统调用次数和拷贝的数据量。
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));
与BPF和DLPI相比较,Linux有如下不同:
(1)Linux不提供基于核心的缓冲和分组过滤机制。它提供普通的套接口接收缓冲区,但多个帧不能缓冲在一起,一次性的由应用进程读取。这么一来从内核向应用进程拷贝大量数据的开销势必增长
(2)Linux不提供针对设备的过滤。
相关文章推荐
- CentOS安装jdk1.8 及服务器之间的拷贝
- 两天 写出简易数据库管理程序
- 以“不变应万变”,我们需要怎么做?
- androidstudio编译的时候报R.java类重复错误怎么搞
- solr源码入门1
- 构架相关
- 软件企业测试团队的组织架构
- Ubuntu16.04升级之后VirtualBox不能安装的问题
- 用户管理
- Cocos2d-x lua 屏幕适配
- u-boot.lds文件诠释
- 动态加载/热部署框架汇总
- linux虚拟内存
- 状态栏的透明效果实现
- Java超神之路
- .net session_end
- 团队作业(四)
- 2016年4月4日作业 变更管理,信息系统安全管理
- 记录未登录用户是否做过调查判断;
- 函数笔记