內容簡介
TTL全程Time to Live,意思就是生存周期。
首先要說明ping命令是使用的網路層協定ICMP,所以TTL指的是一個網路層的網路數據包(package)的生存周期,這句話不懂的先回去複習OSI7層協定去。
概念解析
基本解析
很顯然,一個package從一台機器到另一台機器中間需要經過很長的路徑,顯然這個路徑不是單一的,是很複雜的,並且很可能存在環路。如果一個數據包在傳輸過程中進入了環路,如果不終止它的話,它會一直循環下去,如果很多個數據包都這樣循環的話,那對於網路來說這就是災難了。所以需要在包中設定這樣一個值,包在每經過一個節點,將這個值減1,反覆這樣操作,最終可能造成2個結果:包在這個值還為正數的時候到達了目的地,或者是在經過一定數量的節點後,這個值減為了0。前者代表完成了一次正常的傳輸,後者代表包可能選擇了一條非常長的路徑甚至是進入了環路,這顯然不是我們期望的,所以在這個值為0的時候,網路設備將不會再傳遞這個包而是直接將他拋棄,並傳送一個通知給包的源地址,說這個包已死。
其實TTL值這個東西本身並代表不了什麼,對於使用者來說,關心的問題應該是包是否到達了目的地而不是經過了幾個節點後到達。但是TTL值還是可以得到有意思的信息的。
每個作業系統對TTL值得定義都不同,這個值甚至可以通過修改某些系統的網路參數來修改,例如Win2000默認為128,通過註冊表也可以修改。而Linux大多定義為64。不過一般來說,很少有人會去修改自己機器的這個值的,這就給了我們機會可以通過ping的回顯TTL來大體判斷一台機器是什麼作業系統。
以2台機器為例
看如下命令
D:\Documents and Settings\hx>ping 61.152.93.131
Pinging 61.152.93.131 with 32 bytes of data:
Reply from 61.152.93.131: bytes=32 time=21ms TTL=118
Reply from 61.152.93.131: bytes=32 time=19ms TTL=118
Reply from 61.152.93.131: bytes=32 time=18ms TTL=118
Reply from 61.152.93.131: bytes=32 time=22ms TTL=118
Ping statistics for 61.152.93.131:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss
Approximate round trip times in milli-seconds:
Minimum = 18ms, Maximum = 22ms, Average = 20ms
D:\Documents and Settings\hx>ping 61.152.104.40
Pinging 61.152.104.40 with 32 bytes of data:
Reply from 61.152.104.40: bytes=32 time=28ms TTL=54
Reply from 61.152.104.40: bytes=32 time=18ms TTL=54
Reply from 61.152.104.40: bytes=32 time=18ms TTL=54
Reply from 61.152.104.40: bytes=32 time=13ms TTL=54
Ping statistics for 61.152.104.40:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss
Approximate round trip times in milli-seconds:
Minimum = 13ms, Maximum = 28ms, Average = 19ms
第一台TTL為118,則基本可以判斷這是一台Windows機器,從我的機器到這台機器經過了10個節點,因為128-118=10。而第二台應該是台Linux,理由一樣64-54=10。
了解了上面的東西,可能有人會有一些疑問,例如以下:
1,不是說包可能走很多路徑嗎,為什麼我看到的4個包TTL都是一樣的,沒有出現不同?
這是由於包經過的路徑是經過了一些最優選擇算法來定下來的,在網路拓撲穩定一段時間後,包的路由路徑也會相對穩定在一個最短路徑上。具體怎么算出來的要去研究路由算法了,不在討論之列。
2,對於上面例子第二台機器,為什麼不認為它是經過了74個節點的Windows機器?因為128-74=54。
對於這個問題,我們要引入另外一個很好的ICMP協定工具。不過首先要聲明的是,一個包經過74個節點這個有些恐怖,這樣的路徑還是不用為好。
要介紹的這個工具是tracert(*nix下為traceroute),讓我們來看對上面的第二台機器用這個命令的結果
D:\Documents and Settings\hx>tracert 61.152.104.40
Tracing route to 61.152.104.40 over a maximum of 30 hops
1 13 ms 16 ms 9 ms 10.120.32.1
2 9 ms 9 ms 11 ms 219.233.244.105
3 12 ms 10 ms 10 ms 219.233.238.173
4 15 ms 15 ms 17 ms 219.233.238.13
5 14 ms 19 ms 19 ms 202.96.222.73
6 14 ms 17 ms 13 ms 202.96.222.121
7 14 ms 15 ms 14 ms 61.152.81.86
8 15 ms 14 ms 13 ms 61.152.87.162
9 16 ms 16 ms 28 ms 61.152.99.26
10 12 ms 13 ms 18 ms 61.152.99.94
11 14 ms 18 ms 16 ms 61.152.104.40
Trace complete.
從這個命令的結果能夠看到從我的機器到伺服器所走的路由,確實是11個節點(上面說10個好像是我犯了忘了算0的錯誤了,應該是64-54+1),而不是128的TTL經過了70多個節點。
既然已經說到這裡了,不妨順便說說關於這兩個ICMP命令的高級一點的東西。
首先是ping命令,其實ping有這樣一個參數,可以無視作業系統默認TTL值而使用自己定義的值來傳送ICMP Request包。
例如還是用那台Linux機器,用以下命令:
D:\Documents and Settings\hx>ping 61.152.104.40 -i 11
Pinging 61.152.104.40 with 32 bytes of data:
Reply from 61.152.104.40: bytes=32 time=10ms TTL=54
Reply from 61.152.104.40: bytes=32 time=13ms TTL=54
Reply from 61.152.104.40: bytes=32 time=10ms TTL=54
Reply from 61.152.104.40: bytes=32 time=13ms TTL=54
Ping statistics for 61.152.104.40:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 10ms, Maximum = 13ms, Average = 11ms
D:\Documents and Settings\hx>
這個命令我們定義了發包的TTL為11,而前面我們知道,我到這台伺服器是要經過11個節點的,所以這個輸出和以前沒什麼不同。現在再用這個試試看:
D:\Documents and Settings\hx>ping 61.152.104.40 -i 10
Pinging 61.152.104.40 with 32 bytes of data:
Reply from 61.152.99.94: TTL expired in transit.
Reply from 61.152.99.94: TTL expired in transit.
Reply from 61.152.99.94: TTL expired in transit.
Reply from 61.152.99.94: TTL expired in transit.
Ping statistics for 61.152.104.40:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
D:\Documents and Settings\hx>
可以看到,結果不一樣了,我定義了TTL為10來發包,結果是TTL expired in transit.就是說在到達伺服器之前這個包的生命周期就結束了。注意看這句話前面的ip,這個ip恰好是我們前面tracert結果到伺服器之前的最後1個ip,包的TTL就是在這裡減少到0了,根據我們前面的討論,當TTL減為0時設備會丟棄包並傳送一個TTL過期的ICMP反饋給源地址,這裡的結果就是最好的證明。
通過這裡再次又證明了從我機器到伺服器是經過了11個節點而不是70多個。
最後再鞏固一下知識,有人可能覺得tracer這個命令很神奇,可以發現一個包所經過的路由路徑。其實這個命令的原理就在我們上面的討論中。
想像一下,如果我給目的伺服器傳送一個TTL為1的包,結果會怎樣?
根據前面的討論,在包港出發的第一個節點,TTL就會減少為0,這時這個節點就會回應TTL失效的反饋,這個回應包含了設備本身的ip地址,這樣我們就得到了路由路徑的第一個節點的地址。
因此,我們繼續傳送TTL=2的包,也就受到第二個節點的TTL失效回應
依次類推,我們一個一個的發現,當最終返回的結果不是TTL失效而是ICMP Response的時候,我們的tracert也就結束了,就是這么簡單。
順便補一句ping命令還有個-n的參數指定要發包的數量,指定了這個數字就會按照你的要求來發包了而不是默認的4個包。如果使用-t參數的話,命令會一直發包直到你強行中止它。
TTL的另一解釋
TTL是IP協定包中的一個值,它告訴網路路由器包在網路中的時間是否太長而應被丟棄。有很多原因使包在一定時間內不能被傳遞到目的地。例如,不正確的路由表可能導致包的無限循環。一個解決方法就是在一段時間後丟棄這個包,然後給傳送者一個報文,由傳送者決定是否要重發。TTL的初值通常是系統預設值,是包頭中的8位的域。TTL的最初構想是確定一個時間範圍,超過此時間就把包丟棄。由於每個路由器都至少要把TTL域減一,TTL通常表示包在被丟棄前最多能經過的路由器個數。當記數到0時,路由器決定丟棄該包,並傳送一個ICMP報文給最初的傳送者。
Windows 95/98中TTL的預設值為32。有人建議當到達一個節點比較困難時,把此值設為128。ping和tracerouter都使用TTL值以嘗試到達給定的主機或跟蹤到那個主機的路由。traceroute把包的TTL值設得較小,使它在到達目的的路上被各個路由器連續的丟棄。發出包到受到返回的ICMP報文之間的時間用來計算從一個路由器到另一個路由器的時間。
使用多路復用的IP協定,TTL值表示一個包被轉發的範圍。有以下轉換:0, 限制在同一主機 1, 限制在同一子網 32, 限制在同一節點 64, 限制在同一區域(region)128,限制在同一大陸(continent)255,
由於不同的作業系統的默認TTL值不同,因此有文章說可以通過返回的TTL值判斷目標系統的類型,這是正確的,但不是TTL的功能,只是對TTL理解的一個套用。TTL的值可以修改。有些特殊的、系統(如NIDS)會定義特殊的TTL值,以拒絕非法訪問數據進入。我們在執行PING命令時可以用-i參數指定TTL值,大家可以將TTL設定為0,則該包將被立即丟棄。有時我們執行了一個PING 命令,在繁華時卻繁華了另一個地址,並帶有一個英語的提示(大致意思是TTL無效),則表示該包在到達目標之前(也就是到返回IP位置時),包所帶的TTL已經為0了或小於下一網段許可通過的TTL值了,該包已經被路由丟棄了。
鑑別作業系統
一、關於PING的介紹
PING命令來檢查要到達的目標 IP 地址並記錄結果。
ping 命令顯示目標是否回響以及接收答覆所需的時間。
如果在傳遞到目標過程中有錯誤,ping 命令將顯示錯誤訊息。
ICMP ECHO(Type 8) 和ECHO Reply (Type 0)
我們使用一個ICMP ECHO數據包來探測主機地址 HOST B 是否存活
(當然在主機沒有被配置為過濾ICMP形式)
通過簡單的傳送一個ICMP ECHO(Type 8)數據包到目標主機
如果ICMP ECHO Reply(ICMP type 0)數據包 HOST A 可以接受到,說明主機是存活狀態。
如果沒有就可以初步判斷主機沒有線上或者使用了某些過濾設備過濾了ICMP的REPLY。
+---------------------------------------------------------------+
| |
| +-------+ +-------+ |
| | | ICMP Echo Request | | |
| | HOST | --------------------------> | HOST | |
| | | | | |
| | A | | B | |
| | | ping 192.168.0.1
Pinging 192.168.0.1 with 32 bytes of data:
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Ping statistics for 192.168.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
二、注意TTL
TTL:生存時間
指定數據報被路由器丟棄之前允許通過的網段數量。
TTL 是由傳送主機設定的,以防止數據包不斷在 IP 網際網路上永不終止地循環。
轉發 IP 數據包時,要求路由器至少將 TTL 減小 1。
使用PING時涉及到的 ICMP 報文類型
一個為ICMP請求回顯(ICMP Echo Request)
一個為ICMP回顯應答(ICMP Echo Reply)
三、TTL 欄位值可以幫助我們識別作業系統類型。
UNIX 及類 UNIX 作業系統 ICMP 回顯應答的 TTL 欄位值為 255
Compaq Tru64 5.0 ICMP 回顯應答的 TTL 欄位值為 64
微軟 Windows NT/2K作業系統 ICMP 回顯應答的 TTL 欄位值為 128
微軟 Windows 95作業系統 ICMP 回顯應答的 TTL 欄位值為 32
當然,返回的TTL值是相同的
但有些情況下有所特殊
LINUX Kernel 2.2.x & 2.4.x ICMP 回顯應答的 TTL 欄位值為 64
FreeBSD 4.1, 4.0, 3.4;
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
OpenBSD 2.6, 2.7,
NetBSD
HP UX 10.20
ICMP 回顯應答的 TTL 欄位值為 255
Windows 95/98/98SE
Windows ME
ICMP 回顯應答的 TTL 欄位值為 32
Windows NT4 WRKS
Windows NT4 Server
Windows 2000
ICMP 回顯應答的 TTL 欄位值為 128
這樣,我們就可以通過這種方法來辨別
作業系統 TTL
LINUX 64
WIN2K/NT 128
WINDOWS 系列 32
UNIX 系列 255
經過測試的作業系統如下:
LINUX Kernel 2.2.x, Kernel 2.4t1-6; FreeBSD 4.1,4.0,3.4; OpenBSD 2.7,2.6; NetBSD
1.4.2; Sun Solaris 2.5.1,2.6,2.7,2.8; HP-UX 10.20, 11.0; AIX 4.1, 3.2; Compaq
Tru64 5.0; Irix 6.5.3,6.5.8; BSDI BSD/OS 4.0,3.1; ULTRIX 4.2-4.5; OpenVMS 7.1-2;
Windows 95/98/98SE/ME; Windows NT 4 Workstation SP3, SP4, SP6a; Windows NT 4
Server SP4; Windows 2000 Professional, Server, Advanced Server.
附錄
ICMP報文的類型包括如下:
ECHO (Request (Type 8), Reply (Type 0))--回顯應答,
Time Stamp (Request (Type 13), Reply (Type 14))--時間戳請求和應答,
Information (Request (Type 15), Reply (Type16))--信息請求和應答,
Address mask (Request (Type 17), Reply (Type 18))--地址掩碼請求和應答等