Internet控制報文協議
與IP結合使用,以便提供與IP協議層配置和IP數據包處置相關的診斷和控制信息。
常被人為是在網絡層,但實際上該協議通過ip協議傳輸。但確切的說他位于網絡層和傳輸層之間的。
ICMP報文可有網絡層,傳輸層或者用應用觸發(fā)執(zhí)行。并不能為ip層提供可靠性,只能表明某些類別的故障和配置信息。
丟包不會觸發(fā)ICMP報文。
報文

上面的圖貌似不準確啊。
頭部屬于IP頭部,然后后面跟地址之類的啊。
然后才是ICMP報文

ICMP報文使用的是IP報文封裝,在IP頭部協議號為1。
IP報文的數據部分為ICMP報文。
其種類型和代碼從下表中查詢:

當發(fā)送一個ICMP差錯報文,它包含了一個完整的源自引起差錯的數據報IP頭部副本(即生成導致錯誤的數據報的IP頭部,包括任何IP選項),再加上原始數據報的IP有效載荷區(qū)中的任何其他數據,同時要確保生成的IP/ICMP的數據報的大小不會超過一個特定的值。IPv4,這個值是576字節(jié)。
ICMP報文處理
當接收到ICMP報文時,如果是請求類的報文被操作系統(tǒng)自動處理。
而差錯類報文則傳遞個傳輸層處理。
當接收到ICMP重定向報文時,主機更新路由表。
ICMP差錯報文
盡管在大多數情況下,錯誤的包傳送應該給出ICMP報文,但是在特殊情況下,是不產生ICMP錯誤報文的。如下:
ICMP差錯報文不會產生ICMP差錯報文(出IMCP查詢報文)(防止IMCP的無限產生和傳送)
目的地址是廣播地址或多播地址的IP數據報。
作為鏈路層廣播的數據報。
不是IP分片的第一片。
源地址不是單個主機的數據報。這就是說,源地址不能為零地址、環(huán)回地址、廣播地 址或多播地址。
上面的規(guī)則都是為了防止ICMP數據包無限重復。
限制生成ICMP差錯報文的原因是限制生成所謂的廣播風暴。
重定向
當一個路由器收到一個來自主機的數據報,當他發(fā)現發(fā)送方應該有更好的投遞或者跳轉ip時,會向發(fā)送方發(fā)送重定向報文,并將數據報投遞到正確的路由。
主要是在一個子網中存在兩個路由器,而發(fā)送方第一跳的路由不是最佳選擇時,路由器會發(fā)送該報文。
發(fā)送方接收到重定向報文,然后更新自己的路由表。
重定向報文

ICMP查詢報文
目前唯一保存下來的廣泛使用的ICMP查詢/信息類報文是回顯請求/應答報文,通常稱為ping,以及路由器發(fā)現報文。
ICMP協議不像傳輸層協議那樣有端口號。
所以區(qū)別不同進城的ping。
linux中,發(fā)送進程的進程ID通常被放置在標識符字段。
window中不知道放的是什么玩意。
在window下兩個cmd進行ping

該字段放的應該是區(qū)分線程的,(同一個cmd不同時間的ping不同,因為ping以后fork了一個單獨的進城)。
圖中66,和61,為發(fā)送順序,接受時會帶有該序號。
還可以ping廣播地址,能用于快速廣播本主機系統(tǒng)的ARP表。
響應的目標系統(tǒng)位于同一個子網內時,將會觸發(fā)ARP請求查找請求發(fā)送者的鏈路層地址。這么做,將會在每個響應者和請求發(fā)送者之間交換。這也導致回顯請求報文的發(fā)送者學習所有響應者的鏈路層地址。
IPv4的路由器發(fā)現
也是采用ICMP來實現的。
TTL= 1 ,這樣路由器會返回超時。
路由器發(fā)現的主要目的是讓一臺主機學習到它所在的本地子網中的所有路由器,因此它能夠從中選擇一臺作為默認路由