The ICMP messages typically report errors in the processing of datagrams. To avoid the infinite regress of messages about messages etc., no ICMP messages are sent about ICMP messages. Also ICMP messages are only sent about errors in handling fragment zero of fragemented datagrams. (Fragment zero has the fragment offeset equal zero).
看原文的意思,可能是希望看到 ICMP 封包中的 Type 或 Code 欄位,就知道這個 ICMP 在表達什麼,而不希望有巢狀的結構,要一層一層打開來才能看到。
Van Jacobson’s traceroute
Van Jacobson 在 1987 年開發了 traceroute 這個程式,但是受限於 RFC792 的規定,在當時大部分 router 的實作中都不會在收到 ICMP Echo Request TTL=0 的時候回送一個 ICMP Time Exceeded,導致這個程式很少能夠正常運作。
後來 Van Jacobson 將這個程式修改成 UDP 的版本,透過戳裝置上的高位 port (33434+) 回傳的 ICMP Port Unreachable 當作中止條件,並透過在每跳一個 hop 將 port number + 1 的方式來維持 sequence number,以此來解決 RFC792 的問題。
RFC1122
在 1989 年,RFC1122 重新調整了這個規範:
RFC1122 3.2.2
An ICMP error message MUST NOT be sent as the result of receiving: