- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux网络编程:原始套接字的魔力【下】精选
Linux网络编程:原始套接字的魔力 【下】
星期四, 8月 23 2012, 10:47 下午
可以接收链路层MAC帧的原始套接字
前面我们介绍过了通过原始套接字socket(AF_ INET , SOCK_ RAW, protocol)我
们可以直接实现自行构造整个IP报文,然后对其收发。提醒一点,在用这种方式构
造原始IP报文时,第三个参数protocol不能用IPPROTO_ IP,这样会让系统疑惑,不
知道该用什么协议来伺候你了。
今天我们介绍原始套接字的另一种用法:直接从链路层收发数据帧,听起来好
像很神奇的样子。在Linux系统中要从链路层(MAC)直接收发数帧,比较普遍的做法
就是用libpcap和libnet两个动态库来实现。但今天我们就要用原始套接字来实现这
个功能。
这里的2字节帧类型用来指示该数据帧所承载的上层协议是IP、ARP或其他。
为了实现直接从链路层收发数据帧,我们要用到原始套接字的如下形式:
socket(PF_PACKET , type, protocol)
1、其中type字段可取SOCK_ RAW或SOCK_DGRAM。它们两个都使用一种与
设备无关的标准物理层地址结构struct sockaddr_ll{},但具体操作的报文格式不同:
SOCK_ RAW :直接向网络硬件驱动程序发送(或从网络硬件驱动程序接收)没有
任何处理的完整数据报文(包括物理帧的帧头),这就要求我们必须了解对应设备的
物理帧帧头结构,才能正确地装载和分析报文。也就是说我们用这种套接字从网卡
驱动上收上来的报文包含了MAC头部,如果我们要用这种形式的套接字直接向网卡
发送数据帧,那么我们必须自己组装我们MAC头部。这正符合我们的需求。
SOCK_DGRAM:这种类型的套接字对于收到的数据报文的物理帧帧头会被系
统自动去掉,然后再将其往协议栈上层传递;同样地,在发送时数据时,系统将会
根据sockaddr_ll结构中的目的地址信息为数据报文添加一个合适的MAC帧头。
2、protocol字段,常见的,一般情况下该字段
取ET H_P_ IP,ET H_P_ARP,ET H_P_ RARP或ET H_P_ALL,当然链路层协议很
多,肯定不止我们说的这几个,但我们一般只关心这几个就够我们用了。这里简单
提一下网络数据收发的一点基础。协议栈在组织数据收发流程时需要处理好两个方
面的问题:“从上倒下” ,即数据发送的任务;“从下到上” ,即数据接收的任务。数
据发送相对接收来说要容易些,因为对于数据接收而言,网卡驱动还要明确什么样
的数据该接收、什么样的不该接收等问题。protocol字段可选的四个值及其意义如
下:
protocol 值 作用
ET H_P_ IP 0X0800 只接收发往目的MAC是本机的IP类型的数据帧
ET H_P_ARP 0X0806 只接收发往目的MAC是本机的ARP类型的数据帧
ET H_P_ RARP 0X8035 只接受发往目的MAC是本机的RARP类型的数据帧
ET H_P_ALL 0X0003 接收发往目的MAC是本机的所有类型(ip,arp,rarp)的
数据帧,同时还可以接收从本机发出去的所有数据
帧。在混杂模式打开的情况下,还会接收到发往目
的MAC为非本地硬件地址的数据帧。
protocol字段可取的所有协议参见/usr/include/linux/if_ether.h头文件里的定义。
最后,格外需要留心一点的就是,发送数据的时候需要自己组织整个以太网数
据帧。和地址相关的结构体就不能再用前面的struct sockaddr_in{} 了,而是struct
sockaddr_ll{},如下:
点击(此处)折叠或打开
1. struct sockaddr_ll{
2. unsigned short sll_family; /* 总是 AF_PACKET */
3. unsigned short sll_protocol; /* 物理层的协议 */
4. int sll_ifindex; /* 接口号 */
文档评论(0)