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