当前位置:
首页 > temp > python入门教程 >
-
07python实现traceroute程序
# 这个脚本是实现Linux中traceroute程序的,是探测从我们这个机器到我们要探测的IP地址中间都需要经过那些路由。 # 原理:我们的机器发送UDP高端口的数据包,发送给目的地址,首先设置ttl为1,然后逐次增加,在没有到达我们的目的IP # 地址的路由,会发送ICMP的超时报文,然后我们从中提取IP地址,因为我们发送的是高端口的报文,到达目的地址的时候, # 目的地址会发送ICMP的端口不可达报文,这样我们就探测出从我们源端口到目的端口的路由。 from scapy.all import * import struct,re,random # 跟我们实现ping程序的想法是一样的,首先构造一个发送一个UDP报文的函数, # 入参为目的地址,ttl数。 def traceroute_one(dst,ttl_no,dport): # 定义发包时间。 send_time = time.time() try: # 发送一个包,接收一个包。 traceroute_one_reply = sr1(IP(dst=dst, ttl=ttl_no) / UDP(dport=dport) / b'hello world', timeout=1, verbose=False) # 判断ICMP包是不是超时回答。 if traceroute_one_reply.getlayer(ICMP).type == 11 and traceroute_one_reply.getlayer(ICMP).code == 0: # 提取源地址 src_ip = traceroute_one_reply.getlayer(IP).src # 定义接收时间。 recv_time = time.time() # 计算时间ms数 mid_time = (recv_time - send_time) * 1000 # 返回。 return 1,src_ip,mid_time # 这里接接收的是最后一跳。ICMP应该是端口不可达。 elif traceroute_one_reply.getlayer(ICMP).type == 3 and traceroute_one_reply.getlayer(ICMP).code == 3: # 下边处理是一样的。 src_ip = traceroute_one_reply.getlayer(IP).src recv_time = time.time() mid_time = (recv_time - send_time) * 1000 return 2, src_ip, mid_time except Exception as e: return None def traceroute(dst,hops): # 目的端口从33434开始算起,入参为目的地址,我们想要查找的路由的条数。 dport = 33434 hop = 0 # 进行循环包。 while hop < hops: hop += 1 # 这里需要改变端口。 dport += hop # 发送一个包,获取返回值。 traceroute_result = traceroute_one(dst,hop,dport) # 如果出现了错误,打印*号。 if traceroute_result == None: print('*') # 这里代表中间路由,我们进行打印信息。 elif traceroute_result[0] == 1: print("%d %s %4.2fms" % (hop,traceroute_result[1],traceroute_result[2])) # 最后一个包,为端口不可达,打印信息后,需要退出循环,因为已经到达目的地址了,虽然可能没有达到我们定义的条数。 elif traceroute_result[0] == 2: print("%d %s %4.2fms" % (hop, traceroute_result[1], traceroute_result[2])) break time.sleep(1) if __name__ == "__main__": traceroute('180.101.49.12',10) # 接下来我们就可以使用wirshark进行抓包来看一下。
出 处:https://www.cnblogs.com/cong12586/p/14203408.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数