隨著云計算業(yè)務(wù)的快速發(fā)展,國內(nèi)外云計算企業(yè)的專利之爭也愈發(fā)激烈。在云計算這樣的技術(shù)領(lǐng)域,專利儲備往往代表著企業(yè)最新的技術(shù)實(shí)力。華云數(shù)據(jù)本期“智匯華云”專欄將從一個ping包來解析網(wǎng)絡(luò)轉(zhuǎn)發(fā)原理,與大家共同分享云計算領(lǐng)域的最新技術(shù)與解決方案。
背景
“房東,我ping不通了”,相信在外打工租房的各位都有過這個經(jīng)歷吧。ping不通,一個簡單的現(xiàn)象,其實(shí)蘊(yùn)藏著很多的過程,今天我們就來談?wù)?,ping不通該怎么辦。
基礎(chǔ)概念
在說這些之前,先介紹幾個概念:
1、ping包
ping包走的是ICMP協(xié)議,什么是ICMP協(xié)議呢,Internet控制報文協(xié)議,字面意思不好理解,作用很簡單,就是發(fā)送一些控制消息,來檢測鏈路。
要了解一個協(xié)議,我們一般先看它是怎么封裝的,查什么書籍都是假的,最好的辦法就是自己去抓一個包看看,抓包的工具有很多種,我喜歡用wireshark(windows)和tcpdump(linux),抓包工具怎么用,自行去度娘。
抓到的報文如下,一步步慢慢分析:
首先是以太頭
我們知道,MAC地址是用來唯一標(biāo)識網(wǎng)卡的,暫時理解為網(wǎng)卡門牌號吧。
DMAC:目的mac,也就是你的數(shù)據(jù)包要發(fā)給誰,
SMAC:源mac,你自己網(wǎng)卡的門牌號
type:數(shù)據(jù)包的類型
Tips: 小知識,這里插一句,如果是三層轉(zhuǎn)發(fā),DMAC一般是你網(wǎng)關(guān)的mac地址,如果是二層轉(zhuǎn)發(fā),DMAC則是目的端的MAC地址,這也是區(qū)分一個數(shù)據(jù)包是二層還是三層轉(zhuǎn)發(fā)最好的方法。
IP層,主要看幾個吧。
dscp:最大的用處就是區(qū)分報文優(yōu)先級,我們都知道,協(xié)議報文需要高優(yōu)先級
flags:分片的標(biāo)志,下面的fragment offset是指分片的偏移量
protocol: 協(xié)議類型,可以看到 我們的ping是通過icmp協(xié)議
icmp里面比較重要的2個 type和code,以此來決定這個icmp報文是干嘛的。
這里的type 8 code 0,是icmp request,具體這些代表什么意思,我們可以去查RFC792
https://tools.ietf.org/html/rfc792
WHAT?什么是RFC,我只聽過KFC,問題不大,自己去度娘。
2、ARP
ARP是什么,地址解析,所謂的地址解析就是根據(jù)IP地址來獲取MAC地址,上面的報文你也看到了,你要ping別人,要知道別人的IP,別人的mac,發(fā)到網(wǎng)關(guān)的需要知道網(wǎng)關(guān)的mac,發(fā)到目的端的需要知道目的端的mac。
ARP的過程很簡單,客戶端先發(fā)一個ARP請求,比如你知道了10.10.10.10這個IP,但是你不知道m(xù)ac,你就需要發(fā)一個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請求報文會在局域網(wǎng)廣播,如果你不是10.51.30.122,那么你收到這個報文后,會直接丟棄不處理,如果你恰好是10.51.30.122這個IP,那么就會做一個ARP應(yīng)答。
我們再來看一個ARP應(yīng)答報文。
10.51.30.122這個地址收到ARP請求后,會發(fā)一個單播報文給我,告訴我它的mac,同時他也會記錄我的mac和IP,在他那邊會保存我的ARP信息,同時我也保存了它的,下次我再找他,直接查ARP表就可以了,不再需要再發(fā)一起ARP請求,當(dāng)然,如果ARP老化了,那么這樣的流程還得再來一次咯。
3、DNS
有些人喜歡ping百度,如果ping的是域名,那中間又多了一層處理,那就是域名解析,來來來,繼續(xù)抓包。
可以看到 我由于不知道百度的IP是多少,所以我先發(fā)給了114.114.114.114,域名解析服務(wù)器,他幫我解析以后再把IP告訴我。
于是我重新封裝報文,目的ip直接選擇了216這個地址發(fā)送了icmp request。
大功告成,ping也就通了。
排查
搞什么??文章的標(biāo)題不是ping不通嗎,那你解釋一堆ping通干什么,其實(shí)我們從原理里面反推一下,ping不通的理由到底有哪些嘛~ 每一個環(huán)節(jié)都檢查一遍,那么問題不就迎刃而解了嘛~
來來來,我先來畫個圖,二層轉(zhuǎn)發(fā)不過網(wǎng)關(guān)我就不畫了,直接來一個三層轉(zhuǎn)發(fā)圖。
這是一個簡單的圖,下面我來慢慢的一步步的寫下步驟,假設(shè)我就去ping百度,一般現(xiàn)在看自己能不能上網(wǎng)不都是ping百度嘛。
1、首先客戶端要對百度的域名進(jìn)行解析才能獲取到IP地址,才能進(jìn)一步封裝自己的ping包,所以他首先發(fā)到域名服務(wù)器(假設(shè)我配置的是114.114.114.114),等域名服務(wù)器幫我解析好以后,給了我百度的IP地址,220.181.57.216,那么這里,我要去域名服務(wù)器,我是怎么去的呢,當(dāng)然首先查看路由表。
很明顯,我沒有直接去114.114.114.114的路由,所以我只能發(fā)給網(wǎng)關(guān),也就是上圖的192.168.0.1,由網(wǎng)關(guān)去處理(如果你不知道網(wǎng)關(guān)的mac,需要先發(fā)廣播ARP給網(wǎng)關(guān),拿到網(wǎng)關(guān)的mac來維護(hù)ARP表),之后網(wǎng)關(guān)把域名解析的結(jié)果返還給我,我就有了baidu的IP地址。
2、有了目的IP,客戶端就準(zhǔn)備封裝報文,因?yàn)槭侨龑愚D(zhuǎn)發(fā),我不需要知道百度的mac地址,我只要知道網(wǎng)關(guān)的mac就行了,dmac=網(wǎng)關(guān)mac,dip=百度IP,直接發(fā)送ping包,由于網(wǎng)關(guān)的mac上面已經(jīng)發(fā)送過一次ARP請求了,所有網(wǎng)關(guān)的ARP已經(jīng)保存在客戶端的ARP表了。
3、數(shù)據(jù)包到了網(wǎng)關(guān),因?yàn)槭堑焦W(wǎng)去,這里面的處理就不說了,用一條命令可以查看你的數(shù)據(jù)包經(jīng)過了多少的躍點(diǎn)。
4、百度收到了我的ping包以后,于是如法炮制的獲取它的網(wǎng)關(guān)ARP信息,再把封裝好的icmp reply給我發(fā)了回來,等我的網(wǎng)關(guān)收到了這個reply以后,發(fā)現(xiàn)目的IP是我,通過路由直接轉(zhuǎn)發(fā)給了我,這里整個過程就完成了。
Tips:對于過來的數(shù)據(jù)包,網(wǎng)關(guān)會自行學(xué)習(xí)數(shù)據(jù)包的源mac信息,維護(hù)自己的mac表和ARP表。
好了,如果ping不通,那么你想想有哪些原因呢,一步步地去檢查,一步步地去抓包分析,你就能找到原因,ping不通,不用找房東,自己把網(wǎng)線捋一捋,不就通了啊。
申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!