1. Raw Socket基础
提供了一种方法来绕过整个网络堆栈遍历和直接将以太网帧输送到一个应用程序。
有很多种方法来创建raw sockets,例如AF_PACKET,PF_PACKET。这里使用PF_PACKET,它是linux系统上才有的选项,如果是windows或者是mac的系统的话,可以使用AF_PACKET。
1.1 PF_SOCKET
在链路层接收和发送包得应用接口。
所有接收到的包都包含完整的头部和数据部分。
所有发送的包都会由内核无更改的传递到媒介中。
2. 创建Raw Socket
2.1 理解Packet Header
下图为以太网帧头部和IP头部格式示意图:
以太网帧的头部有14字节,前6字节为目的mac地址,后6字节为源mac地址,之后2字节为内部协议的类型,比如IP协议的类型为0x0800。关于各种协议的类型可在/usr/include/linux/if_ether.h文件中查看(linux系统)。往里一层是IP等网络层协议,IP层内部包含TCP、UDP等传输层协议,再往里就是应用层协议,如HTTP、ssh等。
图中最下侧是IP的头部格式,最重要的部分是前20字节。
2.2 提取二进制数据到变量中
使用struct模块中的unpack()函数。
返回的时tuple格式。(tuple的更详细内容可参考:廖雪峰讲的python中tuple部分)