Linux网络编程:原始套接字的魔力【下】精选.pdfVIP

Linux网络编程:原始套接字的魔力【下】精选.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

pfenejiarz + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档