一、编程思路
C语言中的socket函数,作为一种标准的网络库,通常使用socket来代表一个网络连接,再和一个IP地址和端口绑定。python中也有类似C语言的socket库。假如使用python来发一个ICMP包,首先熟悉socket函数使用,如何创建一个ICMP接口,其次发送的ping包如何组织,socket就像先建好从应用到网卡的一根管道。ping就是管道中发送的数据。socket的类型规定了必须是ICMP包。网络中传输的都是二进制,所有传的ICMP包也需要是二进制,这时需要使用python网络中常涉及的一个库,struct,可以按照指定的格式将python数据转化为字符串,该字符串为字节流。
二、函数解释
先看创建socket
创建一个ICMP socket,里面的参数比较好理解,如果是TCP,UDP换成响应的函数就可以了
icmp_socket = socket.socket(family, socket.SOCK_RAW, proto)
创建好socket的时候,准备发送数据
先看一下ICMP报文格式:
image.png
ICMP头包括20个bytes,其中
类型 : 8字节
代码:0 8字节
校验和: 8字节
标识符:8字节 (报文 id)
序号:8字节 (一般取当前运行的进程号)
在看struct函数使用
简单的例子:
struct.pack('>I', 10240099)
第一个参数是需要转化为的格式,后面是需要转化的数字
ICMP 报文的格式选择使用 "!BBHHH"
'>l',"!BBHHH" 都是有特殊含义的,比如 '>' 代表 大端
'!' network(大端)
struct.pack("!BBHHH", 8, 0, 0,pkt_id, self.ident)
第三步:
发送数据
full_pkt = header+payload ,
full_dest_addr = 发送的目的地
icmp_socket.sendto(full_pkt, full_dest_addr)
其中还有一些细节,比如 校验和怎么计算,目的地址的格式转化,下一篇文章会有demo。
网友评论