我正在尝试使用Python中的原始套接字向主机发送UDP数据包,然后获取该数据包的ICMP响应,以重新实现traceroute。
我已经成功构建了IP和UDP标头,并发送了数据包。我可以在Wireshark中看到它。我还可以在Wireshark中看到ICMP响应,告诉我TTL已超过。
下面是代码:
然后在数据包发送后,我调用另一个函数来监听传入的数据包,其中包括以下片段:
我能够成功地解包IP头并检查协议,但它总是6或17(TCP或UDP)。即使在Wireshark中显示ICMP负载,我也从未收到包含ICMP负载的IP数据包。
我尝试将Wireshark中的ICMP数据包与我的程序可以看到的其他数据包进行比较,发现IP头几乎完全相同。我不知道哪里出了问题。
谢谢您的帮助。
我已经成功构建了IP和UDP标头,并发送了数据包。我可以在Wireshark中看到它。我还可以在Wireshark中看到ICMP响应,告诉我TTL已超过。
下面是代码:
me = gethostbyname(gethostname())
my_socket = socket(AF_INET, SOCK_RAW)
my_socket.setsockopt(IPPROTO_IP, IP_HDRINCL, 1)
my_socket.bind((me, 0))
hostname = 'www.google.com'
hostip = gethostbyname(hostname)
packet = create_packet(hostname)
send_socket.sendto(packet, (hostip , 0))
然后在数据包发送后,我调用另一个函数来监听传入的数据包,其中包括以下片段:
while True:
ready = select.select([my_socket], [], [], time_left)
if ready[0] == []:
print "timeout"
time_now = time.time()
rec_packet, addr = my_socket.recvfrom(5120)
unpacked_ip = unpack('!BBHHHBBH4s4s', rec_packet[0:20]) #0-20 is IP header
prot = unpacked_ip[6] #gives the protocol id
if prot == 1:
#this is ICMP , let's do things
我能够成功地解包IP头并检查协议,但它总是6或17(TCP或UDP)。即使在Wireshark中显示ICMP负载,我也从未收到包含ICMP负载的IP数据包。
我尝试将Wireshark中的ICMP数据包与我的程序可以看到的其他数据包进行比较,发现IP头几乎完全相同。我不知道哪里出了问题。
谢谢您的帮助。