<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jack Jiang

    我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
    posts - 494, comments - 13, trackbacks - 0, articles - 1

    本文引用了公眾號純潔的微笑作者奎哥的技術(shù)文章,感謝原作者的分享。

    1、前言

    老于網(wǎng)絡(luò)編程熟手來說,在測試和部署網(wǎng)絡(luò)通信應(yīng)用(比如IM聊天、實(shí)時音視頻等)時,如果發(fā)現(xiàn)網(wǎng)絡(luò)連接超時,第一時間想到的就是使用Ping命令Ping一下服務(wù)器看看通不通。甚至在有些情況下通過圖形化的Ping命令工具對目標(biāo)網(wǎng)絡(luò)進(jìn)行長測(比如:《兩款增強(qiáng)型Ping工具:持續(xù)統(tǒng)計、圖形化展式網(wǎng)絡(luò)狀況 [附件下載]》、《網(wǎng)絡(luò)測試:Android版多路ping命令工具EnterprisePing[附件下載]》),可以得出當(dāng)前網(wǎng)絡(luò)通信的網(wǎng)絡(luò)延遲、網(wǎng)絡(luò)丟包率、網(wǎng)絡(luò)抖動等等有價值信息。

    Ping命令很簡單,但作為為數(shù)不多的網(wǎng)絡(luò)檢測工具,卻非常有用,是開發(fā)網(wǎng)絡(luò)應(yīng)用時最常用到的命令。雖然“Ping”這個動作這么簡單,但你知道Ping命令背后后的邏輯嗎?這就是本文要告訴你!

    學(xué)習(xí)交流:

    - 即時通訊開發(fā)交流3群:185926912 [推薦]

    - 移動端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動端IM

    (本文同步發(fā)布于:http://www.52im.net/thread-1973-1-1.html

    2、系列文章

    本文是系列文章中的第5篇,本系列大綱如下:

    腦殘式網(wǎng)絡(luò)編程入門(一):跟著動畫來學(xué)TCP三次握手和四次揮手

    腦殘式網(wǎng)絡(luò)編程入門(二):我們在讀寫Socket時,究竟在讀寫什么?

    腦殘式網(wǎng)絡(luò)編程入門(三):HTTP協(xié)議必知必會的一些知識

    腦殘式網(wǎng)絡(luò)編程入門(四):快速理解HTTP/2的服務(wù)器推送(Server Push)

    腦殘式網(wǎng)絡(luò)編程入門(五):每天都在用的Ping命令,它到底是什么?》(本文)

    3、Ping命令的作用和原理

    簡單來說,「ping」是用來探測本機(jī)與網(wǎng)絡(luò)中另一主機(jī)之間是否可達(dá)的命令,如果兩臺主機(jī)之間ping不通,則表明這兩臺主機(jī)不能建立起連接。ping是定位網(wǎng)絡(luò)通不通的一個重要手段。

    ping 命令是基于 ICMP 協(xié)議來工作的,「 ICMP 」全稱為 Internet 控制報文協(xié)議(Internet Control Message Protocol)。ping 命令會發(fā)送一份ICMP回顯請求報文給目標(biāo)主機(jī),并等待目標(biāo)主機(jī)返回ICMP回顯應(yīng)答。因?yàn)镮CMP協(xié)議會要求目標(biāo)主機(jī)在收到消息之后,必須返回ICMP應(yīng)答消息給源主機(jī),如果源主機(jī)在一定時間內(nèi)收到了目標(biāo)主機(jī)的應(yīng)答,則表明兩臺主機(jī)之間網(wǎng)絡(luò)是可達(dá)的。

    舉一個例子來描述「ping」命令的工作過程:

    1)假設(shè)有兩個主機(jī),主機(jī)A(192.168.0.1)和主機(jī)B(192.168.0.2),現(xiàn)在我們要監(jiān)測主機(jī)A和主機(jī)B之間網(wǎng)絡(luò)是否可達(dá),那么我們在主機(jī)A上輸入命令:ping 192.168.0.2;

    2)此時,ping命令會在主機(jī)A上構(gòu)建一個 ICMP的請求數(shù)據(jù)包(數(shù)據(jù)包里的內(nèi)容后面再詳述),然后 ICMP協(xié)議會將這個數(shù)據(jù)包以及目標(biāo)IP(192.168.0.2)等信息一同交給IP層協(xié)議;

    3)IP層協(xié)議得到這些信息后,將源地址(即本機(jī)IP)、目標(biāo)地址(即目標(biāo)IP:192.168.0.2)、再加上一些其它的控制信息,構(gòu)建成一個IP數(shù)據(jù)包;

    4)IP數(shù)據(jù)包構(gòu)建完成后,還不夠,還需要加上MAC地址,因此,還需要通過ARP映射表找出目標(biāo)IP所對應(yīng)的MAC地址。當(dāng)拿到了目標(biāo)主機(jī)的MAC地址和本機(jī)MAC后,一并交給數(shù)據(jù)鏈路層,組裝成一個數(shù)據(jù)幀,依據(jù)以太網(wǎng)的介質(zhì)訪問規(guī)則,將它們傳送出出去;

    5)當(dāng)主機(jī)B收到這個數(shù)據(jù)幀之后,會首先檢查它的目標(biāo)MAC地址是不是本機(jī),如果是就接收下來處理,接收之后會檢查這個數(shù)據(jù)幀,將數(shù)據(jù)幀中的IP數(shù)據(jù)包取出來,交給本機(jī)的IP層協(xié)議,然后IP層協(xié)議檢查完之后,再將ICMP數(shù)據(jù)包取出來交給ICMP協(xié)議處理,當(dāng)這一步也處理完成之后,就會構(gòu)建一個ICMP應(yīng)答數(shù)據(jù)包,回發(fā)給主機(jī)A;

    6)在一定的時間內(nèi),如果主機(jī)A收到了應(yīng)答包,則說明它與主機(jī)B之間網(wǎng)絡(luò)可達(dá),如果沒有收到,則說明網(wǎng)絡(luò)不可達(dá)。除了監(jiān)測是否可達(dá)以外,還可以利用應(yīng)答時間和發(fā)起時間之間的差值,計算出數(shù)據(jù)包的延遲耗時。

    通過ping的流程可以發(fā)現(xiàn),ICMP協(xié)議是這個過程的基礎(chǔ),是非常重要的,下面的章節(jié)會把ICMP協(xié)議再詳細(xì)解釋一下,請繼續(xù)往下讀。

    4、正確理解ICMP協(xié)議

    Ping命令所基于的ICMP協(xié)議所處的網(wǎng)絡(luò)模型層級:

    (▲ 上圖來自《計算機(jī)網(wǎng)絡(luò)通訊協(xié)議關(guān)系圖(中文珍藏版)[附件下載]》,您可下載此圖的完整清晰版)

    Ping命令這么簡單,在任何系統(tǒng)上上手就能使用,很多人可能想當(dāng)然的認(rèn)為Ping命令使用的ICMP協(xié)議應(yīng)該是基于傳輸層的TCP或UDP協(xié)議的吧。

    正如上圖所示,ICMP協(xié)議既不是基于TCP,也不是基于UDP,而是直接基于網(wǎng)絡(luò)層的IP協(xié)議,在整個網(wǎng)絡(luò)協(xié)議棧中屬于相當(dāng)?shù)讓拥膮f(xié)議了。這也從側(cè)面證明了它的重要性,因?yàn)楦鶕?jù)ICMP的RFC手冊規(guī)定:ICMP協(xié)議是任何支持IP協(xié)議的系統(tǒng)必須實(shí)現(xiàn)的,沒有余地。而IP協(xié)議是整個互聯(lián)網(wǎng)的基石,ICMP協(xié)議雖簡單,但重要性不言而喻。

    所以,以后面視的時候,如果碰到“ICMP協(xié)議是基于什么實(shí)現(xiàn)的?”這樣的問題,請一定要記往此節(jié)所講的內(nèi)容。

    5、深入ICMP協(xié)議

    我們知道,ping命令是基于ICMP協(xié)議來實(shí)現(xiàn)的。那么我們再來看下圖,就明白了ICMP協(xié)議又是通過IP協(xié)議來發(fā)送的,即ICMP報文是封裝在IP包中(如下圖所示)。

    IP協(xié)議是一種無連接的,不可靠的數(shù)據(jù)包協(xié)議,它并不能保證數(shù)據(jù)一定被送達(dá),那么我們要保證數(shù)據(jù)送到就需要通過其它模塊來協(xié)助實(shí)現(xiàn),這里就引入的是ICMP協(xié)議。

    當(dāng)傳送的IP數(shù)據(jù)包發(fā)送異常的時候,ICMP就會將異常信息封裝在包內(nèi),然后回傳給源主機(jī)。

    將上圖再細(xì)拆一下可見:

    繼續(xù)將ICMP協(xié)議模塊細(xì)拆:

    由圖可知,ICMP數(shù)據(jù)包由8bit的類型字段和8bit的代碼字段以及16bit的校驗(yàn)字段再加上選項(xiàng)數(shù)據(jù)組成。

    ICMP協(xié)議大致可分為兩類:

    1)查詢報文類型;

    2)差錯報文類型。

    【關(guān)于查詢報文類型】:

    查詢報文主要應(yīng)用于:ping查詢、子網(wǎng)掩碼查詢、時間戳查詢等等。

    上面講到的ping命令的流程其實(shí)就對應(yīng)ICMP協(xié)議查詢報文類型的一種使用。在主機(jī)A構(gòu)建ICMP請求數(shù)據(jù)包的時候,其ICMP的類型字段中使用的是 8 (回送請求),當(dāng)主機(jī)B構(gòu)建ICMP應(yīng)答包的時候,其ICMP類型字段就使用的是 0 (回送應(yīng)答),更多類型值參考上表。

    對 查詢報文類型 的理解可參考一下文章最開始講的ping流程,這里就不做贅述。

    【關(guān)于差錯報文類型】:

    差錯報文主要產(chǎn)生于當(dāng)數(shù)據(jù)傳送發(fā)送錯誤的時候。

    它包括:目標(biāo)不可達(dá)(網(wǎng)絡(luò)不可達(dá)、主機(jī)不可達(dá)、協(xié)議不可達(dá)、端口不可達(dá)、禁止分片等)、超時、參數(shù)問題、重定向(網(wǎng)絡(luò)重定向、主機(jī)重定向等)等等。

    差錯報文通常包含了引起錯誤的IP數(shù)據(jù)包的第一個分片的IP首部,加上該分片數(shù)據(jù)部分的前8個字節(jié)。

    當(dāng)傳送IP數(shù)據(jù)包發(fā)生錯誤的時候(例如 主機(jī)不可達(dá)),ICMP協(xié)議就會把錯誤信息封包,然后傳送回源主機(jī),那么源主機(jī)就知道該怎么處理了。

    6、ICMP差錯報文的妙用

    正如上一節(jié)所介紹的那樣,ICMP協(xié)議主要有:查詢報文類型和差錯報文類型兩種。對于差錯報文來說,是不是只有遇到錯誤的時候才能使用呢?不是!

    基于這個特性,Linux下的Traceroute指令(Windows下的對等指令是tracert)利于ICMP的差錯報文可以實(shí)現(xiàn)遍歷到數(shù)據(jù)包傳輸路徑上的所有路由器!這真是個有用的命令!

    百度百科上關(guān)于traceroute命令的用途:

    traceroute (Windows 系統(tǒng)下是tracert) 命令利用ICMP 協(xié)議定位您的計算機(jī)和目標(biāo)計算機(jī)之間的所有路由器。TTL 值可以反映數(shù)據(jù)包經(jīng)過的路由器或網(wǎng)關(guān)的數(shù)量,通過操縱獨(dú)立ICMP 呼叫報文的TTL 值和觀察該報文被拋棄的返回信息,traceroute命令能夠遍歷到數(shù)據(jù)包傳輸路徑上的所有路由器。

    ICMP的差錯報文的使用,使得Traceroute成為用來偵測源主機(jī)到目標(biāo)主機(jī)之間所經(jīng)過路由情況的常用工具。Traceroute 的原理就是利用ICMP的規(guī)則,制造一些錯誤的事件出來,然后根據(jù)錯誤的事件來評估網(wǎng)絡(luò)路由情況。

    traceroute的基本原理如下圖所示:

    具體做法就是:

    1)Traceroute會設(shè)置特殊的TTL值,來追蹤源主機(jī)和目標(biāo)主機(jī)之間的路由數(shù)。首先它給目標(biāo)主機(jī)發(fā)送一個 TTL=1 的UDP數(shù)據(jù)包,那么這個數(shù)據(jù)包一旦在路上遇到一個路由器,TTL就變成了0(TTL規(guī)則是每經(jīng)過一個路由器都會減1),因?yàn)門TL=0了,所以路由器就會把這個數(shù)據(jù)包丟掉,然后產(chǎn)生一個錯誤類型(超時)的ICMP數(shù)據(jù)包回發(fā)給源主機(jī),也就是差錯包。這個時候源主機(jī)就拿到了第一個路由節(jié)點(diǎn)的IP和相關(guān)信息了;

    2)接著,源主機(jī)再給目標(biāo)主機(jī)發(fā)一個 TTL=2 的UDP數(shù)據(jù)包,依舊上述流程走一遍,就知道第二個路由節(jié)點(diǎn)的IP和耗時情況等信息了;

    3)如此反復(fù)進(jìn)行,Traceroute就可以拿到從主機(jī)A到主機(jī)B之間所有路由器的信息了。

    但是有個問題是,如果數(shù)據(jù)包到達(dá)了目標(biāo)主機(jī)的話,即使目標(biāo)主機(jī)接收到TTL值為1的IP數(shù)據(jù)包,它也是不會丟棄該數(shù)據(jù)包的,也不會產(chǎn)生一份超時的ICMP回發(fā)數(shù)據(jù)包的,因?yàn)閿?shù)據(jù)包已經(jīng)達(dá)到了目的地嘛。那我們應(yīng)該怎么認(rèn)定數(shù)據(jù)包是否達(dá)到了目標(biāo)主機(jī)呢?

    Traceroute的方法是在源主機(jī)發(fā)送UDP數(shù)據(jù)包給目標(biāo)主機(jī)的時候,會設(shè)置一個不可能達(dá)到的目標(biāo)端口號(例如大于30000的端口號),那么當(dāng)這個數(shù)據(jù)包真的到達(dá)目標(biāo)主機(jī)的時候,目標(biāo)主機(jī)發(fā)現(xiàn)沒有對應(yīng)的端口號,因此會產(chǎn)生一份“端口不可達(dá)”的錯誤ICMP報文返回給源主機(jī)。

    可見Traceroute的原理確實(shí)很取巧,很有趣。如您對Traceroute感興趣,可以深入讀一讀《從Traceroute看網(wǎng)絡(luò)問題》一文。

    附錄:更多網(wǎng)絡(luò)編程精華文章

    TCP/IP詳解 - 第11章·UDP:用戶數(shù)據(jù)報協(xié)議

    TCP/IP詳解 - 第17章·TCP:傳輸控制協(xié)議

    TCP/IP詳解 - 第18章·TCP連接的建立與終止

    TCP/IP詳解 - 第21章·TCP的超時與重傳

    技術(shù)往事:改變世界的TCP/IP協(xié)議(珍貴多圖、手機(jī)慎點(diǎn))

    通俗易懂-深入理解TCP協(xié)議(上):理論基礎(chǔ)

    通俗易懂-深入理解TCP協(xié)議(下):RTT、滑動窗口、擁塞處理

    理論經(jīng)典:TCP協(xié)議的3次握手與4次揮手過程詳解

    理論聯(lián)系實(shí)際:Wireshark抓包分析TCP 3次握手、4次揮手過程

    計算機(jī)網(wǎng)絡(luò)通訊協(xié)議關(guān)系圖(中文珍藏版)

    UDP中一個包的大小最大能多大?

    P2P技術(shù)詳解(一):NAT詳解——詳細(xì)原理、P2P簡介

    P2P技術(shù)詳解(二):P2P中的NAT穿越(打洞)方案詳解

    P2P技術(shù)詳解(三):P2P技術(shù)之STUN、TURN、ICE詳解

    通俗易懂:快速理解P2P技術(shù)中的NAT穿透原理

    高性能網(wǎng)絡(luò)編程(一):單臺服務(wù)器并發(fā)TCP連接數(shù)到底可以有多少

    高性能網(wǎng)絡(luò)編程(二):上一個10年,著名的C10K并發(fā)連接問題

    高性能網(wǎng)絡(luò)編程(三):下一個10年,是時候考慮C10M并發(fā)問題了

    高性能網(wǎng)絡(luò)編程(四):從C10K到C10M高性能網(wǎng)絡(luò)應(yīng)用的理論探索

    高性能網(wǎng)絡(luò)編程(五):一文讀懂高性能網(wǎng)絡(luò)編程中的I/O模型

    高性能網(wǎng)絡(luò)編程(六):一文讀懂高性能網(wǎng)絡(luò)編程中的線程模型

    不為人知的網(wǎng)絡(luò)編程(一):淺析TCP協(xié)議中的疑難雜癥(上篇)

    不為人知的網(wǎng)絡(luò)編程(二):淺析TCP協(xié)議中的疑難雜癥(下篇)

    不為人知的網(wǎng)絡(luò)編程(三):關(guān)閉TCP連接時為什么會TIME_WAIT、CLOSE_WAIT

    不為人知的網(wǎng)絡(luò)編程(四):深入研究分析TCP的異常關(guān)閉

    不為人知的網(wǎng)絡(luò)編程(五):UDP的連接性和負(fù)載均衡

    不為人知的網(wǎng)絡(luò)編程(六):深入地理解UDP協(xié)議并用好它

    不為人知的網(wǎng)絡(luò)編程(七):如何讓不可靠的UDP變的可靠?

    網(wǎng)絡(luò)編程懶人入門(一):快速理解網(wǎng)絡(luò)通信協(xié)議(上篇)

    網(wǎng)絡(luò)編程懶人入門(二):快速理解網(wǎng)絡(luò)通信協(xié)議(下篇)

    網(wǎng)絡(luò)編程懶人入門(三):快速理解TCP協(xié)議一篇就夠

    網(wǎng)絡(luò)編程懶人入門(四):快速理解TCP和UDP的差異

    網(wǎng)絡(luò)編程懶人入門(五):快速理解為什么說UDP有時比TCP更有優(yōu)勢

    網(wǎng)絡(luò)編程懶人入門(六):史上最通俗的集線器、交換機(jī)、路由器功能原理入門

    網(wǎng)絡(luò)編程懶人入門(七):深入淺出,全面理解HTTP協(xié)議

    網(wǎng)絡(luò)編程懶人入門(八):手把手教你寫基于TCP的Socket長連接

    技術(shù)掃盲:新一代基于UDP的低延時網(wǎng)絡(luò)傳輸層協(xié)議——QUIC詳解

    讓互聯(lián)網(wǎng)更快:新一代QUIC協(xié)議在騰訊的技術(shù)實(shí)踐分享

    現(xiàn)代移動端網(wǎng)絡(luò)短連接的優(yōu)化手段總結(jié):請求速度、弱網(wǎng)適應(yīng)、安全保障

    聊聊iOS中網(wǎng)絡(luò)編程長連接的那些事

    移動端IM開發(fā)者必讀(一):通俗易懂,理解移動網(wǎng)絡(luò)的“弱”和“慢”

    移動端IM開發(fā)者必讀(二):史上最全移動弱網(wǎng)絡(luò)優(yōu)化方法總結(jié)

    IPv6技術(shù)詳解:基本概念、應(yīng)用現(xiàn)狀、技術(shù)實(shí)踐(上篇)

    IPv6技術(shù)詳解:基本概念、應(yīng)用現(xiàn)狀、技術(shù)實(shí)踐(下篇)

    從HTTP/0.9到HTTP/2:一文讀懂HTTP協(xié)議的歷史演變和設(shè)計思路

    以網(wǎng)游服務(wù)端的網(wǎng)絡(luò)接入層設(shè)計為例,理解實(shí)時通信的技術(shù)挑戰(zhàn)

    邁向高階:優(yōu)秀Android程序員必知必會的網(wǎng)絡(luò)基礎(chǔ)

    >> 更多同類文章 ……

    (本文同步發(fā)布于:http://www.52im.net/thread-1973-1-1.html



    作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
    出處:http://www.52im.net/space-uid-1.html
    交流:歡迎加入即時通訊開發(fā)交流群 215891622
    討論:http://www.52im.net/
    Jack Jiang同時是【原創(chuàng)Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
    本博文 歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    Jack Jiang的 Mail: jb2011@163.com, 聯(lián)系QQ: 413980957, 微信: hellojackjiang
    主站蜘蛛池模板: 美女被爆羞羞网站免费| 久久久青草青青亚洲国产免观| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产日产亚洲系列| 久久精品国产亚洲5555| 中字幕视频在线永久在线观看免费| 91精品国产免费久久国语蜜臀| 特级毛片A级毛片免费播放| 国产成人精品亚洲一区| 天堂亚洲免费视频| jyzzjyzz国产免费观看| 99热在线日韩精品免费| 国产亚洲蜜芽精品久久| 色婷婷综合缴情综免费观看| 又硬又粗又长又爽免费看| 一级看片免费视频| 四虎影视无码永久免费| 99爱在线精品视频免费观看9| 一级毛片高清免费播放| 国产一级在线免费观看| 午夜免费福利小电影| 嘿嘿嘿视频免费网站在线观看| 成人性生交大片免费看无遮挡| 国产美女被遭强高潮免费网站| 一级毛片直播亚洲| 日本免费观看网站| 亚洲人成网站18禁止一区| 久久被窝电影亚洲爽爽爽| 亚洲韩国在线一卡二卡| 亚洲中文字幕精品久久| 黄色大片免费网站| 国产精品亚洲一区二区无码| 久久久久久毛片免费看| 一级一看免费完整版毛片| 久久免费视频网站| 曰批全过程免费视频在线观看无码 | 亚洲国产成人资源在线软件| 亚洲精品天天影视综合网| 精品久久久久久亚洲精品| 亚洲免费人成视频观看| 亚洲精品视频在线免费|