1. 程式人生 > >二層三層網路協議-ICMP和ping

二層三層網路協議-ICMP和ping

 

ICMP協議
Internet Control Message Protocol 網際網路控制報文協議

協議型別如下

 

ping程式主要是使用了ICMP協議裡面的 echo request,echo reppply型別



查詢和應答報文,會有一個標示符,標識本次的ping程式的id
還有一個序列號,表示傳送報文的序號,比如傳送一個2號探測包,那麼就要收到一個2號回覆包
ping程式裡面還有時間戳,用來計算這個報文從傳送到收到用了多長時間


此外還有差錯報文,根據不同的型別區分
終點不可達3,終點不可達還可以細分為
1)網路不可達,找不到地方
2)主機不可達,找不到對應的主機
3)協議不可達,目標主機的支援的協議不對應
4)埠不可達,目標埠沒開放
5)需要進行分片但設定了不分片位


源站抑制,也就是讓源站放滿傳送速度
超時,也就是超過網路包的生存時間但還沒達到
路由重定向

ping協議的截圖如下:

 

ping協議的接收和傳送過程

這是最簡單的情況,如果跨網段,經過了路由器,還會繼續轉發
但對於ping程式來說,就是一個傳送,收到的過程,中間經過了那些地方他並不知道
可以使用 tcpdump -i ech0 icmp 來檢視icmp的收發過程

 

 

traceroute協議
這個協議利用了icmp的規則,故意製造了一些能夠產生錯誤的場景
ping程式從A -> B,中間經過了哪些他是不知道的,而traceroute將TTL設定成了1,icmp資料包經過了路由之後就會變成TTL=0,產生一個錯誤,於是就返回了,這樣就可以知道中間某個路由的了
接著繼續設定TTL=2,TTL=3
traceroute每次傳送的探測包的時候,故意將埠設定成很大,這個資料包如果真的達到了目標主機後,就會返回一個埠不可達的錯誤,於是traceroute就知道到目的地了

如果資料包沒達到,這可能是超時了

 

traceroute還有一個作用是 故意設定不分片,從而確定路徑的MTU

traceroute第一個分組長度正好跟出口的MTU相等,如果中間遇到窄的關口被卡主,就會返回ICMP網路差錯包,於是traceroute就減小分組的長度,直到能到大目標主機為止

 

traceroute  baidu的結果

 

tcpdump  traceroute 的結果

 

 

 

 

 

 

參考

維基百科ICMP協議

ICMP詳解