華云數據:ping不通 找房東——從一個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不通,不用找房東,自己把網線捋一捋,不就通了啊。