ping原理與ICMP協議

2021-08-28 06:40:53 字數 3512 閱讀 9056

ping 程式是用來探測主機到主機之間是否可通訊,如果不能ping到某台主機,表明不能和這台主機建立連線。ping 使用的是icmp協議,它傳送icmp回送請求訊息給目的主機。icmp協議規定:目的主機必須返回icmp回送應答訊息給源主機。如果源主機在一定時間內收到應答,則認為主機可達。

icmp協議通過ip協議傳送的,ip協議是一種無連線的,不可靠的資料報協議。在unix/linux,序列號從0開始計數,依次遞增。而windows ping程式的icmp序列號是沒有規律。

icmp協議在實際傳輸中資料報:20位元組ip首部 + 8位元組icmp首部+ 1472位元組《資料大小》38位元組

icmp報文格式:ip首部(20位元組)+8位型別+8位**+16位校驗和+(不同的型別和**,格式也有所不同)

ping工作過程——

假定主機a的ip位址是192.168.1.1,主機b的ip位址是192.168.1.2,都在同一子網內,則當你在主機a上執行「ping 192.168.1.2」後,都發生了些什麼呢?

首先,ping命令會構建乙個固定格式的icmp請求資料報,然後由icmp協議將這個資料報連同位址「192.168.1.2」一起交給ip層協議(和icmp一樣,實際上是一組後台執行的程序),ip層協議將以位址「192.168.1.2」作為目的位址,本機ip位址作為源位址,加上一些其他的控制資訊,構建乙個ip資料報,並在乙個對映表中查詢出ip位址192.168.1.2所對應的實體地址(也叫mac位址,熟悉網絡卡配置的朋友不會陌生,這是資料鏈路層協議構建資料鏈路層的傳輸單元——幀所必需的),一併交給資料鏈路層。後者構建乙個資料幀,目的位址是ip層傳過來的實體地址,源位址則是本機的實體地址,還要附加上一些控制資訊,依據乙太網的介質訪問規則,將它們傳送出去。

其中對映表由arp實現。arp(address resolution protocol)是位址解析協議,是一種將ip位址轉化成實體地址的協議

。arp具體說來就是將網路層(ip層,也就是相當於osi的第三層)位址解析為資料連線層(mac層,也就是相當於osi的第二層)的mac位址。

主機b收到這個資料幀後,先檢查它的目的位址,並和本機的實體地址對比,如符合,則接收;否則丟棄。接收後檢查該資料幀,將ip資料報從幀中提取出來,交給本機的ip層協議。同樣,ip層檢查後,將有用的資訊提取後交給icmp協議,後者處理後,馬上構建乙個icmp應答包,傳送給主機a,其過程和主機a傳送icmp請求包到主機b一模一樣。

即先由ip位址,在網路層傳輸,然後再根據mac位址由資料鏈路層傳送到目的主機。

前面講到了,ip協議並不是乙個可靠的協議,它不保證資料被送達,那麼,自然的,保證資料送達的工作應該由其他的模組來完成。其中乙個重要的模組就是icmp(網路控制報文)協議。

當傳送ip資料報發生錯誤--比如主機不可達,路由不可達等等,icmp協議將會把錯誤資訊封包,然後傳送回給主機。給主機乙個處理錯誤的機會,這 也就是為什麼說建立在ip層以上的協議是可能做到安全的原因。icmp資料報由8bit的錯誤型別和8bit的**和16bit的校驗和組成。而前 16bit就組成了icmp所要傳遞的資訊。

儘管在大多數情況下,錯誤的包傳送應該給出icmp報文,但是在特殊情況下,是不產生icmp錯誤報文的。如下

icmp差錯報文不會產生icmp差錯報文(除icmp查詢報文)(防止icmp的無限產生和傳送)

目的位址是廣播位址或多播位址的ip資料報。

作為鏈路層廣播的資料報。

不是ip分片的第一片。

源位址不是單個主機的資料報。這就是說,源位址不能為零位址、環迴位址、廣播地 址或多播位址。

雖然裡面的一些規定現在還不是很明白,但是所有的這一切規定,都是為了防止產生icmp報文的無限傳播而定義的。

icmp協議大致分為兩類,一種是查詢報文,一種是差錯報文。其中查詢報文有以下幾種用途:

ping查詢

子網掩碼查詢(用於無盤工作站在初始化自身的時候初始化子網掩碼)

時間戳查詢(可以用來同步時間)

而差錯報文則產生在資料傳送發生錯誤的時候。就不贅述了。

ping可以說是icmp的最著名的應用,當我們某乙個**上不去的時候。通常會ping一下這個**。ping會回顯出一些有用的資訊。一般的資訊如下:

ping這個單詞源自聲納定位,而這個程式的作用也確實如此,它利用icmp協議包來偵測另乙個主機是否可達。原理是用型別碼為0的icmp髮請 求,受到請求的主機則用型別碼為8的icmp回應。ping程式來計算間隔時間,並計算有多少個包被送達。使用者就可以判斷網路大致的情況。我們可以看到,ping給出來了傳送的時間和ttl的資料。我給的例子不太好,因為走的路由少,有興趣地可以ping一下國外的**比如sf.net,就可以觀察到一些 丟包的現象,而程式執行的時間也會更加的長。

ping還給我們乙個看主機到目的主機的路由的機會。這是因為,icmp的ping請求資料報在每經過乙個路由器的時候,路由器都會把自己的ip放到該資料報中。而目的主機則會把這個ip列表複製到回應icmp資料報中發回給主機。但是,無論如何,ip頭所能紀錄的路由列表是非常的有限。如果要觀察路由, 我們還是需要使用更好的工具,就是要講到的traceroute(windows下面的名字叫做tracert)。

traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。前面說到,儘管ping工具也可以進行偵測,但是,因為ip頭的限制,ping不能完全的記錄下所經過的路由器。所以traceroute正好就填補了這個缺憾。

traceroute的原理是非常非常的有意思,它受到目的主機的ip後,首先給目的主機傳送乙個ttl=1(還記得ttl是什麼嗎?)的udp(後面就 知道udp是什麼了)資料報,而經過的第乙個路由器收到這個資料報以後,就自動把ttl減1,而ttl變為0以後,路由器就把這個包給拋棄了,並同時產生 乙個主機不可達的icmp資料報給主機。主機收到這個資料報以後再發乙個ttl=2的udp資料報給目的主機,然後刺激第二個路由器給主機發icmp資料 報。如此往復直到到達目的主機。這樣,traceroute就拿到了所有的路由器ip。從而避開了ip頭只能記錄有限路由ip的問題。

有人要問,我怎麼知道udp到沒到達目的主機呢?這就涉及乙個技巧的問題,tcp和udp協議有乙個埠號定義,而普通的網路程式只監控少數的幾個號碼較 小的埠,比如說80,比如說23,等等。而traceroute傳送的是埠號》30000(真**)的udp報,所以到達目的主機的時候,目的主機只能傳送乙個埠不可達的icmp資料報給主機。主機接到這個報告以後就知道,主機到了。

**:

ping 原理與ICMP協議

ping 原理與icmp協議 ping的原理 ping程式是用來探測主機到主機之間是否可通訊,如果不能ping到某台主機,表明不能和這台主機建立連線。ping使用的是icmp協議,它傳送icmp回送請求訊息給目的主機。icmp協議規定 目的主機必須返回icmp回送應答訊息給源主機。如果源主機在一定時...

ping 原理與ICMP協議

ping 的原理 ping 程式是用來探測主機到主機之間是否可通訊,如果不能ping到某台主機,表明不能和這台主機建立連線。ping 使用的是icmp協議,它傳送icmp回送請求訊息給目的主機。icmp協議規定 目的主機必須返回icmp回送應答訊息給源主機。如果源主機在一定時間內收到應答,則認為主機...

ping 原理與ICMP協議

ping的原理 ping程式是用來探測主機到主機之間是否可通訊,如果不能ping到某台主機,表明不能和這台主機建立連線。ping使用的是icmp協議,它傳送icmp回送請求訊息給目的主機。icmp協議規定 目的主機必須返回icmp回送應答訊息給源主機。如果源主機在一定時間內收到應答,則認為主機可達。...