<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    所謂 ICMP,不過(guò)將軍與士卒而已

    共 5438字,需瀏覽 11分鐘

     ·

    2021-08-27 21:36

    什么是 ICMP 協(xié)議

    關(guān)于這點(diǎn)我們?cè)?IP 協(xié)議那篇文章中提過(guò)一嘴,IP 協(xié)議作為一種提供不可靠數(shù)據(jù)交付的網(wǎng)絡(luò)層協(xié)議,在傳輸?shù)倪^(guò)程中,其 IP 數(shù)據(jù)報(bào)可能會(huì)發(fā)生丟失、重復(fù)、延遲和亂序等各種情況, 但是 IP 協(xié)議對(duì)這些糟糕的情況并不擁有有效的檢測(cè)和彌補(bǔ)措施,當(dāng)然更不會(huì)將這些結(jié)果通知收發(fā)雙方。

    為此,鑒于上述原因,我們?cè)跇?gòu)建 IP 網(wǎng)絡(luò)時(shí),就需要特別注意兩點(diǎn):

    • 確認(rèn)網(wǎng)絡(luò)是否能夠正常工作
    • 即使診斷出現(xiàn)異常時(shí)的原因所在

    于是,網(wǎng)際控制報(bào)文協(xié)議(Internet Control Message Protocol,ICMP)出現(xiàn)了。

    形象來(lái)說(shuō),IP 協(xié)議就好像一個(gè)將軍,而 ICMP 協(xié)議就是他手下的情報(bào)員。將軍運(yùn)籌帷幄于千里之外,而在前線(xiàn)浴血奮戰(zhàn)的士卒們傷亡當(dāng)然也在所難免。

    那無(wú)法親臨前線(xiàn)的將軍最起碼要知道兩件事情:第一點(diǎn),我的士卒們是不是按照我指引的方向在前進(jìn)著,別一陣猛沖發(fā)現(xiàn)沖錯(cuò)了地方;第二點(diǎn),我的士卒們傷亡多少,被什么所傷,了解了己方傷亡的原因才好做下一步的戰(zhàn)略部署,總不能死了個(gè)不明白。不必多說(shuō),這就是情報(bào)員 ICMP 該做的事情了。

    當(dāng)然了,上述只是打個(gè)比方,可能不是很?chē)?yán)謹(jǐn),各位知道什么意思就行,不必過(guò)于吹毛求疵。

    這里我們?cè)儆脤W(xué)術(shù)點(diǎn)的語(yǔ)言來(lái)總結(jié)下,ICMP 的主要功能有如下兩點(diǎn):

    1)確認(rèn) IP 數(shù)據(jù)報(bào)是否成功送達(dá)目標(biāo)地址

    2)如果某個(gè) IP 數(shù)據(jù)報(bào)因?yàn)槟撤N原因未能正常到達(dá)目的地,則由 ICMP 負(fù)責(zé)通知具體的原因

    ICMP 報(bào)文初探

    具體的出錯(cuò)原因是 ICMP 協(xié)議負(fù)責(zé)通知的,這個(gè)通知的學(xué)名就是 ICMP 報(bào)文,那么 ICMP 報(bào)文是由發(fā)送方發(fā)送方發(fā)出的還是由接收方發(fā)出的呢?

    都不是。

    ICMP 報(bào)文是由路由器發(fā)出來(lái)的。

    舉個(gè)例子:主機(jī) A 在不知情的情況下向主機(jī) B 發(fā)送了數(shù)據(jù)包,而主機(jī) B 正在呼呼大睡。主機(jī) A 和主機(jī) B 不在同一個(gè)局部網(wǎng)內(nèi),假設(shè)它倆之間會(huì)經(jīng)過(guò)兩個(gè)路由器,看下圖:

    眾所周知,除了 IP 地址我們還需要 MAC 地址才能確保數(shù)據(jù)包精準(zhǔn)的找到傳送方向,因此,路由器 2 為了知道主機(jī) B 的 MAC 地址,它會(huì)廣播一個(gè) ARP 請(qǐng)求報(bào)文,希望獲取到主機(jī) B 的 MAC 地址,而主機(jī) B 都關(guān)機(jī)了自然也就無(wú)法應(yīng)答這個(gè)請(qǐng)求報(bào)文了。

    為此,路由器 2 會(huì)一遍又一遍的重新發(fā)送著 ARP 請(qǐng)求報(bào)文,在多次無(wú)果后,路由器 2 就會(huì)返回一個(gè) ICMP Destination Unreachable 的包給主機(jī) A(關(guān)于 ICMP 報(bào)文類(lèi)型下文會(huì)講),通知主機(jī) A,非常遺憾,您發(fā)往主機(jī) B 的包未能成功抵達(dá)。

    那么,ICMP 報(bào)文具體是怎么傳輸給主機(jī) A 的呢?

    這個(gè)很簡(jiǎn)單,TCP/UDP 報(bào)文是怎么傳輸?shù)?,ICMP 報(bào)文就怎么傳輸。

    也就是說(shuō),真正的數(shù)據(jù)首先會(huì)被加上 ICMP 首部,封裝成 ICMP 報(bào)文,然后被 IP 協(xié)議封裝成 IP 數(shù)據(jù)報(bào)進(jìn)行明文傳輸,由 IP 協(xié)議指定源 IP 地址和目的地址。主機(jī) A 收到數(shù)據(jù)后會(huì)一層一層解封裝,從而獲得真正的數(shù)據(jù)得知發(fā)生異常的原因,遂大怒一聲:蠢貨主機(jī) B。

    ICMP 報(bào)文格式

    至此,各位已經(jīng)知道了,ICMP 報(bào)文是被封裝在 IP 數(shù)據(jù)報(bào)里面的,我們來(lái)看看下圖:

    額,這里好像沒(méi)啥好說(shuō)的,上圖畫(huà)的很 Nice ,是我之前考研的時(shí)候看 B 站上的王道視頻截下來(lái)的,各位看明白上圖,了解 ICMP 報(bào)頭有哪些東西,知道類(lèi)型代碼這兩個(gè)字段很重要就好了,尤其是類(lèi)型這個(gè),接下來(lái)我們先重點(diǎn)講它。

    ICMP 報(bào)文類(lèi)型

    上文提到了 ICMP Destination Unreachable,也就是目標(biāo)不可達(dá)的 ICMP 報(bào)文。

    ICMP 報(bào)文類(lèi)型大體上可以分為兩種,差錯(cuò)報(bào)文和詢(xún)問(wèn)報(bào)文,解釋一下:

    所謂查詢(xún)報(bào)文就是,用于主機(jī)進(jìn)行診斷的查詢(xún)消息。

    這么學(xué)術(shù)性的文字可能不是很好理解,這樣,咱形象來(lái)說(shuō),查詢(xún)報(bào)文其實(shí)和通信異常沒(méi)啥關(guān)系,查詢(xún)報(bào)文就好比將軍率領(lǐng)著千軍萬(wàn)馬來(lái)到了一片寂靜的峽谷,正是一個(gè)容易被埋伏的地方,將軍不敢貿(mào)然前進(jìn),于是派遣幾個(gè)情報(bào)員前去探明敵情,一有動(dòng)靜立馬回報(bào)。

    常見(jiàn)的 ICMP 查詢(xún)報(bào)文類(lèi)型有以下幾種:

    • 回送應(yīng)答(Echo Reply),對(duì)應(yīng) ICMP 報(bào)文首部類(lèi)型字段的值:0
    • 回送請(qǐng)求(Echo Request),對(duì)應(yīng) ICMP 報(bào)文首部類(lèi)型字段的值:8

    而差錯(cuò)報(bào)文就是,用于通知主機(jī)出錯(cuò)的原因。顯然,ICMP 差錯(cuò)報(bào)告報(bào)文是伴隨著出錯(cuò)數(shù)據(jù)產(chǎn)生的。一旦 IP 協(xié)議發(fā)現(xiàn)某個(gè) IP 數(shù)據(jù)報(bào)出錯(cuò)了,首先就會(huì)毅然地丟棄出錯(cuò)的這個(gè) IP 數(shù)據(jù)報(bào),然后發(fā)送 ICMP 差錯(cuò)報(bào)文

    常見(jiàn)的 ICMP 差錯(cuò)報(bào)文類(lèi)型有以下幾種:

    • 目標(biāo)不可達(dá)(Destination Unreachable),對(duì)應(yīng) ICMP 報(bào)文首部類(lèi)型字段的值:3
    • 原點(diǎn)抑制(Source Quench),對(duì)應(yīng) ICMP 報(bào)文首部類(lèi)型字段的值:4
    • 重定向或改變路由(Redirect),對(duì)應(yīng) ICMP 報(bào)文首部類(lèi)型字段的值:5
    • 超時(shí)(Time Exceeded),對(duì)應(yīng) ICMP 報(bào)文首部類(lèi)型字段的值:11

    下面詳細(xì)解釋一下這幾個(gè)常見(jiàn)的 ICMP 報(bào)文類(lèi)型。

    ICMP 回送消息(類(lèi)型 0、8)

    用于進(jìn)行通信的主機(jī)或路由器之間,判斷所發(fā)送的數(shù)據(jù)包是否已經(jīng)成功到達(dá)對(duì)端的一種消息。

    可以向?qū)Χ酥鳈C(jī)發(fā)送 ICMP 回送請(qǐng)求的消息(Echo Request,類(lèi)型 8),也可以接收對(duì)端主機(jī)發(fā)回來(lái)的 ICMP 回送應(yīng)答消息(Echo Reply,類(lèi)型 0)

    我們常用的 ping 命令就是基于 ICMP 回送消息實(shí)現(xiàn)的。

    ping 這個(gè)單詞源自聲納定位,而這個(gè)命令的作用也確實(shí)如此,它發(fā)送類(lèi)型為 0 的 ICMP Echo Request 消息,收到請(qǐng)求的主機(jī)則用類(lèi)型為 8 的 ICMP Echo Reply 消息進(jìn)行回應(yīng)。ping 就會(huì)計(jì)算發(fā)送 Requenst 和接收到 Reply 的消息間隔時(shí)間,并計(jì)算有多少個(gè)包被送達(dá),丟失了多少個(gè)包等。用戶(hù)就可以據(jù)此判斷網(wǎng)絡(luò)大致的情況。

    如下圖我們來(lái) ping 一下 Github:

    ping 也并不是啥事也沒(méi)做,它在 ICMP 報(bào)文格式中又添加了兩個(gè)字段:標(biāo)識(shí)符和序號(hào)。這倆其實(shí)很好理解:

    1)標(biāo)識(shí)符用來(lái)區(qū)分是哪個(gè)應(yīng)用程序發(fā) ICMP 包。

    形象來(lái)說(shuō),將軍派出了兩個(gè)情報(bào)員,一個(gè)用來(lái)是了解戰(zhàn)況的,一個(gè)是用來(lái)搬救兵的,那總得有個(gè)標(biāo)識(shí)區(qū)分這倆情報(bào)員吧。標(biāo)識(shí)符就是干這事的。最容易想到的能作為標(biāo)識(shí)符的東西,想來(lái)也不用我多嘴吧,就是進(jìn)程的 PID。

    2)序號(hào)用來(lái)確認(rèn)網(wǎng)絡(luò)包是否有丟失。

    形象來(lái)說(shuō),將軍派出了 10 個(gè)情報(bào)員,給每個(gè)情報(bào)員都編個(gè)號(hào)。這樣,如果派出去 10 個(gè),回來(lái) 10 個(gè),就說(shuō)明前方戰(zhàn)況不錯(cuò);如果派出去 10 個(gè),一個(gè)也沒(méi)回來(lái)或者就回來(lái) 1 個(gè),說(shuō)明情況不妙啊。

    ICMP 目標(biāo)不可達(dá)消息(類(lèi)型 3)

    路由器無(wú)法將 IP 數(shù)據(jù)報(bào)發(fā)送給目標(biāo)地址時(shí),會(huì)給發(fā)送端主機(jī)返回一個(gè)目標(biāo)不可達(dá)(Destination Unreachable Message)的 ICMP 消息。

    那目標(biāo)不可達(dá)有多種可能的原因,比如說(shuō)網(wǎng)絡(luò)問(wèn)題、目標(biāo)主機(jī)問(wèn)題等等,所以這個(gè)目標(biāo)不可達(dá)消息還需要指明不可達(dá)的具體原因,這個(gè)具體原因就記錄在 ICMP 報(bào)頭的代碼字段。

    那么這里我們?nèi)匀灰孕熊姶驊?zhàn)的例子來(lái)看看常見(jiàn)的目標(biāo)不可達(dá)類(lèi)型的代碼有哪些:

    1)前方戰(zhàn)事吃緊,將軍(主機(jī) A)派了一隊(duì)士兵回京城找皇上(主機(jī) B)搬救兵,中途情報(bào)員快馬加鞭趕到匯報(bào):將軍,我們?cè)谕局忻允Я朔较?,找不到京城在哪。這就是網(wǎng)絡(luò)不可達(dá),其代碼為 0

    2)假設(shè)士兵們成功回到京城,但是皇上出城了,不在京城,朝廷百官也不敢私自同意出兵救援。這就是主機(jī)不可達(dá),到了地方卻沒(méi)找到人,其代碼為 1

    3)假設(shè)士兵成功找到了京城,但是由于將士們常年在外征戰(zhàn),守城的年輕護(hù)衛(wèi)們已經(jīng)不認(rèn)識(shí)這些威名赫赫的將士們了,所以需要進(jìn)城口令證明身份,但是久經(jīng)沙場(chǎng)的將士們一時(shí)半會(huì)想不起來(lái)這些東西,遂無(wú)法進(jìn)城。這就是協(xié)議不可達(dá),其代碼為  2

    4)假設(shè)士兵們成功進(jìn)了城,也成功面見(jiàn)了圣上,但是皇上卻說(shuō)密偵司告訴他的情報(bào)和你們說(shuō)的不一樣,你們說(shuō)你們需要的是救兵,而我得到的消息是你們只需要糧草。這就是端口不可達(dá),其代碼為 3

    5)假設(shè)士兵們成功求得了救兵,并且獲得了火器十余箱,但是中途山路狹窄,裝火器的馬車(chē)太大過(guò)不去,為此需要換小一點(diǎn)的馬車(chē),每個(gè)馬車(chē)裝一點(diǎn),但是由于火器技術(shù)尚不成熟,考慮安全問(wèn)題,將軍早就嚴(yán)令禁止把火器分裝。于是乎,浩浩蕩蕩的援兵阻塞在了狹窄的山路。這就是需要進(jìn)行分片但設(shè)置了不分片位,其代碼為 4

    ICMP 重定向消息(類(lèi)型 5)

    說(shuō)到這個(gè),我們先要明白 IP 協(xié)議或者網(wǎng)絡(luò)層的職責(zé)是什么,就是選擇合適的網(wǎng)間路由和交換結(jié)點(diǎn), 確保數(shù)據(jù)的及時(shí)傳送。

    為此,我們總是傾向于基于最短最優(yōu)的路徑進(jìn)行傳輸。

    那么如果路由器發(fā)現(xiàn)發(fā)送端主機(jī)使用了某個(gè)不是最優(yōu)的路徑發(fā)送數(shù)據(jù),他就會(huì)返回一個(gè) ICMP 重定向消息(ICMP Redirect Message)給這個(gè)主機(jī),并且,在這個(gè)消息中包含了最優(yōu)的路由信息和源數(shù)據(jù)。

    寫(xiě)上癮了哈哈,舉個(gè)例子:將軍得知 ICMP 的情報(bào)后震怒,派出去搬救兵的領(lǐng)隊(duì)竟然帶著十萬(wàn)救兵在繞彎子,亂臣賊子,將軍趕緊下令誅殺這個(gè)領(lǐng)隊(duì)并立即走最近的路趕回來(lái)。

    ICMP 超時(shí)消息(類(lèi)型 11)

    IP 包中有一個(gè)字段叫做 TTLTime To Live,生存周期),它的值隨著每經(jīng)過(guò)一次路由器就會(huì)減 1,直到減到 0 時(shí)該 IP 包會(huì)被丟棄。

    此時(shí),IP 路由器將會(huì)發(fā)送一個(gè) ICMP 超時(shí)消息(ICMP Time Exceeded Message)給發(fā)送端主機(jī),并通知該包已被丟棄。

    形象來(lái)說(shuō),就是將軍派出去的搬救兵的那隊(duì)人馬苦于找不到京城的方向,路途開(kāi)始帶上的只夠三天的糧草斷盡,全隊(duì)飲恨而死。

    設(shè)置 IP 包生存周期的主要目的,是為了在路由控制遇到問(wèn)題發(fā)生循環(huán)狀況時(shí),避免 IP 包無(wú)休止地在網(wǎng)絡(luò)上被轉(zhuǎn)發(fā)。

    ICMP 的應(yīng)用

    其中一個(gè)應(yīng)用 ping 命令我們已經(jīng)說(shuō)過(guò)了,它是基于 ICMP 查詢(xún)報(bào)文的。

    還有一個(gè)命令,是基于 ICMP 差錯(cuò)報(bào)文的,在 Linux 下這條命令是 traceroute,在 Windows 是 tracert。

    大家可能會(huì)覺(jué)得 ICMP 差錯(cuò)報(bào)文是只有在通信異常的時(shí)候才會(huì)生成,其實(shí)不然,traceroute 命令就是一個(gè)例外,它會(huì)使用 ICMP 的規(guī)則,故意制造一些能夠產(chǎn)生異常的場(chǎng)景。

    traceroute 命令有兩大作用:

    1)故意設(shè)置特殊的 TTL,來(lái)追蹤去往目的主機(jī)上沿途經(jīng)過(guò)的路由器。

    具體來(lái)說(shuō),就是發(fā)送端主機(jī)會(huì)不斷的向接收端主機(jī)發(fā)送 UDP 報(bào)文,UDP 報(bào)文被封裝成 IP 數(shù)據(jù)報(bào),同時(shí)將 TTL 從 1 開(kāi)始按照順序遞增。

    比如說(shuō),將 TTL 設(shè)置 為 1,那么遇到第一個(gè)路由器的時(shí)候,這個(gè) IP 數(shù)據(jù)報(bào)就會(huì)被丟棄,接著返回 ICMP 差錯(cuò)報(bào)文,類(lèi)型是 ICMP 超時(shí)消息。

    接下來(lái)將 TTL 設(shè)置為 2,第一個(gè)路由器過(guò)了,遇到第二個(gè)路由器時(shí)這個(gè) IP 數(shù)據(jù)報(bào)就會(huì)被丟棄,接著返回ICMP 差錯(cuò)報(bào)文。

    ......

    這樣,traceroute 就拿到了所有路由器 IP。

    那到這里其實(shí)還有一個(gè)問(wèn)題,怎么知道數(shù)據(jù)到底有沒(méi)有到達(dá)目的主機(jī)呢?

    traceroute 是基于 UDP 傳輸?shù)?,那自然是需要指定一個(gè)端口號(hào)的,traceroute 會(huì)選擇一個(gè)不可能的值作為 UDP 的端口號(hào)。

    這樣,當(dāng)數(shù)據(jù)到達(dá)目的主機(jī)時(shí),就會(huì)發(fā)現(xiàn)端口對(duì)不上,于是路由器會(huì)產(chǎn)生一份 ICMP 目標(biāo)不可達(dá)消息,其代碼是 3,即端口不可達(dá)。

    當(dāng)發(fā)送端主機(jī)接收這份端口不可達(dá)的 ICMP 報(bào)文時(shí),就知道目的主機(jī)成功收到了數(shù)據(jù)。

    2)故意設(shè)置不分片,從而確定路徑的最大傳輸單元 MTU。

    某些情況下我們并不知道路徑的 MTU 大小,所以我們需要某種手段去獲取 MTU,才能控制發(fā)送的數(shù)據(jù)包的大小。

    發(fā)送端主機(jī)要做的工作很簡(jiǎn)單,就是像往常一樣發(fā)送 IP 數(shù)據(jù)報(bào),但是將 IP 首部的分片禁止標(biāo)志位置為 1。

    這樣,如果 IP 數(shù)據(jù)報(bào)的長(zhǎng)度超過(guò)了 MTU,該數(shù)據(jù)報(bào)會(huì)被路由器直接丟棄,并且給發(fā)送端主機(jī)發(fā)送 ICMP 目標(biāo)不可達(dá)消息,其代碼為 4,即需要進(jìn)行分片但設(shè)置了不分片位

    這樣,發(fā)送端主機(jī)每次收到 ICMP 需要進(jìn)行分片但設(shè)置了不分片位消息時(shí)就減小 IP 數(shù)據(jù)報(bào)的長(zhǎng)度,直到順利到達(dá)目標(biāo)主機(jī)。



    • 博主小碩在讀,深耕 Java,目前在維護(hù)一個(gè)教程類(lèi)倉(cāng)庫(kù) CS-Wiki「Gitee 官方推薦項(xiàng)目,現(xiàn)已 1.6k+ star,倉(cāng)庫(kù)地址:https://gitee.com/veal98/CS-Wiki」,公眾號(hào)上的文章也會(huì)在此同步更新,歡迎各位前來(lái)交流學(xué)習(xí)。
    • 準(zhǔn)備春招秋招的小伙伴可以參考我的這個(gè)論壇項(xiàng)目 Echo「Gitee 官方推薦項(xiàng)目,現(xiàn)已 700+ star,倉(cāng)庫(kù)地址:https://gitee.com/veal98/Echo」。配套教程正在同步更新中,公眾號(hào)后臺(tái)回復(fù) "Echo" 即可免費(fèi)獲取。
    • 另外,雖然現(xiàn)在本號(hào)仍然很小,不過(guò)我還是建了一個(gè)交流群『小牛肉和它的小伙伴們』,感興趣的各位可以下方掃碼加我微信回復(fù) "進(jìn)群",我拉你進(jìn)群:

    瀏覽 67
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    久久国产小视频 | 婷婷色在线视频观看 | 女人一级毛片内射 | 无码豆花视频 | 久久网站又改成什么 |