這個可以看到,我MTR測試百度,然后我本地網關就lost 16%

那么從圖可以判斷,我本地網出去就有點小問題,那么圖中 202.97.81.158丟包率打到了可怕的 94% OK

從圖中可以判斷到百度的IP是 14.215.177.38 我用ping命令來評測看看

又沒有問題,完全沒有丟包,這個又怎么解釋呢?

誰的拳頭大聽誰的,Ping的拳頭大,以Ping的結果為準。準確地說,Ping的結果也不是很可靠,往往提供的虛假的表面信息,并不是真實的網絡狀況,僅供真實網絡擁堵狀況的參考,而不能當作唯一的度量值。

而要透過表面現象看本質,題主需要透徹理解以下三個知識點:

  • Ping的工作原理 (ICMP Echo Request/Reply)
  • MTR的工作原理 (ICMP TTL Expired Notification )
  • CoPP (Control Plane Protection)

上文說了,Ping的拳頭(可信度)大,所以MTR與Ping自相矛盾時,以Ping為準,即題主的主機到baidu服務器的網絡沒有任何問題。否則為何Ping都通了,丟包率=0%?

可是,為何MTR在第一跳(192.168.1.1)有16%的丟包率?

第一個問題:你的Ping 14.215.177.38經沒經過第一跳(192.168.1.1)?肯定經過的吧,不可能飛毛腿過去。既然經過第一跳(192.168.1.1),第一跳丟沒丟 “Ping 14.215.177.3“報文?肯定沒丟,否則丟包率不可能=0%,對嗎?

第二個問題:“Ping 14.215.177.3“報文途徑第一跳(192.168.1.1)時,是第一跳(192.168.1.1)的硬件(芯片)轉發,還是軟件(CPU)轉發?

硬件轉發,幾乎無需CPU的介入,所以對CPU的影響可以忽略不計。

第三個問題:“MTR

14.215.177.3“報文途徑第一跳(192.168.1.1)時,為何報文的目的IP = 14.215.177.3,而不是第一跳(192.168.1.1),為何第一跳(192.168.1.1)要回復消息給題主的主機(192.168.1.x)?

因為第一跳(192.168.1.1)收到了TTL=1 的Ping 14.215.177.3,第一跳需要做TTL-1的操作。很顯然TTL -1 = 1-1=0,故第一跳(192.168.1.1)需要將這個Ping包丟棄處理,同時使用ICMP TTL Expired Error Code發消息通知源主機(192.168.1.x),源主機MTR收到這個出錯消息,就可以跟蹤第一跳(192.168.1.1)的時間統計、丟包統計等等了。

MTR可以同時發出TTL =1、2、3、4。。。 N 。。255 Ping報文,這樣就可以跟蹤第1跳、第2跳、第3跳。。。。第N跳的網絡中繼(三層Relay)設備了。

第四個問題:第一跳(192.168.1.1)處理并發出“ICMP TTL Expired Error Code“是硬件(芯片)處理,還是軟件(CPU)處理?

CPU處理,這個處理邏輯較復雜,需要CPU處理,因為要產生一個ICMP TTL

Expired Error報文,這不是硬件芯片能夠輕松勝任的。

第五個問題:如果第一跳(192.168.1.1)的CPU繁忙,無法在timeout(默認2秒)發出ICMP TTL

Expired Error報文,題主的MTR如何反應并呈現?

MTR就會認為第一跳丟包了,然后就是看到的丟包率16%。

第六個問題:第一跳(192.168.1.1)的CPU繁忙造成的ICMP TTL Expired Error丟包可以理解,可是也不會有16%那么夸張吧?

如果第一跳(192.168.1.1)不是因為繁忙,而是故意不發ICMP

TTL Expired Error,16%就很好理解了。那個第5跳的丟包率94%也容易理解了。

第七個問題:為何第一跳、第五跳故意不發ICMP TTL Expired Error報文?

因為配置了CoPP,這個CoPP聽起來很抽象,其實就是為了保護路由器的CPU不過載(Overload)。因為發ICMP

TTL Expired Error報文會消耗CPU資源,為了保護CPU,可以減少ICMP TTL Expired Error報文發送頻率。

路由器的CPU資源,主要用來處理管理平面(配置)、控制平面(路由協議等)。一旦CPU過載,會造成控制平面的(路由update)消息來不及處理而出問題。

最后,究竟MTR什么時候可以看出網絡有問題?

如果MTR從第五跳之后的丟包率都 =100%,那么第五跳到第六跳之間的鏈路出問題了。而Ping無法準確得到這個結論。

如果MTR從第五跳開始,到最后一跳的丟包率都 =94%,說明第四跳到第五跳之間可能有問題。這兩者之間可能有16條等價路徑(ECMP),其中只有一條路徑是通的,其它的15條路徑都是斷開的,只有1/16 = 6%的MTR報文到達第5跳。

當然在真實的網絡里。一般不可能有16條ECMP,但是如果有4條ECMP,上文的丟包率不是94%而是25%,那么就大約可以推斷4個ECMP中的一條斷了,因為1/4 = 25%。