一、簡介
Traceroute是一種網絡診斷工具,用於確定數據包從源地址到指定目的地址所經過的路由路徑。Traceroute程序發送一系列的數據包(一般為UDP包),逐跳地增加TTL(TTL初值一般為1),獲取相應的ICMP時間超時信息,以確定數據包到達每個路由器所耗費的時間。通過這種方式,Traceroute程序能夠確定到達目的主機所經過的路由路徑,並顯示這些路由器的IP地址、DNS名稱、響應時間等信息,幫助診斷網絡故障。
二、原理
Traceroute的原理是利用IP協議中的TTL字段。每個IP數據報在傳輸時都有一個TTL字段,其初值為一般為64。每經過一個路由器,TTL就會被減1,當TTL被減成0時,數據報就被丟棄。目的主機發送的第一個數據報的TTL被設置為1,它首先到達第一台路由器(一般為本地路由器),此時TTL為0,路由器丟棄該數據報並返回一個ICMP“時間超時”信息給源主機。源主機接收到ICMP信息後,就知道第一台路由器的IP地址,並把TTL加1,再次發送一個TTL值為2的數據報,如此往複直到目的主機。
因此,Traceroute程序在實現時,需要不斷地發送數據包,每次增加TTL,直到數據包到達目的主機。當程序收到目的主機的回復後,就得到了到達目的主機的路徑信息,包括每一個節點的IP地址、響應時間等信息,從而診斷網絡的連通性問題。
三、實現
1. 實現思路
Traceroute程序的實現思路包括以下幾個步驟:
- 構造UDP數據包,並設置TTL初始值為1,發送到目的主機。
- 監聽UDP套接字,等待目的主機的回復,記錄下IP地址和響應時間。
- 將TTL值增加1,重新構造UDP數據包,並發送到目的主機。
- 重複第2、3步,直到目的主機響應返回或到達最大TTL值。
- 顯示路由路徑信息。
2. 代碼實現
下面是一個基於Python語言實現的簡單traceroute程序:
import socket
import struct
import time
def main(dest_name, dest_addr, max_hops):
port = 33434
icmp = socket.getprotobyname('icmp')
udp = socket.getprotobyname('udp')
ttl = 1
while 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)
# 綁定套接字,監聽"來自任意地址、端口為port的UDP數據報"
recv_socket.bind(("", port))
# 記錄發送時間
start_time = time.time()
send_socket.sendto("", (dest_name, port))
# 等待接收數據報,超時設為1秒
try:
recv_socket.settimeout(1)
_, curr_addr = recv_socket.recvfrom(512)
curr_time = (time.time() - start_time) * 1000
curr_addr = curr_addr[0]
try:
curr_name = socket.gethostbyaddr(curr_addr)[0]
except socket.error:
curr_name = curr_addr
except socket.timeout:
curr_name = "*"
curr_addr = None
curr_time = None
send_socket.close()
recv_socket.close()
# 輸出路由信息
if curr_addr is not None:
curr_host = "%s (%s)" % (curr_name, curr_addr)
else:
curr_host = "*"
print("%d\t%s\t%.0fms" % (ttl, curr_host, curr_time))
if curr_addr == dest_addr or ttl >= max_hops:
break
else:
ttl += 1
if __name__ == "__main__":
dest_name = "www.baidu.com"
dest_addr = socket.gethostbyname(dest_name)
max_hops = 30
main(dest_name, dest_addr, max_hops)
四、結果解析
運行上述程序,可以得到類似如下的輸出結果:
1 * *
2 192.168.1.1 1ms
3 172.16.9.196 4ms
4 202.106.88.77 17ms
5 202.106.35.218 25ms
6 202.97.53.21 25ms
7 220.181.22.158 25ms
8 180.149.144.235 25ms
9 220.181.16.17 24ms
10 61.135.113.154 29ms
11 * *
12 * *
13 * *
14 * *
15 * *
16 * *
17 * *
18 * *
19 * *
20 * *
21 * *
22 * *
23 * *
24 * *
25 * *
26 * *
27 * *
28 * *
29 * *
30 * *
對於每個路由器,程序輸出三個信息:TTL(即經過的路由器數目)、路由器的IP地址、響應時間。其中,星號表示該路由器未返迴響應信息,可能是防火牆等原因,或者程序未發送數據包到該路由器。
五、總結
Traceroute是一種非常有用的網絡診斷工具,它可以通過逐跳地增加TTL字段,獲取每個路由器的IP地址和響應時間,從而確定到達目的主機的路由路徑。本文簡單介紹了Traceroute的原理和實現思路,並給出了Python語言實現的代碼示例,幫助讀者更好地理解並使用Traceroute程序。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/305205.html