ping不通,找房東-----從一個ping包來解析網路轉發原理
“房東,我ping不通了”,相信在外打工租房的各位都有過這個經歷吧。ping不通,一個簡單的現象,其實蘊藏著很多的過程,今天我們就來談談,ping不通該怎麼辦。
在說這些之前,先介紹幾個概念:
1、ping包
ping包走的是ICMP協議,什麼是ICMP協議呢,Internet控制報文協議,字面意思不好理解,作用很簡單,就是傳送一些控制訊息,來檢測鏈路。
要了解一個協議,我們一般先看它是怎麼封裝的,查什麼書籍都是假的,最好的辦法就是自己去抓一個包看看,抓包的工具有很多種,我喜歡用wireshark(windows)和tcpdump(linux),抓包工具怎麼用,自行去度娘
抓到的報文如下,一步步慢慢分析:
首先是以太頭
我們知道,MAC地址是用來唯一標識網絡卡的,暫時理解為網絡卡門牌號吧。
DMAC:目的mac,也就是你的資料包要發給誰,
SMAC:源mac,你自己網絡卡的門牌號
type:資料包的型別
tips:小知識,這裡插一句,如果是三層轉發,DMAC一般是你閘道器的mac地址,如果是二層轉發,DMAC則是目的端的MAC地址,這也是區分一個數據包是二層還是三層轉發最好的方法
IP層,主要看幾個吧
dscp:最大的用處就是區分報文優先順序,我們都知道,協議報文需要高優先順序
flags:分片的標誌,下面的fragment offset是指分片的偏移量
protocol:協議型別,可以看到 我們的ping是通過icmp協議
icmp裡面比較重要的2個 type和code,以此來決定這個icmp報文是幹嘛的
這裡的type 8 code 0,是icmp request,具體這些代表什麼意思,我們可以去查RFC792
https://tools.ietf.org/html/rfc792
WHAT?什麼是RFC,我只聽過KFC,問題不大,自己去度娘
2、再來說第二個概念,ARP
ARP是什麼,地址解析,所謂的地址解析就是根據IP地址來獲取MAC地址,上面的報文你也看到了,你要ping別人,要知道別人的ip,別人的mac,發到閘道器的需要知道閘道器的mac,發到目的端的需要知道目的端的mac。
ARP的過程很簡單,客戶端先發一個arp請求,比如你知道了10.10.10.10這個ip,但是你不知道mac,你就需要發一個arp請求來獲取。
好了 我們照例抓一個包,來看看arp是怎麼工作的
arp的請求報文是一個廣播報文,所以他的dmac就是ff:ff:ff:ff:ff:ff,你知道了對方的ip,但是不知道對方的mac,所以你的target mac就填00:00:00:00:00:00就行,看上圖,這是一個arp請求報文,我想知道10.51.30.122的mac是多少。arp請求報文會在區域網廣播,如果你不是10.51.30.122,那麼你收到這個報文後,會直接丟棄不處理,如果你恰好是10.51.30.122這個ip,那麼就會做一個arp應答。
我們再來看一個arp應答報文
10.51.30.122這個地址收到arp請求後,會發一個單播報文給我,告訴我它的mac,同時他也會記錄我的mac和ip,在他那邊會儲存我的arp資訊,同時我也儲存了它的,下次我再找他,直接查arp表就可以了,不再需要再發一起ARP請求,當然,如果arp老化了,那麼這樣的流程還得再來一次咯
3、DNS
有些人喜歡ping百度,如果ping的是域名,那中間又多了一層處理,那就是域名解析,來來來,繼續抓包
可以看到 我由於不知道百度的ip是多少,所以我先發給了114.114.114.114,域名解析伺服器,他幫我解析以後再吧ip告訴我。
於是我重新封裝報文,目的ip直接選擇了216這個地址傳送了icmp request
大功告成,ping也就通了
-------------------------------------------------------------分割線----------------------------------------------------------
搞毛???文章的標題不是ping不通嗎,那你解釋一堆ping通幹什麼,其實我們從原理裡面反推一下,ping不通的理由到底有哪些嘛~ 每一個環節都檢查一遍,那麼問題不就迎刃而解了嘛~
來來來,我先來畫個圖,二層轉發不過閘道器我就不畫了,直接來一個三層轉發圖
這是一個簡單的圖,下面我來慢慢的一步步的寫下步驟,假設我就去ping百度,一般現在看自己能不能上網不都是ping百度嘛~嘿嘿~
1、首先客戶端要對百度的域名進行解析才能獲取到IP地址,才能進一步封裝自己的ping包,所以他首先發到域名伺服器(假設我配置的是114.114.114.114),等域名伺服器幫我解析好以後,給了我百度的ip地址,220.181.57.216,那麼這裡,我要去域名伺服器,我是怎麼去的呢,當然首先檢視路由表
很明顯,我沒有直接去114.114.114.114的路由,所以我只能發給閘道器,也就是上圖的192.168.0.1,由閘道器去處理(如果你不知道閘道器的mac,需要先發廣播arp給閘道器,拿到閘道器的mac來維護arp表),之後閘道器把域名解析的結果返還給我,我就有了baidu的ip地址。
2、有了目的IP,客戶端就準備封裝報文,因為是三層轉發,我不需要知道百度的mac地址,我只要知道閘道器的mac就行了,dmac=閘道器mac,dip=百度ip,直接傳送ping包,由於閘道器的mac上面已經發送過一次arp請求了,所有閘道器的arp已經儲存在客戶端的arp表了
3、資料包到了閘道器,因為是到公網去,這裡面的處理就不說了,用一條命令可以檢視你的資料包經過了多少的躍點
4、百度收到了我的ping包以後,於是如法炮製的獲取它的閘道器arp資訊,再把封裝好的icmp reply給我發了回來,等我的閘道器收到了這個reply以後,發現目的IP是我,通過路由直接轉發給了我,這裡整個過程就完成了。
tips:對於過來的資料包,閘道器會自行學習資料包的源mac資訊,維護自己的mac表和arp表
好了,如果ping不通,那麼你想想有哪些原因呢,一步步的去檢查,一步步的去抓包分析,你就能找到原因,ping不通,不用找房東,自己把網線捋一捋,不就通了啊