TCP/IP詳解卷一06
1.ICMP(Internet控制報文協議):用來傳送差錯報文以及其他需要註意的信息,ICMP報文通常被IP層或者更高層協議(TCP或者UDP)使用,一些ICMP報文把差錯報文返回給用戶進程。同時,ICMP報文是在IP數據報內部被傳送的。
2.ICMP報文的格式:(所有報文的前4個字節都是一樣的,但是剩下的其他字節則互不相同)
類型字段(15個不同的值):以描述特定類型的ICMP報文。
檢驗和字段(覆蓋整個ICMP報文),檢驗和是必須存在的?????(理解檢驗和算法,不會)
3.ICMP報文的類型(由類型字段和代碼字段共同決定):
ICMP報文是查詢報文還是差錯報文。(當類型為17,代碼為0時表示地址掩碼請求;當地址為18,代碼為0,表示地址掩碼應答)
那些情況不會導致ICMP差錯報文:(1)ICMP差錯報文(2)目的地址時廣播地址或者多播地址(3)作為鏈路層廣播的數據報(4)不是IP分片的第一片(5)源地址不是單個主機的數據報。
4.ICMP地址掩碼請求與應答:
ICMP地址掩碼請求(用於無盤系統在引導過程中獲取自己的子網掩碼)
BOOTP協議(無盤系統獲取子網掩碼)
ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回,這樣,發送端就可以把應答與請求進行匹配。(廣播的特性:發送主機也能通過某種內部環回機制收到一份廣播報文拷貝,必須包括發送主機在內)
ICMP地址掩碼應答必須是收到請求接口的子網掩碼(這是因為多接口有不同的子網掩碼),地址掩碼來自環回接口。
5.ICMP時間戳請求與應答
ICMP時間戳請求允許系統向另一個系統查詢當前的時間。(這種ICMP報文的好處是它提供了毫秒級的分辨率而rdate只能提供秒級的分辨率),但是,調用者必須通過其他方法獲知當時的日期(缺陷)。
請求端填寫發起時間戳,然後發送報文。應答系統收到請求報文時填寫接收時間戳,在發送應答時填寫發送時間戳。
ICMP報文中:發起時間戳(orig),接收時間戳(recv)以及發送時間戳(xmit),往返時間(rtt)(往返時間的值時收到應答時間值減去發送請求時的時間值),difference的值是接收時間戳值減去發起時間戳值。
gateway(路由器)(當系統返回一個非標準時間戳值時,就用32bit時間戳中的高位來表示。)(不能計算發起時間戳和接收時間戳之間的時間差,單位不統一)
NTP(網絡時間協議)
獲取時間和日期的另一種方法:
(1)以可讀的格式返回當前的時間和日期(telnet來驗證)
(2)時間服務程序返回一個32bit的二進制數值,以秒為單位提供的日期和時間。
(3)NTP(網絡時間協議)可以保證LAN或者WAN上的一組系統的時鐘誤差在毫秒級以內。
(4)分布式時間服務(DTS)
(5)Unix系統提供守護程序timed(8),來同步局域網上的系統時鐘。
6.ICMP端口不可達差錯(ICMP查詢報文-地址掩碼和時間戳查詢及應答)
端口不可達報文(ICMP差錯報文):
在UDP中,如果收到一份UDP數據報而目的端口與某個正在使用的進程不相符,那麽UDP返回一個ICMP不可達報文。
eg:
在get命令後,一份UDP數據報就發送到主機svr4的8888端口。
在UDP數據報送到主機之前,要先發送一份ARP請求來確定它的硬件地址。接著返回ARP應答,然後才發送UDP數據報。
一個ICMP端口不可達差錯是立刻返回的。但是,TFTP似乎忽略了這個ICMP報文,然後繼續發送另一份UDP數據報。在客戶放棄之前重發了三次。
註意:ICMP報文是在主機之間交換的,而不用目的端口號,而每個20字節的UDP數據報則是從一個特定端口(2924)發送到另一個特定端口(8888)。
ICMP的一個規則是:ICMP差錯報文必須包含生成該差錯報文的數據報IP收不,還必須至少跟該IP首部後面的8個字節。
UDP首部中的內容是源端口號和目的端口號。在此時(由於將目的端口號發生了改變才會導致產生了ICMP端口不可達的差錯報文),接收ICMP的系統可以根據源端口號(2924)來將差錯報文與某個特定的用戶進程相關聯。
TFTP客戶程序所采用不太好的超時重傳算法。(沒有TCP的超時重傳好用)
7.ICMP報文的4.4BSD處理
在各個系統中,ICMP處理的方式是不相同的。
類型17,代碼0,描述:地址掩碼請求,處理方法:內核產生應答(此時由內核進行處理)
類型18,代碼0,描述:地址掩碼應答,處理方法:用戶進程(此時報文就被傳送到所有在內核中登記的用戶進程,以讀取接收到的ICMP報文;當不存在任何這樣的用戶進程,那麽報文就會被悄悄丟棄)
TCP/IP詳解卷一06