Linux下raw socket编程

本文介绍了Linux下raw socket的使用,包括通过AF_INET处理IP层以上数据和通过AF_PACKET处理数据链路层数据。利用raw socket,可以实现对TCP/IP协议栈的直接访问,进行IP、TCP、UDP或ICMP数据包的发送与接收。同时,文章提到了不同参数组合下的套接字功能,如用于ping程序的AF_INET套接字和监听网卡所有数据帧的PF_PACKET套接字。
摘要由CSDN通过智能技术生成

参考文章:

(1)博客园-raw socket

通常所说的socket通信是指通假字通信,也就是IP层往上的,IP+接口号完成套接字通信。这种情况下通信产生的数据包如TCP/UDP/ICMP包。某些情况下我们需要执行更底层的操作,通过raw socket通信可以完成基于数据链路层的socket通信。

raw socket的主要结构为:sockfd = socket(PARAM1, SOCK_RAW, protocol);

最原始的套接字PARAM1主要有两种:

一种是处理IP层及其上的数据,通过指定socket第一个参数为AF_INET来创建这种套接字,这种情况下地址是IP地址。(XX.XX.XX.XX),4bytes

另一种是处理数据链路层即其上的数据,通过指定socket第一个参数为AF_PACKET来创建这种套接字,这种情况下地址是MAC地址。(XX:XX:XX:XX:XX:XX),6bytes

AF_INET表示获取从网络层开始的数据
socket(AF_INET, SOCK_RAW, …)
当接收包时,表示用户获得完整的包含IP报头的数据包,即数据从IP报头开始算起。
当发送包时,用户只能发送包含TCP报头或UDP报头或包含其他传输协议的报文,IP报头以及以太网帧头则由内核自动加封。除非是设置了IP_HDRINCL的socket选项。
如果第二个参数为SOCK_STREAM, SOCK_DGRAM,表示接收的数据直接为应用层数据。

PF_PACKET,表示获取的数据是从数据链路层开始的数据
socket(PF_PACKET

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值