對于Ping的過程,你真的了解嗎?


作者:?木木匠

鏈接:https://juejin.im/post/5c15ec0f6fb9a049ec6af8b2

一、概覽

對于ping命令,想必只要是程序員都知道吧?當我們檢查網絡情況的時候,最先使用的命令肯定是ping命令吧?一般我們用ping查看網絡情況,主要是檢查兩個指標,第一個是看看是不是超時,第二個看看是不是延遲太高。如果超時那么肯定是網絡有問題啦(禁ping情況除外),如果延遲太高,網絡情況肯定也是很糟糕的。那么對于ping命令的原理,ping是如何檢查網絡的?大家之前有了解嗎?接下來我們來跟著ping命令走一圈,看看ping是如何工作的。

二、環境準備和抓包

2.1 環境準備


1、抓包工具。我這里使用Wireshark。

2、我準備了兩臺電腦,進行ping的操作。 ip地址分別為:


A電腦:192.168.2.135

mac地址:98:22:EF:E8:A8:87

B電腦:192.168.2.179

MAC:90:A4:DE:C2:DF:FE


2.2 抓包操作


打開 Wireshark,選取指定的網卡進行抓包,進行ping操作,在A電腦上ping B電腦的ip

640?wx_fmt=other
圖a


抓包情況如下:

640?wx_fmt=other

圖b


這里先簡單的介紹下Wireshark的控制面板,這個面板包含7個字段,分別是:


  • NO.編號

  • Time:包的時間戳

  • Source:源地址

  • Destination:目標地址

  • Protocol:協議

  • Length:包長度

  • Info:數據包附加信息

三、深入解析

上圖中抓包編號54-132顯示的就是整個ping命令的過程,我們知道ping命令不是依托于TCP或者UDP這種傳輸層協議的,而是依托于ICMP協議實現的, 那么什么是ICMP協議呢?這里簡單介紹下:


3.1 ICMP協議的產生背景


[RFC792]中說明了ICMP產生的原因:由于互聯網之間通訊會涉及很多網關和主機,為了能夠報告數據錯誤,所以產生了ICMP協議。也就是說ICMP協議就是為了更高效的轉發IP數據報和提高交付成功的機會。


3.2 ICMP協議的數據格式


640?wx_fmt=other
圖c

根據上圖我們知道了ICMP協議頭包含4個字節,頭部主要用來說明類型和校驗ICMP報文。下圖是對應的類型和代碼釋義列表,我們后面分析抓包的時候會用到。


640?wx_fmt=other
圖d

簡單介紹完了ICMP,那么抓包過程中出現的ARP協議是什么呢?我們同樣來簡單解釋下:


3.3 ARP協議


我們知道,在一個局域網中,計算機通信實際上是依賴于MAC地址進行通信的,那么ARP(Address Resolution Protocol)的作用就是根據IP地址查找出對應ip地址的MAC地址。


3.4 Ping過程解析


了解了上面的基礎概念后,我們來分析下抓包的數據。圖b的流程如下:


  • A電腦(192.168.2.135)發起ping請求,ping 192.168.2.179

  • A電腦廣播發起ARP請求,查詢 192.168.2.179的MAC地址。

  • B電腦應答ARP請求,向A電腦發起單向應答,告訴A電腦自己的MAC地址為90:A4:DE:C2:DF:FE

  • 知道了MAC地址后,開始進行真正的ping請求,由于B電腦可以根據A電腦發送的請求知道源MAC地址,所有就可以根據源MAC地址進行響應了。


上面的請求過程我畫成流程圖比較直觀一點:


640?wx_fmt=other


觀察仔細的朋友可能已經發現,Ping4次請求和響應結束后,還有一次B電腦對A電腦的ARP請求,這是為什么呢?這里我猜測應該是有2個原因:


1、由于ARP有緩存機制,為了防止ARP過期,結束后重新更新下ARP緩存,保證下次請求能去往正確的路徑,如果ARP過期就會導致出現一次錯誤,從而影響測試準確性。


2、由于ping命令的響應時間是根據請求包和響應包的時間戳計算出來的,所以一次ARP過程也是會消耗時間。這里提前緩存最新的ARP結果就是節省了下次ping的arp時間。


為了驗證我們的猜測,我再進行一次ping操作,抓包看看是不是和我們猜測的一樣。此時,計算機里面已經有了ARP的緩存,我們執行ARP -a 看看緩存的arp列表:


640?wx_fmt=other


我們看看第二次ping的抓包

640?wx_fmt=other


我們看到上圖中在真正ping之前并沒有進行一次ARP請求,這也就是說,直接拿了緩存中的arp來執行了,另外當B計算機進行響應之前還是進行了一次ARP請求,它還是要確認下之前的ARP緩存是否為正確的。然后結束ping操作之后,同樣在發一次ARP請求,更新下自己的ARP緩存。這里和我們的猜想基本一致。


弄懂了ping的流程之后我們來解析下之前解釋的ICMP數據結果是否和抓包的一致。 我們來點擊一個ping request看看ICMP協議詳情


640?wx_fmt=other


圖中紅框內就行ICMP協議的詳情了,這里的Type=8,code=0,校驗是正確。我們對比圖d,就知道了這是一個請求報文。我們再點擊Response frame:57,這里說明響應報文在序號57。詳情如下:


640?wx_fmt=other


上圖的響應報文,Type=0,code=0。這里知道就是響應報文了,然后最后就是根據請求和響應的時間戳計算出來的響應延遲。3379.764 ms-3376.890 ms=2.874 ms.

四、總結

我們分析了一次完整的ping請求過程,ping命令是依托于ICMP協議的,ICMP協議的存在就是為了更高效的轉發IP數據報和提高交付成功的機會。ping命令除了依托于ICMP,在局域網下還要借助于ARP協議,ARP協議能根據IP地址查出計算機MAC地址。ARP是有緩存的,為了保證ARP的準確性,計算機會更新ARP緩存。

五、參考

《計算機網絡》

TCP/IP協議之ICMPhttps://www.jianshu.com/p/8098e947e219

六、推薦閱讀

設計模式:

《Java設計模式之代理模式》https://juejin.im/post/5bf6ae0a5188256b0f582c44

《Java設計模式之模板方法模式和建造者模式》https://juejin.im/post/5bebec0de51d4534bc60ad68

《Java設計模式之單例模式》https://juejin.im/post/5bd990a05188257f863d1627

《Java設計模式之開篇》https://juejin.im/post/5bd00a586fb9a05ce46a08f4


Java集合:

《帶你走進Java集合之ConcurrentHashMap》https://juejin.im/post/5bc547435188255c53364f3e

《帶你走進Java集合之HashMap》https://juejin.im/post/5bb376dae51d456f087ba969

《帶你走進Java集合之ArrayList》https://juejin.im/post/5ba5e8506fb9a05d2b6dba46


NIO:

《JAVA NIO編程入門(一)》https://juejin.im/post/5b8a103e51882542e56e646a

《JAVA NIO編程入門(二)》https://juejin.im/post/5b947ffa6fb9a05d2b6d9a68

《JAVA NIO 編程入門(三)》https://juejin.im/post/5b9dd15ff265da0aeb70f586


Java鎖:

《ava鎖之ReentrantReadWriteLock》https://juejin.im/post/5b7a834551882542c20f1985

《Java鎖之ReentrantLock(一)》https://juejin.im/post/5b6bf4a2e51d451c4e2a8886

《Java鎖之ReentrantLock(二)》https://juejin.im/post/5b7149ad5188256148252efd



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272243.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Andropid自己定義組件-坐標具體解釋

在做一個view背景特效的時候被坐標的各個獲取方法搞暈了,幾篇抄來抄去的博客也沒弄非常清楚。 如今把整個總結一下。 事實上僅僅要把以下這張圖看明確就沒問題了。 涉及到的方法一共同擁有以下幾個: view獲取自身坐標:getLeft(),getTop(),get…

一階段結束考核題(鏈表的嵌套使用)

鏈表A,每個節點存放一個新的鏈表B1,B2,B3,B4,B5的頭結點。 場景:一個年級,相當鏈表A 該年級5個班,每個班5個人,相當于鏈表B1–B5 做一個學生成績管理系統 學生成績有語文 數學 英語 功能: 錄入成…

RocketMQ帶你快速入門

1. MQ介紹 ##1.1 為什么要用MQ 消息隊列是一種“先進先出”的數據結構 轉存失敗重新上傳取消 其應用場景主要包含以下3個方面 應用解耦 系統的耦合性越高,容錯性就越低。以電商應用為例,用戶創建訂單后,如果耦合調用庫存系統、物流系統、…

年過35歲的程序員都去哪了?一張圖道盡老程序員們的花樣出路

有人來,有人去。程序員何其多,想知道他們都去哪了嗎?對于程序員的工作出路,小編有以下幾點建議:20-27歲:技術積累階段假設本科22歲畢業,那么工作的前5年對你來說是打基礎的階段。在這5年時間里面&#xff…

em,rem

em rem 相對單位: 也可用于設置padding line-height等em相對當前容器的默認字體設置比如,所有瀏覽器默認字體都是16px,body{ font-size:62.5%}以后即1em10px; 1.2em12px 在線轉換tool: http://pxtoem.com/em(css2.0) rem(css3.0)rem相對于頁根元素的字體大小,即 ht…

分布式、高并發、多線程,到底有什么區別?

當提起這三個詞的時候,是不是很多人都認為分布式高并發多線程?當面試官問到高并發系統可以采用哪些手段來解決,或者被問到分布式系統如何解決一致性的問題,是不是一臉懵逼?確實,在一開始接觸的時候&#xf…

linux文件編程(open、write、read、creat、lseek函數)

文件編程內容比較多,如文件系統原理及訪問機制文件在內核中的管理機制,什么是文件信息節點iNode、文件共享、文件權限、各種用戶對其權限等等。以下主要記錄如何用代碼操作文件,實現文件的創建、打開、編輯等自動化執行。 文件描述符介紹、其…

記憶化搜索,FatMouse and Cheese

題目鏈接&#xff1a;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode1107 http://acm.hdu.edu.cn/showproblem.php?pid1078 1、從gird[0][0]出發&#xff0c;每次的方向搜索一下&#xff0c;每次步數搜索一下 for(i0; i<4; i) {for(j1; j<k; j){int tx…

九種跨域方式實現原理(完整版)

前言前后端數據交互經常會碰到請求跨域&#xff0c;什么是跨域&#xff0c;以及有哪幾種跨域方式&#xff0c;這是本文要探討的內容。一、什么是跨域&#xff1f;1.什么是同源策略及其限制內容&#xff1f;同源策略是一種約定&#xff0c;它是瀏覽器最核心也最基本的安全功能&a…

文件編程練習

自己實現linux CP指令 實現cp指令的思路&#xff1a; 打開要復制的原文件讀原文件的內容到buf打開或者創建要粘貼的文件將buf里面的內容寫到目標文件關閉兩個文件 main 函數的標準原型&#xff1a; main 函數的標準原型應該是 int main(int argc, char *argv[]);argc 是命令…

java.lang.OutOfMemoryError: GC overhead limit exceeded

今天現場weblogic報java.lang.OutOfMemoryError: GC overhead limit exceeded&#xff0c;在metalink查了下&#xff0c;有明白解釋&#xff0c;要設置一個JVM參數。只是因為當前weblogic內存設置為4G&#xff0c;所以設置參數的做法事實上并非解決這個問題之道。還是要分析web…

[翻譯] Visual Studio 2019 RC版發布

今天&#xff0c;我們將分享 Visual Studio 2019 的發布候選版(RC 版) - 這是在 4 月 2 日的虛擬發布活動上正式發布之前的最后步驟之一。 您可以在 visualstudio.com/downloads 下載 RC 版。與往常一樣&#xff0c;查看RC 版的發行說明以獲取更多詳細信息。發布候選版的說明在…

fread、fwrite、fopen函數的簡單使用和open、read、write區別解析

這幾個函數的區別&#xff1a;fread、fwrite、fopen和open、read、write區別解析 標準C庫函數的簡單使用 fopen函數原型&#xff1a; #include <stdio.h> FILE *fopen(const char *pathname, const char *mode);第一個參數是&#xff1a;要打開的文件路徑 第二個參數是…

docker安裝rocketmq你學會了嗎

防火墻開通端口 9876 10911 9800 firewall-cmd --zonepublic --add-port9876/tcp --permanent firewall-cmd --zonepublic --add-port10911/tcp --permanent firewall-cmd --zonepublic --add-port9800/tcp --permanent firewall-cmd --reload 創建存儲文件夾 mkdir -p /root…

程序員的編程能力與編程年齡

作者丨酷殼/陳皓&#xff0c; http://coolshell.cn/articles/10688.html程序員這個職業究竟可以干多少年&#xff0c;在中國這片神奇的土地上&#xff0c;很多人都說只能干到30歲&#xff0c;然后就需要轉型&#xff0c;就像《程序員技術練級攻略》這篇文章很多人回復到這種玩…

Rocketmq集群架構圖

集群架構圖 集群特點

進程相關概念、C程序的空間分配

進程的定義&#xff1a; “進程”是操作系統的最基本、最重要的概念之一。但迄今為止對這一概念還沒有一個確切的統一的描述。下面給出幾種對進程的定義描述。 進程是程序的一次執行。進程是可以并行執行的計算。進程是一個程序與其使用的數據在處理機上順序執行時發生的活動。…

(精)C#中TransactionScope的使用方法和原理

標簽&#xff1a;.net transactionscope原創作品&#xff0c;允許轉載&#xff0c;轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://cnn237111.blog.51cto.com/2359144/1271600在.net 1.1的時代&#xff0c;還沒有TransactionScope…

一文搞定并發面試題

1、Object 的 wait()和notify() 方法下圖為線程狀態的圖&#xff1a;Object 對象中的 wait()和notify()是用來實現實現等待 / 通知模式。其中等待狀態和阻塞狀態是不同的。等待狀態的線程可以通過notify() 方法喚醒并繼續執行&#xff0c;而阻塞狀態的線程則是等待獲取新的鎖。…