1.这是命令行运行 traceroute 110.242.68.3
2.这是使用scapy库写的traceroute
def tcptraceroute(host, timeout, maxttl=30):
ip = host
print("tcptraceroute to '{}' ({}), {} hops max".format(host, ip, maxttl))
for i in range(1, maxttl + 1):
for j in range(3):
packet = IP(dst=ip, ttl=i) / TCP(flags='S')
resp, _ = sr(packet, verbose=0, timeout=timeout)
src = "*"
duration = ""
if len(resp) > 0:
src = resp[0][1].src
duration = "{:.3f} ms".format(
1000 * (resp[0][1].time - resp[0][0].sent_time))
print("{:2d}. {:>15}\t{}".format(i, src, duration))
if src == ip:
return
print("Couldn't traceroute {}, reached max TTL '{}'".format(ip, maxttl))
traceroute 命令是用来检测网络中各路由器之间的连通性的工具。它使用 Internet Control Message Protocol (ICMP) 协议来实现。它在发送数据包时会指定一个较小的 Time-To-Live (TTL) 值,并随着每经过一个路由器而减小 1。当数据包的 TTL 值为 0 时,路由器会将数据包丢弃,并向发送方返回一个错误消息。traceroute 命令每次将 TTL 值增加 1,并重新发送数据包,直到到达目的地为止。这样,traceroute 命令就能够收集到数据包在网络中经过的路由器的信息。
scapy 是一个用 Python 编写的网络数据包处理库。sr 函数是 scapy 中的一个函数,用于发送和接收数据包。与 traceroute 命令不同的是,sr 函数可以自定义数据包的各种参数,如数据包类型、协议、TTL 值等。因此,scapy 的 sr 函数可以用来发送 traceroute 数据包,但可能会有所不同。
所以,traceroute 命令和 scapy 的 sr 函数得到的结果可能不同,是因为它们使用的协议和方法不同。