一、原始套接字概述
原始套接字(SOCK_RAW)
概述:
1、一种不同于SOCK_STREAM、SOCK_DGRAM的套接字,它实现于系统核心。
2、可以接收本机网卡上的所以数据帧(数据包),对于监听网络流量和分析网络数据很有作用。
3、开发人员可发送自己组装的数据包到网络上。
4、广泛应用与高级网络编程。
5、网络专家、黑客通常用此来编写奇特的网络程序。
三种套接字对比:
①流式套接字只能收发TCP协议的数据。
②数据包套接字只能收发UDP协议的数据。
③原始套接字可以收发
内核没有处理的数据包,因此要访问其他协议。
发送的数据需要使用,原始套接字(SOCK_RAW)
二、创建原始套接字
需要sudo运行
int socket(PF_PACKET, SOCK_RAW, protocol);
功能:创建链路层的原始套接字。
参数:
protocol:指定可以接收或发送的数据包类型。
ETH_P_IP:IPv4数据包。
ETH_P_ARP:ARP数据包。
ETH_P_ALL:任何协议类型的数据包。
返回值:
成功(>0):链路层套接字
失败(<0):出错
三、数据包分析
使用原始套接字进行编程开发时,首先要对不同的数据包进行学习,需要手动对IP、TCP、UDP、ICMP等包头进行组装或者拆解。
ubuntu中描述网络协议结构的文件如下:
在TCP/IP协议栈中的每一层为了能够正确解析出上层的数据包,从而使用一些**“协议类型”**来标记,详细如下图:
1、UDP封包格式
2、IP封包格式
3、Ethernet封包格式
4、TCP封包格式
5、ICMP封包格式