linux 数据链路访问,网络编程学习——数据链路访问

1 概述

目前大多数操作系统都为应用程序提供访问数据链路层的强大功能。这些功能可以提供如下能力。

能够监视由数据链路层接收的分组,使得诸如tcpdump之类的程序能够在普通计算机系统上运行,而无需使用专门的硬件设备来监视分组。如果结合使用网络接口进入混杂模式(promiscuous mode)的能力,那么应用程序甚至能够监视本地电缆上流动的所有分组,而不仅仅是以程序运行所在主机为目的地的分组。

能够作为普遍应用进程而不是内核的一部分运行某些程序。例如,RARP服务器的大多数Unix版本是普通的应用进程,他们从数据链路读入RARP请求,又往数据链路写出RARP应答(RARP请求和应答都不是IP数据报)

Unix上访问数据链路层的3个常见方法是BSD的分组过滤器BPF、SVR4的数据链路提供者接口DLPI和Linux的SOCK_PACKET接口。

2 BPF:BSD分组过滤器

在支持BPF的系统上,每个数据链路驱动程序都在发送一个分组之前或在接收一个分组之后调用BPF,如图1-1所示。

4cbcb7f367337cc28e82ea36d8d6c2ed.png

图1- 使用BPF截获分组

BPF的强大威力在于它的过滤能力。使用3个技术来降低开销。

BPF过滤在内核中进行,一以此把从BPF到应用进程的数据复制量减少到最小。

由BPF传递到应用进程的只是每个分组的一段定长部分。这个长度称为捕获长度(capture length),也称为快照长度(snapshot length,简写为snaplen)。大多数应用进程只需要分组首部而不需要分组数据。这个技术同样减少了由BPF复制到应用进程的数据量。

BPF为每个应用进程分别缓冲数据,只有当缓冲区已满或读超时(read timeout)期满时该缓冲区中的数据才复制到应用进程。

尽管我们在图1-1中只画出单个缓冲区,BPF起始为每个应用进程维护两个缓冲区,在其中一个缓冲区中的数据被复制到应用进程期间,另一个缓冲区被用于填装数据。这就是标准的双缓冲(double buffering)技术。

3 DLPI:数据链路提供者

SVR4通过数据链路提供者接口(Datalink Provider Interface,DLPI)提供数据链路访问。其访问通过发送和接收流消息(STREAMS messgae)实施。

DLPI有两种打开方式:一种方式是应用进程先打开一个统一的伪设备,再使用DLPI的DL_ATTACH_REQ往其上附接某个数据链路(即网络接口);另一种方式是应用进程直接打开某个网络接口设备(例如le0).无论以哪种方式打开DLPI,通常尚需为提高操作效率而压入2个流模块(STREAMS module):在内核中进行分组过滤的pfmod模块和为应用进程缓冲数据的bufmod模块,如图1-2所示。

862f9c26f750cf1c503571a0af375799.png

图1-2 使用DLPI、pfmod和bufmod捕获分组

4 Linux:SOCK_PACKET和PF_PACKET

Linux先后有两个从数据链路层接收分组的方法。较旧的是创建类型为SOCK_PACKET的套接字。教新的是创建协议族为PF_PACKET的套接字。例如,从数据链路接收所有帧如下创建套接字:

fd = socket( PF_PACKET, SOCK_RAW, htons( RTH_P_ALL ) ); //较新方法

fd = socket( AF_INET, SOCK_PACKET, htons( ETH_P_ALL ) ); //较久方法

由数据链路接收的任何协议的以太网将返回到这些套接字。

如果只想捕获IPv4帧,那就如下创建套接字:

fd = socket( PF_PACKET, SOCK_RAW, htons( ETH_P_IP ) ); //较新方法

fd = socket( AF_INET, SOCK_PACKET, htons( ETH_P_IP ) ); //较久方法

用作socket调用第三个参数的常值还有ETH_P_ARP、ETH_P_IPV6等。

Linux的数据链路访问方法相比BPF和DLPI存在如下差别。

Linux方法不提供内核缓冲,而且只有较新的方法才能提供内核过滤。

Linu较旧的方法不提供针对设备的过滤。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值