第7章 数据链路层的网络编程.doc

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 数据链路层的网络编程 本章介绍访问数据链路层服务的网络应用程序设计,并将着重介绍基于libpcap的网络应用编程方法。 7-1 概 述 数据链路层处于协议栈的第2层,基于物理层之上,它的最重要的作用是:通过数据链路层协议在不太可靠的物理链路上实现可靠的数据传输。所有的上层()()(1)Unix上的tcpdump就是这一功能的典型应用。使用时,如果将网络接口模式置为混杂模式(promiscous mode)(2)Unix系统的RARP服务器就是作为普通的应用进程运行,它们从数据链路层读取RARP请求(RARP)Unix上三种最常见的数据链路层访问接口是:BSD的BSD分组过滤器(BPF)4的数据链路层提供者接口(DLPI)Linux上的SOCK_PACKET插口。本章将简要介绍BDF和DLPI,然后着重介绍libpcap,它是免费可得的分组截获函数库。该函数库在所有三种接口上均可使用,因此使用它来实现数据链路层访问的应用程序具有很好的可移植性。今天的大多数网络入侵检测工具均使用该接口来实现网络入侵检测所需信息()7-2 BPF与DLPI BSD分组过滤器BPF是4.4BSD以及许多其他源自Berkeley的实现上访问数据链路层服务的接口。在支持BPF的系统上,每个数据链路层驱动程序在收到一个分组之后立即调用或在发送一个分组之前最后一刻调用BPF函数,立即调用的原因是为了提供精确的时间戳。 BPF不仅能够捕获经过数据链路层的所有分组,最重要的是它还提供分组过滤功能,即捕获应用进程想要的分组信息。BPF通过分组过滤器来实现分组的过滤,每一个数据链路层分组均要经过分组过滤器的过滤。BPF的分组过滤器可以只简单地过滤某种协议的分组,也可以精确到分组中的某个字段的特定值。 为了实现与应用进程相关的过滤功能,BPF实现了一个基于寄存器的过滤器机()libpcap函数库中的pcap_compile函数把ASCII字符串型的过滤器编译成伪机器的机器语言。 因为数据链路层收到的分组数相对于高层协议所收到的分组数而言要多得多,这就要求BPF能够非常快速地处理收到的每一个分组,否则将对系统性能有较大的影响。为了减少开销()(1)BPF (2)(3)(double buffering)Unix系统中,所有的设备均在/dev目录下。BPF设备的设备名均以bpf为前缀,后接一个数字,如0,1,2等。如果打开一个BPF设备时返回错误EBUSY,则可以试着打开下一个BPF设备直到成功。成功打开BPF设备后,要使用一系列ioctl命令来设置BPF设备属性,如装入过滤器,设备读超时、缓存大小、打开混杂模式等等。设置完成后,就可以读写BPF设备了。 DLPI是ATT设计的独立于协议的访问数据链路层服务接口,它是通过发送和接收流消息来实现数据链路层访问的。SVR4支持DLPI而不是BPF。 与BPF相类似,为了提高效率,DLPI也有过滤和缓存机制。在DLPI中,有两个流模块:pfmod和bufmod,其中pfmod的功能是在内核中进行分组过滤,而bufmod的功能则是缓存传送给应用进程的分组。pfmod过滤器也使用伪机器来实现包过滤,但伪机器的类型却是不一样的。 要访问DLPI,应用进程需要打开一个网络设备(le0)DLPI的DL_ATTACH_REQ请求将它与DLPI附接。附接完成后,一般还需要加载pfmod和bufmod流模块。然后,就可以读写DLPI设备了。 在Linux系统中,通过标准的插口API来访问数据链路层服务,插口类型为SOCK_PACKET。要使用这类插口,需要超级用户权限,而且调用socket的第三个参数(protocol)0的以太网帧类型值,ETH_P_IP(IP), ETH_P_ALL(), ETH_P_IPV6(IPv6)fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL)); inux系统中访问数据链路层服务有两点不同:其一,Linux不提供基于内核的分组过滤和缓存机制;其二,Linux不提供针对设备的过滤,socket时指定ETH_P_IP,则从系统上的任何设备()v4分组都将传送给该插口。因此,Linux上的这种机制显然不如前两种机制好。 7-3 Libpcap 7-3-1 Libpcap简介 Libpcap(Libaray for Packet Capture),即分组捕获函数库,是由劳伦斯·伯克利国家实验室开发的一个在用户级进行实时分组捕获的接口,其特点是独立于操作系统。当初设计Libpcap仅仅是准备用在不同版本的Unix平台上,但实际效果却远远超过了当初的预计。目前的Libpcap同时支持源自Berkeley内核下的BPF、Solaris 2.x下的DLPI、

文档评论(0)

精品文库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档