ping的工作原理
ping是基于ICMP(Internet Control Message Protocol)協(xié)議工作的,首先熟悉一下ICMP協(xié)議
互聯(lián)網(wǎng)控制報文協(xié)議
ICMP功能:確認IP包是否成功送達目標地址,報告發(fā)送過程中IP包被廢棄的原因和改善網(wǎng)絡(luò)設(shè)置等。
ICMP 的這種通知消息會使用 IP 進行發(fā)送 。
ICMP報文是封裝在IP包里的,工作在網(wǎng)路層,是IP協(xié)議的助手。
ICMP 包頭的類型字段,大致可以分為兩大類:
- 一類是用于診斷的查詢消息,也就是「查詢報文類型」
- 另一類是通知出錯原因的錯誤消息,也就是「差錯報文類型」
查詢報文類型
回送消息用于進行通信的主機或路由器之間,判斷所發(fā)送的數(shù)據(jù)包是否已經(jīng)成功到達對端的一種消息,ping命令就是利用這個消息實現(xiàn)的。
可以向?qū)Χ酥鳈C發(fā)送回送請求的消息(8),也可以接收對端主機發(fā)送回來的回送應(yīng)答(0)。
相比于原生ICMP,這里多兩個字段:
- 標識符:用以區(qū)分是哪個應(yīng)用程序發(fā)ICMP包,比如用進程PID作為標識符;
- 序號:序列號從0開始,每發(fā)送一次新的回送請求就會加1,用來確認網(wǎng)絡(luò)包是否丟失;
選項數(shù)據(jù)中,ping還會存放發(fā)送請求的時間值,來計算往返時間,說明路程長短。
差錯報文類型
目標不可達消息 —— 類型 為 3
原點抑制消息 —— 類型 4
重定向消息 —— 類型 5
超時消息 —— 類型 11
目標不可達消息
網(wǎng)絡(luò)不可達 0 :IP地址是分為網(wǎng)絡(luò)號和主機號的,所以當(dāng)路由器中的路由器表匹配不到接收方IP的網(wǎng)絡(luò)號
主機不可達 1 :路由器表中沒有該主機的信息或主機沒有連接到網(wǎng)絡(luò)
協(xié)議不可達 2:主機使用TCP協(xié)議訪問對端主機時,能找到對端的主機了,但是對端主機防火墻禁止TCP協(xié)議訪問,會通過ICMP協(xié)議以協(xié)議不可達的原因告知主機
端口不可達 3:對端主機沒有進程監(jiān)聽8080端口
重定向消息
路由器發(fā)送端主機使用不是最優(yōu)的路徑發(fā)送數(shù)據(jù),那么它會返回一個ICMP重定向消息給這個主機,在這個消息中包含了最合適的路由消息和源數(shù)據(jù)。
超時消息
IP包中有一個字段叫做TTL(生存周期),它的值隨著每經(jīng)過一次路由器就會減1,直到減到0時該IP包會被丟棄。設(shè)置 IP 包生存周期的主要目的,是為了在路由控制遇到問題發(fā)生循環(huán)狀況時,避免 IP 包無休止地在網(wǎng)絡(luò)上被轉(zhuǎn)發(fā)。
查詢報文類型的使用
同個子網(wǎng)下的主機 A 和 主機 B,主機 A 執(zhí)行ping 主機 B 后,我們來看看其間發(fā)送了什么?
ping命令執(zhí)行的時候,源主機首先會構(gòu)建一個ICMP回送請求消息數(shù)據(jù)包。
ICNO數(shù)據(jù)包內(nèi)包含多個字段,最重要的兩個是:
- 類型 8
- 序號 用來區(qū)分連續(xù)ping的時候發(fā)出的多個數(shù)據(jù)包 每發(fā)送一個請求數(shù)據(jù)包序號就會自動加1
然后,由 ICMP 協(xié)議將這個數(shù)據(jù)包連同地址 192.168.1.2 一起交給 IP 層。IP 層將以 192.168.1.2 作為目的地址,本機 IP 地址作為源地址,協(xié)議字段設(shè)置為 1 表示是 ICMP 協(xié)議,再加上一些其他控制信息,構(gòu)建一個 IP 數(shù)據(jù)包。
接下來,需要加入 MAC 頭。如果在本地 ARP 映射表中查找出 IP 地址 192.168.1.2 所對應(yīng)的 MAC 地址,則可以直接使用;如果沒有,則需要發(fā)送 ARP 協(xié)議查詢 MAC 地址,獲得 MAC 地址后,由數(shù)據(jù)鏈路層構(gòu)建一個數(shù)據(jù)幀,目的地址是 IP 層傳過來的 MAC 地址,源地址則是本機的 MAC 地址;還要附加上一些控制信息,依據(jù)以太網(wǎng)的介質(zhì)訪問規(guī)則,將它們傳送出去。
主機 B 收到這個數(shù)據(jù)幀后,先檢查它的目的 MAC 地址,并和本機的 MAC 地址對比,如符合,則接收,否則就丟棄。
接收后檢查該數(shù)據(jù)幀,將 IP 數(shù)據(jù)包從幀中提取出來,交給本機的 IP 層。同樣,IP 層檢查后,將有用的信息提取后交給 ICMP 協(xié)議。
主機 B 會構(gòu)建一個 ICMP 回送響應(yīng)消息數(shù)據(jù)包,回送響應(yīng)數(shù)據(jù)包的類型字段為 0,序號為接收到的請求數(shù)據(jù)包中的序號,然后再發(fā)送出去給主機 A。
在規(guī)定的時候間內(nèi),源主機如果沒有接到 ICMP 的應(yīng)答包,則說明目標主機不可達;如果接收到了 ICMP 回送響應(yīng)消息,則說明目標主機可達。
此時,源主機會檢查,用當(dāng)前時刻減去該數(shù)據(jù)包最初從源主機上發(fā)出的時刻,就是 ICMP 數(shù)據(jù)包的時間延遲。
整個流程
可以看出 ping 這個程序是使用了 ICMP 里面的 ECHO REQUEST(類型為 8 ) 和 ECHO REPLY (類型為 0)。文章來源:http://www.zghlxwxcb.cn/news/detail-698333.html
差錯報文類型的使用
traceroute 192.168.1.100
traceroute 的第一個作用就是故意設(shè)置特殊的 TTL,來追蹤去往目的地時沿途經(jīng)過的路由器。
原理:利用 IP 包的生存期限 從 1 開始按照順序遞增的同時發(fā)送 UDP 包,強制接收 ICMP 超時消息的一種方法。
比如,將 TTL 設(shè)置 為 1,則遇到第一個路由器,就犧牲了,接著返回 ICMP 差錯報文網(wǎng)絡(luò)包,類型是時間超時。
接下來將 TTL 設(shè)置為 2,第一個路由器過了,遇到第二個路由器也犧牲了,也同時返回了 ICMP 差錯報文數(shù)據(jù)包,如此往復(fù),直到到達目的主機。這樣的過程,traceroute 就可以拿到了所有的路由器 IP。
traceroute 還有一個作用是故意設(shè)置不分片,從而確定路徑的 MTU。這樣做的目的是為了路徑MTU發(fā)現(xiàn)。
它的工作原理如下:
首先在發(fā)送端主機發(fā)送 IP 數(shù)據(jù)報時,將 IP 包首部的分片禁止標志位設(shè)置為 1。根據(jù)這個標志位,途中的路由器不會對大數(shù)據(jù)包進行分片,而是將包丟棄。
隨后,通過一個 ICMP 的不可達消息將數(shù)據(jù)鏈路上 MTU 的值一起給發(fā)送主機,不可達消息的類型為「需要進行分片但設(shè)置了不分片位」。
發(fā)送主機端每次收到 ICMP 差錯報文時就減少包的大小,以此來定位一個合適的 MTU 值,以便能到達目標主機。文章來源地址http://www.zghlxwxcb.cn/news/detail-698333.html
到了這里,關(guān)于ping協(xié)議(ICMP)的原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!