一、最基本的功能
完成第一个demo:
#!/bin/env/python
import socket
import struct
import os
import time
# create icmp socket
def create_socket():
proto = 'ICMP'
try:
icmp_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
print icmp_socket
except Exception as e:
raise e
return icmp_socket
# generate icmp data
def generate_pkg():
## ICMP pkg header
pkt_id = os.getpid()
ident = 0
pkg_header = struct.pack("!BBHHH", 8, 0, 0, pkt_id, ident)
payload = struct.pack("d", time.time())
pkg = pkg_header+payload
return pkg
def send_pkg(icmp_socket,pkt,dst_addr):
icmp_socket.sendto(pkt,dst_addr)
if __name__ == '__main__':
icmp_socket = create_socket()
pkt = generate_pkg()
dst_addr = '61.135.169.121'
real_dst_addr = (dst_addr, 0)
send_pkg(icmp_socket, pkt, real_dst_addr)
通过抓包看下组包是否正确
image.png
可以看出有两个问题:
1、checksum 写的是0,提示错误
2、没有收到对端的回包,正常给8.8.8.8发ping是可以回的,应该是这个组包不正确,所以没有收到回包
checksum早在学习通信的时候就知道,是为了防止远距离通信过程中,传的数据被篡改,checksum在网络传输中有自己的计算方法。这篇文章非常详细的介绍了checksum如何计算:
https://blog.csdn.net/qq_37174526/article/details/88407884