荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: everlove.bbs@bbs.shuoshuo.net (我是如此厌倦), 信区: Linux
标  题: unp第二十六章学习体会
发信站: 寂寞森林 (Mon Sep 23 10:59:23 2002)
转信站: SZUBBS!news2.happynet.org!news.happynet.org!LonelyWood


发信人: clown (梧桐叶), 信区: UNP
标  题: unp第二十六章学习体会
发信站: UNIX编程 (2001年11月19日17:19:03 星期一), 站内信件

数据链路层访问

数据链路层访问主要用于监视网络中的数据报(当然也可以用于发送
数据报),与原始套接口相比,它属于数据链路层,因此得到的数据
报包括ether帧的头部14字节(dest mac, source mac, protocol)。而
套接口属于IP层,得到的数据报是从ip头部开始的。

虽然Linux中可以使用socket(AF_INET, SOCK_RAW, htons(ETH_P_IP));
得到数据链路层的数据,但是我想可能仍然属于网络层,正如只要得到
了sk_buff的指针,不论到了哪一层,都可以得到底层的协议头部一样。
实用该套接口得到的是struct sockaddr_ll的数据,由于我对该结构不
熟悉,也不太想了解,因此没有测试。

为了实现数据链路层的访问,不同的系统有不同的实现方法。因此也
分为三类,不过大致的原理应该相差不大。
1. BSD系统使用Berkeley Packets Filter,该方法中包的过滤是在内核
中完成的,因此效率很高。
2. System V系统使用Data Link Provider Interface,我对该方法不了解。
3. Linux系统使用SOCK_PACKET方法。

正是由于不同的系统使用的方法不同,因此为了增强移植性,有人开发了一个
libpcap库,用于实现一个系统无关的数据链路层访问,实际上该库在底层
使用的还是各个系统提供的上面三种方法之一。

我只是用SOCK_PACKET写了几个测试程序,觉得具体实现起来和SOCK_RAW比较
相近,而且也比较简单,就不再详细介绍了,如有兴趣,可以看看相应的程序。

SOCK_PACKET的创建:socket(AF_INET, SOCK_PACKET, htons(IP_P_ALL));
或者socket(AF_INET, SOCK_PACKET, htons(IP_P_IP)); 当然也可以监听或者
发送其他协议的报文,不过这两种应该是使用最多的。


--
易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望,
是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花,
都是一个死亡唇边的微笑。
※ 来源:·UNIX编程 apue.dhs.org·[FROM: 202.114.1.61]
--
我站在夜的尽头
窗外的雨悄悄坠落





※ 来源:.寂寞森林 http://bbs.shuoshuo.net  ◆ FROM: 211.161.158.231


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店