前幾天一個讀者和我聊天,談起現在的面試,有時候面試官的問題問的真的非常的刁鉆,比如:有一次三面面試官問他:當你運行 ping xxx 的時候發生了什么?搞的他一臉懵逼。。。
其實,像這類問題,是最能考查應聘者的基礎理論扎不扎實的。所以,今天民工哥就帶大家一起深入探討一下這個問題。
話不多嘮,直接上干貨?。。。?!
你知道ping命令是如何工作的嗎?
我們用來測試一臺機器與另一臺機器的網絡連通性一般會使用ping命令,那么你知道ping命令是如何工作的嗎?ping命令是基于ICMP協議工作的。
介紹 ICMP 協議
因特網控制報文協議ICMP(Internet Control Message Protocol)是一個差錯報告機制,其主要用在IP機器與路由器之間傳遞控制信息,其一般用于報告主機是否可達、路由是否可用。
為什么需要 ICMP?
在網絡數據包的傳輸過程中,經常會遇到各種各樣的問題,IP協議提供Best-Effort(盡力而為)的服務,盡力而為的意思是當網絡發生擁塞的時候,會立刻丟棄網絡數據包,一直到網絡擁塞現象減輕時。所以經常有些數據包中途被丟棄,可能還有其他更多的問題,所以需要網絡數據包在出現問題時,機器向上層協議報告異常,以便進行流量控制和差錯控制,使用ICMP就可以實現這一功能。
ICMP 的格式
上圖是ICMP的格式,IP數據報由IP頭和ICMP報文組成。ICMP報文由8位的類型、8位的代碼、16位的校驗和ICMP都數據部分組成。
ICMP的數據部分根據類型和代碼不同而不同,如果是請求與響應的數據包,那么數據部分由16位的標識符、16位的序號以及數據組成。如果是差錯報文,那么數據部分由兩個16位的unused部分和IP頭、8字節的正文組成。
查詢報文
我們的ping命令就是查詢報文,如果一切順利,我們發送8.echo請求,然后會收到0.echo響應,這就證明兩機器之間是連通的。
但是這個數據包比原生的ICMP,多了兩個字段——標識符、序號。
怎么理解呢?如果你搞過裝修,你應該知道建材店之間組成的銷售聯盟,聯盟派出去兩撥人,一批是跑業務的,一批是做廣告的,都穿著同樣的廣告衫,需要一個標識區分這兩批人。而派出去的人需要編號,如果到了吃午飯的時間,出去跑業務的20個人回來一小部分,說明情況不妙,如果全部回來,說明情況很好。
在選項數據中,ping 還會存放發送請求的時間值,來計算往返時間,說明路程的長短。
差錯報文
我們可以了解下面幾種常見的ICMP差錯報文:
3-目的不可達
4-原點抑制消息
11-ICMP超時
5-重定向
3-目的不可達
當類型3目的不可達,有以下幾種常見代碼:
出現目標網絡不可達報文的情況是數據包到達路由器,但是路由表中沒有數據包中IP地址的網絡號。
目標主機不可達報文是路由器中沒有找到目標主機的信息,也有可能是目標主機沒有連接到網絡。
目標協議不可達報文情況當你給目標主機發送UDP報文時,目標主機的防火墻禁止UDP協議數據包進入,于是ICMP通知目標協議不可達。
目標端口不可達報文是你的數據包要進入目標主機的22端口,建立SSH連接,而目標主機的22端口沒有開放,這時候ICMP就會返回目標端口不可達報文給源主機。
要求分段并設置DF flag標志報文的情況如下:源主機發送的IP數據包首部的分片禁止標志位設置為1之后,路由器遇到超過MTU大小的數據包會直接拋棄,不會分片,然后ICMP給源主機發送要求分段并設置DF flag標志報文
4-原點抑制消息
如果網絡中遇到擁塞,就能向源主機發送一個ICMP原點抑制消息,收到該消息的機器就會增大數據包的傳輸間隔。是為原點抑制。
11-ICMP超時
為了限制IP數據包在計算機網絡中的存在的時間,我們給數據包設計一個值TTL,能夠避免IP包在網絡中的無限循環和收發,節省了網絡資源。
但是為了能使IP包的發送者能收到告警消息,ICMP開始大顯身手,路由器會發送一個 ICMP 超時消息給源主機。
5-重定向
如若路由器發現源主機不是使用最優路徑發送數據,路由器就會發送重定向消息給源主機。
ping 的發送和接收過程
我們使用ping命令去請求同一個子網的目的主機。
向目的主機發送回顯請求
首先,機器會構建一個類型為8、代號為0的Echo請求報文。
通過上圖,我們可以了解,ICMP的類型是8,代碼是0等數據。
目的服務器發送回顯應答
通過比較,我們可以看到在ICMP報文層,Echo請求報文與Echo響應報文除了Type、Code(看起來沒變化,其實含義已經不同)發生變化,其他基本上都是一樣的。
源主機顯示相關信息
發送回顯請求數據包的時間,與接收到回顯應答數據包的時間差,就能計算出數據包一去一回所需要的時間。
Traceroute能夠利用ICMP的規則,故意制造一些產生錯誤的場景。
Traceroute 的第一個作用為故意設置特殊的 TTL,來追蹤去往目的地時沿途經過的路由器。
思路很騷啊~我給你慢慢道來:
先設置TTL為1,數據包到第一個路由器就嗝屁,臨死前把第一個路由器的IP搞到手了。返回時間超時的ICMP差錯報文。
然后設置TTL為2,數據包到第二個路由器嗝屁,臨死前把第二個路由器的IP搞到手。
再設置TTL為3...
以此類推,直到到達目的主機,如此就拿到了線路上所有路由器的IP。
那么Traceroute怎么知道自己發送的UDP包到達目的主機呢?
思路也很騷?。。?!
它用不可能出現的值作為UDP的端口號,數據報達到目的主機,就會返回ICMP 差錯報文,類型為端口不可達。
Traceroute 還有一個作用是故意設置不分片,從而確定路徑的 MTU。
這個很容易想到啊,一旦返回類型為“需要進行分片但設置了不分片位”的ICMP差錯報文就減小分組長度,直到達到目的主機,這不就測試出了整個路徑的MTU嗎?
審核編輯:湯梓紅
-
ICMP
+關注
關注
0文章
52瀏覽量
14923 -
Ping
+關注
關注
0文章
69瀏覽量
15974 -
命令
+關注
關注
5文章
683瀏覽量
22011 -
數據包
+關注
關注
0文章
260瀏覽量
24385 -
報文
+關注
關注
0文章
38瀏覽量
4027
原文標題:面試官:運行 ping xxx 的時候發生了什么?問倒一大片。。。
文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論