以上代码实现了一个简单的Traceroute API,可以用来探测到目标主机的网络路由。

首先,我们调用Python的socket模块来获取目标主机的IP地址:

dest_addr = socket.gethostbyname(hostname)

然后,我们定义一些常量来设置Traceroute的参数。这些参数包括使用的端口号、最大跃点数、ICMP和UDP协议等:

port = 33434
max_hops = 30
icmp = socket.getprotobyname('icmp')
udp = socket.getprotobyname('udp')
ttl = 1

在while循环中,我们通过创建一个发送套接字和一个接收套接字,构造一个UDP数据包,并将其发送到目标主机:

recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)
send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)
send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)
recv_socket.bind(("", port))
send_socket.sendto(b"", (hostname, port))

我们使用setsockopt函数来设置套接字选项,以设置TTL字段的值。TTL(Time To Live)是IP数据包的一个字段,它规定了数据包在互联网上可以被传输的最大跃点数。每经过一个路由器,TTL值都会减1。如果TTL值达到0,数据包将被丢弃。

接下来,我们使用recvfrom函数接收响应数据包,并解析数据包以获取当前路由器的IP地址和主机名:

data, current_addr = recv_socket.recvfrom(512)
current_addr = current_addr[0]
try:current_name = socket.gethostbyaddr(current_addr)[0]
except socket.error:current_name = current_addr

在这里,我们使用recvfrom函数从接收套接字中读取数据。recvfrom函数返回一个元组,其中包含接收到的数据和远程主机的地址。然后,我们从返回的地址元组中获取IP地址,并使用gethostbyaddr函数获取当前路由器的主机名。

最后,我们打印每个跃点的主机名或IP地址:

if current_addr is not None:current_host = f"{current_name} ({current_addr})"
else:current_host = "*"print(f"{ttl}\t{current_host}")

我们通过判断当前路由器的IP地址是否为空来确定是否能够成功接收到响应数据包。如果接收到了响应数据包,则将当前路由器的主机名和IP地址格式化为字符串,并将其打印出来。

最后,我们增加TTL值,以便继续发送新的数据包,探测下一个路由器:

ttl += 1

如果当前路由器的IP地址与目标主机的IP地址相同,或者TTL值达到了最大跃点数,则停止循环:

if current_addr == dest_addr or ttl > max_hops:break

完整代码如下:

import socket
import struct
import timedef traceroute(hostname):dest_addr = socket.gethostbyname(hostname)port = 33434max_hops = 30icmp = socket.getprotobyname('icmp')udp = socket.getprotobyname('udp')ttl = 1while True:recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp)send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp)send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl)recv_socket.bind(("", port))send_socket.sendto(b"", (hostname, port))current_addr = Nonecurrent_name = Nonetry:# receive packetdata, current_addr = recv_socket.recvfrom(512)current_addr = current_addr[0]try:current_name = socket.gethostbyaddr(current_addr)[0]except socket.error:current_name = current_addrexcept socket.error:passfinally:send_socket.close()recv_socket.close()if current_addr is not None:current_host = f"{current_name} ({current_addr})"else:current_host = "*"print(f"{ttl}\t{current_host}")ttl += 1if current_addr == dest_addr or ttl > max_hops:break

这样,我们就实现了这样,我们就实现了一个简单的Traceroute API。使用这个API,我们可以在Python中轻松地探测到目标主机的网络路由,并打印出每个路由器的主机名或IP地址。

Traceroute是一种非常有用的网络工具,它可以帮助我们诊断网络故障和确定网络连接的性能问题。通过跟踪网络路由,Traceroute可以帮助我们找到网络连接中的瓶颈,找出网络延迟和丢包的原因,以及确定哪些路由器可能存在故障或配置问题。

需要注意的是,Traceroute并不总是可靠的,因为路由器可能会禁止或过滤掉ICMP或UDP数据包,或者使用不同的路由策略。此外,Traceroute还可能受到防火墙或IDS/IPS的影响,因为它会生成大量的网络流量。

因此,在实际使用Traceroute时,我们需要谨慎处理,并结合其他网络工具和技术,例如ping、TCP半开扫描、路由跟踪等,以确保我们可以获得准确和可靠的网络诊断信息。

Traceroute实现相关推荐

  1. traceroute/tracert--获取网络路由路径

    traceroute 是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具.traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听一个来自网 ...

  2. Linux下路由表调试工具traceroute

    在做静态路由表或者路由表分配时,比较直接的调试工具是traceroute,可以跟踪访问一个IP所到达的路由层级,从而知道经过哪些链路. 参考: http://man.linuxde.net/trace ...

  3. ICMP最典型的应用PING和traceroute

    ICMP,Internet Control Message Protocol,网际控制报文协议主要用来检测网络连通性和实现链路追踪,最典型的应用就是PING和traceroute. PING: 通过发 ...

  4. linux traceroute 命令 查看路由表

    traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样, ...

  5. TCP/IP详解--学习笔记(4)-ICMP协议,ping和Traceroute

    1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...

  6. Linux之traceroute命令使用详解—网络故障定位(三)

    现实世界中的网络是由无数的计算机和路由器组成的一张的大网,应用的数据包在发送到服务器之前都要经过层层的路由转发.而Traceroute是一种常规的网络分析工具,用来定位到目标主机之间的所有路由器 原理 ...

  7. 【计算机网络】网络层 : ICMP 协议 ( ICMP 差错报文 | 差错报文分类 | ICMP 询问报文 | ICMP 应用 | Ping | Traceroute )

    文章目录 一.ICMP 协议 二.ICMP 协议 简介 三.ICMP 五种差错报告报文 四.ICMP 差错报文形成 五.ICMP 差错报文 不发送 情形 六.ICMP 询问报文 七.ICMP 应用 一 ...

  8. linux命令:nslookup 、tar、route , tracert, traceroute, netstat、write、mesg、touch

    linux命令:nslookup .tar.route , tracert, traceroute, netstat.write.mesg.touch.edquota.more 1.在Linux系统中 ...

  9. ssh命令、ping命令、traceroute 命令所使用的协议

    在Node reboot or eviction: How to check if yourprivate interconnect CRS can transmit network heartbea ...

  10. TCP/IP illustated: 第七、八章 Ping program Traceroute program

    Ping program 与 Traceroute program 均是以 iCMP 为基础的两个程序. 其功能主要用于探测是否能够连接.观察记录 IP datagram 的路程. Ping Prog ...

最新文章

  1. Template Method(模板方法)模式
  2. as3(actionScript3.0) 操作摄像头(Camera)实例
  3. 20155339 Exp6 信息搜集与漏洞扫描
  4. django oracle clob,记一次clob字段损坏导致的01555错误
  5. datagrid如何获取一行数据中的某个字段值_MySQL 如何查找删除重复行?
  6. 结对编程实现四则运算
  7. tomcat9.0安装配置
  8. 高级shell编程讲解
  9. 小学计算机flash,小学信息技术flash课件
  10. LABVIEW2020安装OpenG Labpython库无法使用解决办法
  11. 2023成都精密光学展览会
  12. 关于Msocache文件夹
  13. 用 regedit 命令把注册表 .reg 文件导入注册表- -
  14. MSDC 4.3 接口规范(8)
  15. 视频服务器信号转换器,DVI转换器
  16. 6-7 十进制转换二进制 (15分)
  17. 奥的斯电梯服务器自动呼梯,eCall BLE
  18. Hot 100(二)
  19. Unity中Mesh和subMesh的区别
  20. DLink 流批一体技术架构及优势 | 滴普科技FastData系列解读

热门文章

  1. Python信号处理小试牛刀——快速傅里叶变换(FFT)
  2. Linux用户与权限管理
  3. 性能测试之----IOZONE
  4. 红黑树、平衡二叉查找树
  5. 编写一个方法,去掉数组中重复元素
  6. LibreOffice 设置为中文字体
  7. SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询
  8. python请简述构造函数和析构函数的作用_python构造函数和析构函数
  9. python is 和 == 的区别
  10. Linux的触屏软件安装,触摸屏之linux3.4.2安装tslib