摘要:協(xié)議全稱,指互聯(lián)網(wǎng)控制報文協(xié)議。對的主動請求,進行網(wǎng)絡抓包,稱為。小兵報告,大帥,送給張將軍的糧草沒有送到。接收后檢查數(shù)據(jù)幀,將數(shù)據(jù)包從幀中提取處理,交給本機的層。檢查完成后,提取有用的信息交給協(xié)議。
????日常開發(fā)中,我們經(jīng)常會碰到查詢網(wǎng)絡是否暢通以及域名對應 IP 地址等小需求,這時候用的最多的應該就是 ping 命令了。 那你知道 ping 命令是怎么工作的嗎?今天,我們就來一起認識下 ping 命令及其對應的 ICMP 協(xié)議。
ICMP 協(xié)議????ICMP 全稱 Internet Control Message Protocol,指互聯(lián)網(wǎng)控制報文協(xié)議。
????網(wǎng)絡本身是不可靠的,數(shù)據(jù)包在傳輸過程中,可能會發(fā)生很多突發(fā)事件并導致數(shù)據(jù)傳輸失敗。而網(wǎng)絡層的 IP 協(xié)議是一個無連接的協(xié)議,它不會處理網(wǎng)絡層的故障,因此,我們需要其它的協(xié)議,在數(shù)據(jù)包傳輸出現(xiàn)故障時,能將故障信息傳回來,這樣才能對應處理相關問題。
????就像在電視劇里看到的古代戰(zhàn)爭一樣,打仗的時候需要通過斥候來傳遞戰(zhàn)局情況,進而更好的控制戰(zhàn)局。而 ICMP 報文在網(wǎng)絡世界中就充當“斥候”這樣的角色。
????ICMP 報文是封裝在 IP 包里面的。因為傳輸指令的時候,肯定需要源地址和目標地址。它本身格式非常簡單,如下圖:
????ICMP 報文有很多的類型,不同的類型有不同的代碼,最常用的類型是主動請求,代碼為 8,主動請求的應答,代碼為 0。從大的方面看可以分為 查詢報文類型和差錯報文類型。
查詢報文類型????我們經(jīng)常在電視劇里聽到這樣的話:來人,前方戰(zhàn)事如何?斥候回來沒?一有情況,立刻通報。
????類似這種主帥發(fā)起,主動查看敵情的情況,就對應著 ICMP的查詢報文類型。例如,常見的 ping 命令就是查詢報文,是一種主動請求,并且獲得主動應答的 ICMP 協(xié)議。因此,ping 命令發(fā)出的包也是符合 ICMP 協(xié)議格式的,只不過它在后面增加了自己的格式。
????對 ping 的主動請求,進行網(wǎng)絡抓包,稱為 ICMP ECHO REQUEST。同理,主動請求的回復,稱為ICMP ECHO REPLY。比起原生的 ICMP,這里面多了兩個字段,一個是標識符,另一個是序號。這不難理解,大帥派出去兩隊斥候,一隊是找誰要的,一隊是偵查戰(zhàn)況的,要有個標識才能區(qū)分。
????另一方面,派出去的斥候,都要編個號。如果派出去 10 個,回來 10 個,就說明前方戰(zhàn)況不錯。如果派出去 10 個,回來 2 個,就說明情況可能不妙。
????在選項數(shù)據(jù)中,ping 還會存放發(fā)送請求的時間值,來計算往返時間,說明路程的長短。
差錯報文類型????差錯報文主要是用來將發(fā)送的出錯報文相關信息返回到源設備,以供源設備確定如果更好的重發(fā)失敗的數(shù)據(jù)包。
????還是拿我們的“大帥”舉例。
????當主帥正在大帳中看地圖,思考戰(zhàn)事時,外面的小兵突然喊到:大帥,不好啦,張將軍遭遇埋伏,全軍覆沒了。
????這種是異常情況發(fā)起的,來報告發(fā)生了不好的事情,對應 ICMP 的差錯報文。
????差錯報文有以下常用的類型:
3:終點不可達
4:源抑制
5:重定向
11:超時
????第一種情況終點不可達。小兵報告,大帥,送給張將軍的糧草沒有送到。
????那大帥肯定會問,為啥沒有送到?這就對應 ICMP 中的以下代碼了。
網(wǎng)絡不可達代碼:0
主機不可達代碼:1
協(xié)議不可達:2
端口不可達:3
需要進行分片但設置了不分片:4
????具體的場景就像這樣:
網(wǎng)絡不可達:大帥,找不到地方
主機不可達:大帥,找到地方,沒找到張將軍
協(xié)議不可達:大帥,找到地方,也找到人了,但是口令沒對上。
端口不可達:大帥,找到地方,找到了人,也對上了口令,但事情沒對上。我去送糧草,人家說在等救兵。
需要進行分片但設置不分片:大帥,走到一半,山路狹窄,想換瞎扯,但是出發(fā)前你下令嚴禁換小車,就沒辦法送到了。
????第二種是源站抑制。也就是讓源站放慢發(fā)送速度(小兵:大帥,糧草送的太多了吃不完,你可以慢點送)。
????第三種是時間超時。也就是超過網(wǎng)絡包的生存時間還是沒到目的地(大帥,送糧草的人都把糧食吃完了,還沒到地方,已經(jīng)餓死了)。
????第四種是路由重定向。也就是下次發(fā)給另一個路由器(大帥,上次送糧草的人本來只要走大王村,一公里就到了,結果非要繞道張家界,多了五公里,下次記得走大王村)。
????差錯報文的結構相對復雜一些。除了前面還是 IP,ICMP 的前 8 個字節(jié)不變,后面則跟上出錯的那個 IP 包的 IP 頭和 IP 正文的前 8 個字節(jié)。
????而且這類斥候特別盡責,不但字節(jié)返回來報信,還把一部分遺物帶回來。
斥候:大帥,張將軍已經(jīng)戰(zhàn)死沙場,這是他的印信和佩劍。
大帥:張將軍是怎么死的(可以查看 ICMP 的前 8 字節(jié))?沒錯,這是張將軍的劍(IP 數(shù)據(jù)包的頭及正文前 8 字節(jié))。
ping:查詢報文類型的使用????接下來,我們重點來看 ping 命令的發(fā)送和接收過程。
????假定主機 A 的 IP 地址是 192.168.1.1,主機 B 的 IP 地址是 192.168.1.2,它們都在同一個子網(wǎng)。那么,當在主機 A 上運行“ping 192.168.1.2” 后,會發(fā)生什么呢?
源主機構建 ICMP 請求數(shù)據(jù)包。這個數(shù)據(jù)包內包含多個字段。最重要的有兩個,一個是類型字段,對應請求數(shù)據(jù)包而言,該字段為 8。另一個是順序號,主要用于區(qū)分連續(xù) ping 的時候發(fā)出的多個數(shù)據(jù)包。每發(fā)出一個請求數(shù)據(jù)包,順序號會自動加 1.為了能夠計算往返時間 RTT,它會在報文的數(shù)據(jù)部分插入發(fā)送時間。
IP 層構建 IP 數(shù)據(jù)包。ICMP 協(xié)議將數(shù)據(jù)包連同目標 IP 一起交給 IP 層,IP 層將以 192.168.1.2 作為目的地址,本機 IP 地址作為源地址,加上其他控制信息,構建一個 IP 數(shù)據(jù)包。
加入 MAC 頭。找到 192.168.1.2 對應的 MAC 地址,附加上一些控制信息,依據(jù)以太網(wǎng)的介質訪問規(guī)則,將它們傳送出去。
????主機 B 收到數(shù)據(jù)幀后,會進行如下步驟:
檢查 MAC 地址,丟棄或接收數(shù)據(jù)幀,提取 IP 數(shù)據(jù)包。檢查數(shù)據(jù)包目的 MAC 地址,并與本機 MAC 地址對比。如符合,就接收數(shù)據(jù)幀,否則就丟棄。接收后檢查數(shù)據(jù)幀,將 IP 數(shù)據(jù)包從幀中提取處理,交給本機的 IP 層。
IP 層檢查IP。檢查完成后,提取有用的信息交給 ICMP 協(xié)議。
構建 ICMP 應答包。應答數(shù)據(jù)包的類型字段為 0,順序號為接收到的請求數(shù)據(jù)包中的順序號。
將應答數(shù)據(jù)包發(fā)給主機 A。
????在規(guī)定的時間內,源主機如果沒有接到 ICMP 的應答包,則說明目標主機不可達。
????如果接收到了應打包,則說明目標主機可達。此時,源主機會檢測時間延遲。就是用當前時刻減該數(shù)據(jù)包從源主機發(fā)出去的時刻。
????當然,這只是最簡單的,同個局域網(wǎng)的情況。如果跨網(wǎng)段的話,還會涉及網(wǎng)關的轉發(fā)、路由器的轉發(fā)等。
????可以看出,ping 命令是使用了 ICMP 里面的 ECHO REQUEST 和 ECHO REPLY 類型。
????那其它類型呢?是不是只有真正遇到錯誤的時候,才能收到?答案是否定的。有一個 Traceroute 命令,它會使用 ICMP 的規(guī)則,故意制造一些能夠產(chǎn)生錯誤的場景。
Traceroute:差錯報文類型的使用????Traceroute 命令有兩個比較常用的功能。
????第一個功能:
????通過設置特殊的 TTL,追蹤去往目的地時經(jīng)過的路由器
????Traceroute 的參數(shù)執(zhí)行某個目的 IP 地址,會發(fā)送一個 UDP 的數(shù)據(jù)包。
????將 TTL 設置成 1 時,表示這個數(shù)據(jù)包的 MP 為 1,碰到第一個“攔路虎”(通常是路由器或一個其它類型的關卡)就會陣亡了,然后就會返回一個 ICMP 包,這個包就是 網(wǎng)絡差錯包,類型是時間超時。
????通過差錯包,我們就能得到數(shù)據(jù)包到第一個關卡時花費的時間及其每個關卡的 IP 地址(有的主機不會響應 ICMP,所以會出現(xiàn)請求時全是 * 的情況)。
????那怎么知道 UDP 有沒有到達目的主機呢?Traceroute 程序會發(fā)送一份 UDP 數(shù)據(jù)包給目的主機,但它會選擇一個不可能的值作為 UDP 端口號(大于30000)。當該數(shù)據(jù)報到達目的主機時,由于找不到對應端口號,所以會返回一個“端口不可達”的錯誤報文。這樣,我們就知道 UDP 是否到達主機了。
????第二個功能:
????設置數(shù)據(jù)包不分片,確定路徑的 MTU
????發(fā)送分組,并設置“不分片”標志。發(fā)送的第一個分組的長度正好與出口的 MTU 相等。如果中間遇到窄的關卡就會被卡主,返回 ICMP 網(wǎng)絡差錯包,類型是“需要進行分片但設置了不分片”。就這樣,每次收到ICMP“不能分片”差錯時就減小分組的長度,從而確定整個路徑中的 MTU。
總結ICMP 相當于網(wǎng)絡世界的偵察兵。常用的有兩種類型,主動探查的查詢報文和異常報告的差錯報文。
ping 命令使用查詢報文,Traceroute 命令使用差錯報文。
參考:
劉超-趣談網(wǎng)絡協(xié)議系列課;
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29650.html
摘要:協(xié)議全稱,指互聯(lián)網(wǎng)控制報文協(xié)議。對的主動請求,進行網(wǎng)絡抓包,稱為。小兵報告,大帥,送給張將軍的糧草沒有送到。接收后檢查數(shù)據(jù)幀,將數(shù)據(jù)包從幀中提取處理,交給本機的層。檢查完成后,提取有用的信息交給協(xié)議。 ????日常開發(fā)中,我們經(jīng)常會碰到查詢網(wǎng)絡是否暢通以及域名對應 IP 地址等小需求,這時候用的最多的應該就是 ping 命令了。 那你知道 ping 命令是怎么工作的嗎?今天,我們就來一...
摘要:函數(shù)實現(xiàn)基于上述原理,首先,需要創(chuàng)建一個與協(xié)議關聯(lián)的套接字,并設置超時以控制用于接收數(shù)據(jù)包的時間套接字。創(chuàng)建套接字后,需要實現(xiàn)一個函數(shù)來構建,打包并將數(shù)據(jù)包發(fā)送到目標主機。套接字將一直等待,直到收到數(shù)據(jù)包或達到超時限制。 最后一次更新于 2019/07/10 ICMP Ping 目的 此任務是重新創(chuàng)建第3講(延遲,丟失和吞吐量)中討論的ping客戶端。Ping 是一個用于在計算機網(wǎng)絡中...
閱讀 2365·2023-04-25 20:07
閱讀 3303·2021-11-25 09:43
閱讀 3662·2021-11-16 11:44
閱讀 2529·2021-11-08 13:14
閱讀 3178·2021-10-19 11:46
閱讀 895·2021-09-28 09:36
閱讀 2975·2021-09-22 10:56
閱讀 2374·2021-09-10 10:51