ICMP 可靠性
假設有人發送一個 UDP 數據包,就像
traceroute
實現一樣。該數據包的 IP 標頭中的 TTL 為 1,導致第一個路由器將其丟棄並生成一個 ICMP Time Exceeded 回复給發送者。路由器是否保證發送方收到它生成和發送的 ICMP Time Exceeded 錯誤消息?
ICMP 是在 UDP 之上實現的嗎?如果是,是否有任何錯誤控制機製作為 ICMP 的一部分實施?
我想要一個非常基本的簡單答案,我只是想我會以幾種方式解決這個問題,這樣會更清楚。
ICMP 不是 UDP,它實際上甚至不是 IP。它是 IP 旁邊的另一個 OSI 第 3 層協議(網路層)。也就是說,它在數據包的開頭有一個 IP 兼容的標頭。
不能保證 ICMP 數據包將被傳遞。它與 Internet 上的任何其他數據包具有相同的傳遞保證:無。沒有嘗試確保它被傳遞,沒有重試機制,但在 IP 標頭和 ICMP 標頭中都有一個校驗和。更高級別的協議應重試發送產生錯誤的數據包,這將導致生成另一個超時數據包,最終發送者將收到其中一個。
http://www.networksorcery.com/enp/protocol/icmp.htm有一個範例 ICMP 標頭(封裝在與 IP 標頭相同的內容中)和有關不同類型的 ICMP 消息的資訊。
鑑於人們對這篇文章投反對票和誤解,我會澄清一下:
IP是網際網路的通用語。數據包按其 IP 標頭路由。對於大多數應用程序級通信,協議封裝在 IP(TCP、UDP、SCTP 等)中。
當 IP 層通信出現問題時,您如何進行通信?ICMP 用於此。您可以在 IP 中傳達 IP 層錯誤嗎?這是一個先有雞還是先有蛋的問題,正如 RFC 所指出的那樣,它變得很混亂。ICMP報文有一個IP頭,為它們保留了一個IP協議,但ICMP是IP層協議,並不是沒有封裝在IP包裡面。因此,我認為它是與 IP 一起使用的協議。
我們可以整天爭論“ICMP 是否是 IP”,但我最多承認的是,是的,它是 IP,“有點”。