渣碩筆記——偶讀《TCP/IP詳解:卷1 協議》 關於IP路由選項和時間戳選項
最近在看hidden router的一篇論文,講到用IP時間戳選項來解決這個問題。。發現自己對這方面瞭解太少,於是打開了這本著作,開始挑選相應章節學習一下。
一、自然要先從IP報文格式先了解起。
背景知識:如圖所示,報文格式。首部長度這一個字段僅有4個bit,因此整個IP頭部的長度最大隻能達到15*32bit=60B,其中固定頭部長度爲20B。選項數據最多佔據40字節,是可變長的部分。
這些任選項可以用於以下定義:
1. 安全和處理限制。。。太高端了,暫時不管
2. 記錄路徑(RR,記錄經過的路由器IP地址)
3. 時間戳(記錄經過的路由IP和時間)
4. 寬鬆源站選路(Strict Source Route,爲數據報文指定一系列必須經過的IP地址)
5. 嚴格路由選路(Loose Source Route,類似strict,只能經過要求經過的IP地址)
二、記錄路由選項
對於記錄路由來說,選項數據的格式如下:
其中3B的RR選項,4*9B=36B的IP地址清單列表空間,最後剩餘1B全爲0,被解釋爲EOL。
各字段意義:
1. code表示IP選項數據的類型,對於記錄路由來說,CODE=7.
2. Ptr指針字段,ptr指向了存放下一個IP地址的位置。最小值爲4,表示第一個IP存放開始的位置,每次存入一個IP後,ptr+=4;直至ptr=40,表示IP清單已滿。
3. Len,一般寫36或40。
這樣,我們現在就可以感受一下記錄選項了。
Ping–R xxx
可以看到從本機到百度服務器的路由路徑,可惜路徑太長,記錄不完全。
要注意,RR中的IP記錄的是數據包到達路由器後被轉發出去的口,第一個IP記錄的就是自己主機的出口IP,當數據包到達目的地時,DEST回覆的ICMP ECHO REPLY包會把之前的路由清單抄進去,然後發送出去,當reply包到達SRC主機時,也會把自己進入主機的IP端口地址加入到清單裏面去。
不過我爲了找一個比較近的目標進行ping,選擇了附近網段的目標x.x.108.200,結果出現了點詭異。x.x.108.200數據同時記錄了2次。。。
繼續測試,對自己本機進行測試,發現本機IP竟然出現4次:
暫時不曉得爲啥。。。改天再說吧。
其中書上其實也提到了一個異常的輸出情況,如下: SRC-->X1(IP1)-->X2(IP2)-->DEST-->Gateway(IP3)-->X2(IP2’)-->X1(IP1’)-->SRC
可以看到,中間多了個gateway,作者分析是由於dest在回覆ICMP ECHO REPLY時,SRC的地址不在本機的路由表裏,這種情況下會把數據包發給網關,網關幫忙把包再發送給下一跳。
三、時間戳選項
與記錄路由選項很相似。格式如下圖
Code=0x44。Len和ptr同RR。
OF和FL各佔4bit。
FL表示標誌字段,即指定了時間戳選項對應的操作:0只記時間戳,1記錄IP和時間戳,3發送包之前對選項列表進行了初始化,總共存放了4對IP和值爲0的時間戳,僅噹噹前路由器與列表中的下一個IP匹配時,才修改時間戳的值。
OF表示溢出,當列表已滿但打開了記錄時間戳選項時,路由器會將OF的值增加,最大值爲15。
時間戳的取值:一般是自UTC午夜開始記的毫秒數,如果路由器不使用這個格式,就需要打開時間戳中的高位以表明這個是非標準值。數據部分最多放9個時間戳。
總的來說,最多隻能記錄24hop
下面是ping –T的選項。
-T [ping only]: 發送IP時間戳選項。
-T tsonly 只有時間戳
-T tsandaddr 時間戳和地址
-T tsprespec host1 [host2 [host3 [host 4]]] 預指定跳數的時間戳
下面來直接地感受一下吧~ ping –T tsandaddr www.baidu.com結果如下:
可以看到,在ping發出的多個ICMP包,收到的7個ICMPecho reply包中,顯然每個只記錄了4對地址和時間戳~。
並顯示未記錄的跳數爲15。
然而令人不解的是每一跳所採用的時間戳的值是如何變化的。
第一跳記錄的都是本機的時間戳,absolute的(不是很懂)。
幾分鐘後對其進行再次探測,結果如下圖
對比發現,
本機的時間戳值有明顯的增加;
第二跳時間戳基本無變化。。。
第三跳、第四跳時間戳同上
這說明?他們不是標準的時間戳設置方法?
而且根據規定,“需要打開時間戳中的高位以表明這個是非標準值”,但根據本次探測的結果感覺貌似沒有做到。。。。104276高位爲0? 一會爲 -1 一會爲0的 何解?求指點