【筆記】tcp/ip illustrated <6 ICMP>

1、參考


TCP/IP詳解 卷1:協議(英文版)

TCP/IP詳解 卷1:協議服務器

2、名詞解釋


ICMP: internet control message protocol 網絡控制消息協議
rtt:round-trip time 往返時間
NTP:network time protocol 網絡時間協議
UTC:coordinated Universal Time, 協調的統一時間
OSF: Open Software Foundation,開放軟件基金會
DCE: Distributed Computing Environment,分佈式計算環境
DTS: Distributed Time Service,分佈式時間服務網絡

3、內容


1. 概要

ICMP一般被認爲是IP層的一部分,它傳遞差錯報文和其餘須要注意的信息,IMCP消息一般由IP層或者更高層(UDP、TCP)使用,某些ICMP報文把差錯報文返回給用戶進程
ICMP消息包含於IP數據報中分佈式

clipboard.png

報文格式以下所示:
clipboard.png
全部報文的前4個字節都是相同的,剩下的其餘字節互不相同,
類型字段能夠有15個不一樣的值,描述特定類型的ICMP報文,某些ICMP報文還使用代碼字段的值進一步描述不一樣的條件,
檢驗和字段覆蓋整個ICMP報文,檢驗和是必須的spa

2. 報文類型

clipboard.png
報文中的類型字段和代碼字段共同標識一個類型,最後兩列表示ICMP報文是一份查詢報文仍是一份差錯報文,
由於差錯報文須要特殊處理,例如:對ICMP差錯報文進行響應時候,不會生成另外一份差錯報文,由於若是沒有這個限制規則,可能會遇到一個差錯產生另外一個差錯的狀況,差錯再產生差錯,將無限循環unix

發送一份ICMP差錯報文時候,報文始終包含IP的首部和產生ICMP差錯報文的IP數據報的前8個字節,這樣,接收ICMP差錯報文的模塊會把它和某個特定的協議(根據IP數據報首部中的協議字段)和用戶進程(根據包含再IP數據報的前8個字節的TCP或者UDP報文首部中的TCP或者UDP端口號)聯繫起來blog

下面的狀況都不會致使ICMP差錯報文:
(1)ICMP差錯報文(ICMP查詢報文可能致使差錯報文)
(2)目的地址是廣播地址或者多播地址的IP數據報
(3)做爲鏈路層廣播的數據報
(4)不是IP分片的第一片
(5)源地址不是單個主機的數據報(源地址不是零地址,環回地址,廣播地址,多播地址)
這些規則,爲了防止容許ICMP差錯報文對廣播分組響應帶來的廣播風暴接口

3. ICMP地址掩碼請求和應答

如上圖1七、18行,
ICMP地址掩碼請求用於無盤系統在引導程序中獲取子網掩碼,
系統廣播ICMP請求報文(和無盤系統在引導過程當中用RARP獲取IP地址是相似的),
無盤系統獲取子網掩碼的另外一個方式是BOOTP協議進程

廣播的定義是局域網上的全部主機(包含發送主機在內),當以太網驅動程序識別出目的地址是廣播地址後,就把分組送到網絡上,同時傳一份副本到環回接口ip

clipboard.png

如圖,ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回,發送端能夠經過這些值將應答和請求進行匹配ci

4. ICMP時間戳請求和應答

4.1 ICMP時間戳

類型是13或者14

ICMP時間戳請求容許系統向另外一個系統查詢當前的時間,返回的建議值是自午夜開始計算的毫秒數,協調的統一時間,
這種ICMP報文好處是提供了毫秒級的分別率,因爲返回的時間從午夜開始計算,調用者必須經過其餘方法獲知當時的日期,這是經過ICMP時間戳請求的缺陷

clipboard.png

如上圖,請求端填寫發起時間戳,發送報文,應答系統收到請求報文時候,填寫接收的時間戳,在發送應答時候填寫發送時間戳,實際上,大多數的實現將把後面的兩個字段設置成相同的值

clipboard.png

上面的程序打印出三個時間戳: 發起時間戳(orig), 接收時間戳(recv), 發送時間戳(xmit)
還能夠計算出往返時間(rtt),值是收到應答時候的時間值減去發送請求時的時間值,
difference的值是接收時間戳值減去發起時間戳值

clipboard.png

假設,咱們相信RTT的值,其一半用於請求報文的傳輸,另一半用於應答報文的傳輸,則爲了使得本機時鐘和查詢主機的始終一致,本機時鐘須要進行調整,調整值是difference 減去RTT的一半

clipboard.png

4.2 另外一種方式

還能夠用另外一種方式得到時間和日期

clipboard.png

daytime日期服務程序,以可讀格式返回當前的時間和日期,是一行ASCII字符,
time時間服務程序,返回的是一個32位的二進制數值,表示自UTC,午夜開始計算的秒數

嚴格的計時器使用網絡時間協議NTP,該協議採用先進技術保證局域網或是廣域網上的一組系統的時鐘偏差在毫秒級別之內

開放軟件基金會的分佈式計算環境定義了分佈式時間服務,也提供計算機之間的時鐘同步
unix系統提供守護程序timed, 同步局域網中的系統時鐘,不像NTP,DTS,timed服務不在廣域網範圍中工做

5.ICMP端口不可達差錯

分析端口不可達報文,以此來看一下ICMP差錯報文中的附加信息
UDP的規則之一是,若是收到一份UDP數據報,而目的端口與某個正在使用的進程不相符合,那麼UDP返回一個ICMP不可達報文,能夠用TFTP來強制生成一個端口不可達報文

clipboard.png

clipboard.png

UDP數據報發送到svr4服務器以前,須要發送一份ARP請求來肯定svr4的硬件地址,
接着ARP應答,而後發送UDP數據報
一個ICMP端口不可達差錯是馬上返回的,可是TFTP客戶端彷佛忽略了這個ICMP差錯報文,5秒中後,又發送了一份UDP數據報,在客戶端放棄UDP數據報以前重發了3次

ICMP報文是在主機之間交換的,並未指明端口號,每一個20字節的UDP數據報則從一個特定端口(2924)發送到另外一個特定端口(8888)
跟在每一個UDP後面的數字20表示UDP數據報中的數據長度(20字節包含了TFTP的2個字節操做代碼,9個字節以空字符結束的文件名temp.foo,9個字節以空字符結束的字符串netascii)

clipboard.png

由上圖,ICMP的一個規則是,ICMP差錯報文必須包括生成該差錯報文的數據報IP首部,還必須包含跟在該IP首部後面的前8個字節

包含在UDP首部中的內容是源端口號和目的端口號,因爲目的端口號(8888)致使產生了ICMP端口不可達的差錯報文,接收ICMP的系統能夠根據源端口號(2924)把差錯報文與某個特定的用戶進程相互關聯

致使差錯的數據報中IP首部要被送回的緣由是,IP首部中包含了協議字段,使得ICMP能夠知道如何解釋後面的8個字節

clipboard.png

ICMP報文不可達類型值爲3,有16種不一樣類型的ICMP不可達報文,在ICMP報文中的第二個32位必須爲0,

clipboard.png

6.ICMP報文的處理

clipboard.png

若是最後一列標識內核,標識ICMP由內核來處理若是標識用戶進程,則報文被傳送到全部在內核中登記的用戶進程,讀取收到的ICMP報文,若是不存在任何這樣的用戶進程,則報文被丟棄

相關文章
相關標籤/搜索