ICMP:Internet控制報文協議。是IP層的組成部分。傳遞差錯報文或其他信息。
ICMP報文被封裝在IP數據報內部:
詳細格式例如以下所看到的:
個字段含義例如以下:
- 8位類型。
表示該ICMP報文的含義,如目的不可達、超時、請求回顯等。
- 8為代碼。進一步描寫敘述該ICMP報文。ICMP報文的類型由類型字段和代碼字段共同決定。
- 16位檢驗和。和IP首部檢驗和的算法同樣。
我們常常使用的ping程序就是基于ICMP報文進行的傳輸。
pingclient發送一個ICMP回顯請求報文,server收到此報文后返回一個ICMP回顯應答報文作為應答。client和server都是在內核層發送和接受該報文的,而不是通過用戶進程。回顯請求和回顯應答報文格式例如以下:
類型0 + 代碼0 = 回顯應答
類型8 + 代碼0 = 回顯請求
ICMP回顯請求和回顯應答報文多出了幾個特有的字段:
- 標識符。表示發送進程的ID號。
- 序號。從0開始,每發送一個新的回顯請求就加1.
- 選項數據。實際載荷,比如保存發送時間,接收端用當前時間減去發送時間就能計算出往返時間。
以下是抓包的結果:
client一共向server發送了4個回顯請求。
TTL字段是在IP首部中的。因為ICMP屬于IP層協議,而IP層又是不可靠、無連接、盡力而為式的傳輸。所以ping偶爾會出現傳輸出錯的情況。
參考:
《TCP/IP具體解釋》第6章、第7章。