網(wǎng)絡(luò)問題定位方法

轉(zhuǎn)載自: https://mp.weixin.qq.com/s/an373dQGF68zRhXb4qTAXg

運(yùn)維中有個(gè)詞叫根故障定位笼吟,實(shí)際生產(chǎn)中很多異常的根故障最后都會定位到網(wǎng)絡(luò)這一層强经。下面以Broken Pipe為例榔至,簡述一下如何進(jìn)行網(wǎng)絡(luò)問題的定位贫贝。

1. 定位思路

第一眼看異常棧直譯過來就是管道破裂疹蛉,為什么會出現(xiàn)管道破裂呢训唱?這篇文章就由此而來昌讲,背后牽涉的是我們常常掛在嘴邊饶火,面試也經(jīng)常被問的http 和 tcp 協(xié)議的知識贯要,這里埋個(gè)伏筆暖侨,后面我們由淺入深,慢慢把這個(gè)問題解決崇渗,同時(shí)了解如何運(yùn)用網(wǎng)絡(luò)知識解決實(shí)際網(wǎng)絡(luò)問題字逗。

2. 開始抓包

遇到網(wǎng)絡(luò)問題,自然而然會想到使用tcpdump進(jìn)行抓包宅广,看看傳輸過程到底發(fā)生了什么葫掉。抓包命令如下:

tcpdump tcp port 20004 and host  **.**.com -w brokenpipe.cap

這條命令監(jiān)聽20004端口,把所有的主機(jī)和域名都抓下來跟狱,保存到brokenpipe.cap文件中俭厚。

常用的tcpdump命令 tcpdump tcp port 端口號 and host 域名 -w 保存文件

3. 在Wireshark數(shù)據(jù)包中看三次握手

如果沒有用過Wireshark 做過網(wǎng)絡(luò)包分析的,擔(dān)心直接上來就看包分析有點(diǎn)費(fèi)勁驶臊,下面會對wireshark 先做個(gè)簡單的介紹挪挤。

3.1 Wireshark 簡介

首先,把抓下來的包文件存在本地关翎, 打開wireshark 導(dǎo)入網(wǎng)絡(luò)包扛门,開始有趣的網(wǎng)絡(luò)漫游之旅。

wireshark 是一款非常流行的網(wǎng)絡(luò)包分析工具纵寝,經(jīng)常是網(wǎng)絡(luò)工程師/后端工程師用來分析網(wǎng)絡(luò)包论寨,解決網(wǎng)絡(luò)問題的利器。先放一張圖出來聞聞味:

截了一張自己本機(jī)裝的 wireshark 軟件爽茴,分為四個(gè)部分:

  • 頂部是菜單欄
  • 淺綠色背景是過濾器葬凳,這個(gè)對于分析包很重要,后面會講
  • 列表那一欄是包列表信息
  • 最下面的這個(gè)是包詳細(xì)信息室奏,包含各層協(xié)議的內(nèi)容(應(yīng)用層火焰、傳輸層、網(wǎng)絡(luò)層胧沫、數(shù)據(jù)鏈路層昌简、物理層)

[圖片上傳失敗...(image-1cde73-1591322222101)]

3.2 Wireshark 過濾器

過濾器單獨(dú)拿出來說下,因?yàn)榇_實(shí)很有用琳袄,后面異常分析會用到江场。

你導(dǎo)入的包可能內(nèi)容很多纺酸,需要使用過濾器篩選一下窖逗,過濾器很多種過濾的規(guī)則,我列舉一下常用的幾種:

  • 協(xié)議過濾

如果抓的包有很多種協(xié)議類型餐蔬,可以輸入 tcp 回車只看tcp 協(xié)議的包

  • IP 過濾

例如 ip.src == 192.168.1.23 (過濾發(fā)起地址ip)ip.dst == 12.8.0.1(過濾目標(biāo)地址ip) ip == 12.0.0.1(過濾源或目的地址)

  • 端口過濾

tcp.port == 4980 碎紊, 還可以 tcp.port == 4542 or tcp.port == 4528 加入表達(dá)式 and佑附、or、in 等等

例如:tcp.port in {80 443 8080}

  • HTTP 模式過濾

http.request.method == "GET" 或者 http.request.method == "POST"

  • 報(bào)文內(nèi)容過濾

tcp.segment_data contains "202005190001" 過濾tcp 報(bào)文內(nèi)容包括 202005190001 的報(bào)文

  • 更多wireshark 過濾器可以參考:wireshark-filter

wireshark 的詳細(xì)使用教程不是今天的重點(diǎn)仗考,就介紹這二部分音同,后面分析數(shù)據(jù)包時(shí)會穿插著講,覺得大家有興趣可以自己抽空玩一玩這個(gè)軟件秃嗜。

3.3 三次握手初探

寫的三次握手初探 這部分如果看不懂沒關(guān)系权均,這里是為了介紹Wireshark寫的三次握手,后面會詳細(xì)解釋锅锨,詳細(xì)到直接從網(wǎng)絡(luò)協(xié)議分層開始講起叽赊,如果你這看不懂可以Diss 。 [圖片上傳失敗...(image-85572e-1591322222101)]

如果第一次看Wireshark 網(wǎng)絡(luò)包必搞,會一臉懵逼必指,看多了就會越看越喜歡。重點(diǎn)看框出來的恕洲,前三行就是三次握手的過程

  1. 上圖第一行塔橡,客戶端向服務(wù)端發(fā)送SYN 數(shù)據(jù)包,數(shù)據(jù)長度len 為0霜第,Seq(隨機(jī)生成包序列號)為2421858999葛家;
  2. 上圖第二行,服務(wù)端向客戶端回應(yīng)ACK 數(shù)據(jù)包庶诡,并且發(fā)送SYN 數(shù)據(jù)包惦银,合并一起就是SYN + ACK 數(shù)據(jù)包,數(shù)據(jù)長度len 為0末誓,Seq(隨機(jī)生成包序列號)為1988635269扯俱,ack為2421859000 = 第一次握手Seq(2421858999)+1;
  3. 上圖第三行喇澡,客戶端回應(yīng)客戶端的SYN 數(shù)據(jù)包迅栅,發(fā)送ACK 確認(rèn)數(shù)據(jù)包,Seq 為 二次握手的ack(2421859000)晴玖,ack為 1988635270= 二次握手的seq(1988635269)+1读存;

4. 回顧網(wǎng)絡(luò)協(xié)議分層、三次握手呕屎、四次揮手等網(wǎng)絡(luò)基礎(chǔ)知識

4.1 網(wǎng)絡(luò)協(xié)議分層

在解決文章開頭的異常让簿,分析數(shù)據(jù)包之前,我們需要一些預(yù)備知識秀睛,需要一丟丟基礎(chǔ)的網(wǎng)絡(luò)知識尔当。

首先在直接看Wireshark 的包信息之前,需要來回顧一下計(jì)算機(jī)網(wǎng)絡(luò)的知識蹂安,大家知道目前主流使用的TCP/IP 五層協(xié)議椭迎,而不是國際標(biāo)準(zhǔn)化組織(ISO)出的OSI(Open System Interconnection)七層協(xié)議锐帜。TCP/IP協(xié)議棧如下圖所示: [圖片上傳失敗...(image-b176c-1591322222101)]

我們可以看到Wireshark 包詳情就是TCP/IP 五層的信息,對比上面的圖從下往上看(取每個(gè)英文單詞首字母就是協(xié)議簡稱畜号,例如 HTTP:Hypertext Transfer Protocol )缴阎,如下:

[圖片上傳失敗...(image-994d49-1591322222101)]

后面我們看 Wireshark 數(shù)據(jù)報(bào)文時(shí),主要看TCP 所在的傳輸層報(bào)文简软。

4.2 三次握手

首先我們先看下TCP 報(bào)文的報(bào)文格式: [圖片上傳失敗...(image-cea1fa-1591322222101)]

下面把TCP 報(bào)文的各個(gè)部分做了詳細(xì)說明蛮拔,分析網(wǎng)絡(luò)問題不用全看,把加重的部分關(guān)注一下就可以了痹升。好學(xué)的玩家可以把所有的都看了语泽,不用記,有個(gè)概念就可以了视卢。

  • 源端口號和目的端口號:各占2個(gè)字節(jié)(16位)踱卵,分別寫入源端口和目的端口;
  • 序號:4字節(jié)(32位)据过,TCP連接中字節(jié)流每個(gè)字節(jié)都按順序編號惋砂,這個(gè)序號用于標(biāo)識這個(gè)報(bào)文段。例如:一段報(bào)文序號seq 是201绳锅,而報(bào)文數(shù)據(jù)長度為100西饵,下一個(gè)報(bào)文段的數(shù)據(jù)序號應(yīng)該為301(201+100)。
  • 確認(rèn)號 :4字節(jié)(32位)鳞芙,期望收到對方下一個(gè)報(bào)文的序號眷柔。這個(gè)確認(rèn)號是和序號seq 有點(diǎn)關(guān)系的,不要和ACK(狀態(tài)標(biāo)志位)混淆了原朝。
  • 首部長度:4位驯嘱,表示報(bào)文數(shù)據(jù)距離報(bào)文起始位置的長度。保留:保留今后可以會用到喳坠。
  • 數(shù)據(jù)報(bào)狀態(tài)標(biāo)志位(非常重要)鞠评,分為以下6種,二進(jìn)制1 位表示一種(1代表開啟 0 關(guān)閉)
  • URG:URG=1 代表報(bào)文有緊急數(shù)據(jù)
  • ACK:ACK = 1壕鹉,確認(rèn)位剃幌,TCP中連接建立后,所有報(bào)文的ACK 位置都為1晾浴;
  • PSH: 發(fā)送端和接收端都有緩沖區(qū)(發(fā)送端:寫緩沖區(qū) 接收端:讀緩沖區(qū)) 對于發(fā)送端:帶PSH=1负乡,報(bào)文會立即從緩沖區(qū)報(bào)文推送給服務(wù)端 對于服務(wù)端:服務(wù)端立即將讀緩沖區(qū)內(nèi)容推給進(jìn)程。
  • RST:RST=1脊凰,代表連接出現(xiàn)嚴(yán)重錯(cuò)誤抖棘,TCP連接的一方將連接重置了,必須釋放連接,重新建立連接钉答;
  • SYN:同步SYN,在連接建立時(shí)用來同步序號杈抢。三次握手時(shí)會用到数尿,當(dāng)SYN=1,ACK =0惶楼,表明是發(fā)起方請求建立連接右蹦,服務(wù)方同意建立連接,響應(yīng)報(bào)文SYN=1歼捐,ACK =1何陆,前者表明同步連接,后者是確認(rèn)報(bào)文豹储。
  • FIN:用來釋放連接贷盲。當(dāng)FIN =1,表明此報(bào)文的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢剥扣,并且要求釋放巩剖。
  • 窗口:占2字節(jié),通常用于告知對方自己的能夠接受的數(shù)據(jù)量大小钠怯。窗口本質(zhì)就是一個(gè)緩沖區(qū)buffer佳魔,該字段的值用于告知對方自己剩余的可用緩沖區(qū)大小。
  • 校驗(yàn)和:奇偶校驗(yàn)晦炊,此校驗(yàn)和是對整個(gè)的 TCP 報(bào)文段鞠鲜,包括 TCP 頭部和 TCP 數(shù)據(jù),以 16 位字進(jìn)行計(jì)算所得断国。由發(fā)送端計(jì)算和存儲贤姆,并由接收端進(jìn)行驗(yàn)證。
  • 緊急指針:只有當(dāng) URG 標(biāo)志置 1 時(shí)緊急指針才有效稳衬。緊急指針是一個(gè)正的偏移量庐氮,和順序號字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號。
  • 選項(xiàng):可選的宋彼。最常見的可選字段是最長報(bào)文大小弄砍,又稱MSS(Maxinum Segment Size), 每個(gè)連接方通常在通信的第一個(gè)報(bào)文段(連接建立的SYN標(biāo)志位為1的數(shù)據(jù)報(bào)文)設(shè)置這個(gè)選項(xiàng),表示本端能接受的最大報(bào)文段的長度输涕。因?yàn)殚L度不一定是32的整數(shù)倍音婶,因此要加額外的0作為填充。
  • 數(shù)據(jù)部分:可選的莱坎。連接建立和終止時(shí)衣式,報(bào)文段只有TCP首部。

我們先回顧一下以前計(jì)算機(jī)網(wǎng)絡(luò)課堂上學(xué)過的TCP傳輸?shù)娜挝帐至鞒蹋?[圖片上傳失敗...(image-aac3c1-1591322222101)]

[圖片上傳失敗...(image-60f60b-1591322222101)]

三次握手的具體過程如下:

  • 服務(wù)端(接收方)進(jìn)程啟動,準(zhǔn)備接收客戶端進(jìn)程的連接請求碴卧,此時(shí)接收方進(jìn)入LISTEN(監(jiān)聽)模式弱卡;

  • 三次握手第一步:客戶端向服務(wù)端發(fā)出連接請求報(bào)文,這時(shí)報(bào)文首部SYN 標(biāo)志位為1住册,同時(shí)設(shè)置一個(gè)初始序列號seq = x(隨機(jī)數(shù)); 做完這步動作婶博,發(fā)送方進(jìn)入SYN_SENT (同步已發(fā)送狀態(tài)) 。

    名稱解釋:SYN:同步標(biāo)志位 seq:包序列編號(每個(gè)包都有一個(gè)序列號) 第一次握手客戶端發(fā)送的報(bào)文稱為同步請求報(bào)文荧飞,希望與服務(wù)端建立同步連接凡人,SYN報(bào)文不攜帶數(shù)據(jù)。

  • 三次握手第二步:服務(wù)端收到來自客戶端的連接請求報(bào)文后叹阔,需要確認(rèn)收貨挠轴,響應(yīng)報(bào)文中ACK(確認(rèn)標(biāo)志位)設(shè)置為1,將確認(rèn)號ack 設(shè)置為第一步的請求序列號seq 加1(ack =x+1)耳幢,另外自己也回客戶端一個(gè)SYN包(可以建立同步連接)岸晦,即SYN + ACK包,包序列號seq = y睛藻,服務(wù)端進(jìn)入SYN_RCVD(同步收到)狀態(tài)委煤。

    名詞解釋:ACK:確認(rèn)狀態(tài)位(這里ACK=1),這個(gè)一定和ack(32位確認(rèn)序號修档,這里ack=x+1)區(qū)分開碧绞,可以看下面的TCP 報(bào)文結(jié)構(gòu)體圖,ACK是包的狀態(tài)標(biāo)志吱窝,ack是確認(rèn)序號讥邻。

  • 三次握手第三步:客戶端收到來自服務(wù)端的 SYN + ACK 包,會發(fā)送一個(gè)ACK 確認(rèn)包院峡,ACK =1兴使,seq = x+1( 第二步的ack),ack = y+1(第二步的seq+1)照激。

4.3 四次揮手

四次揮手的狀態(tài)圖如下所示: [圖片上傳失敗...(image-1e7837-1591322222101)]

四次揮手wireshark 包信息如下发魄,可以對照著上圖看 [圖片上傳失敗...(image-a50345-1591322222101)]

四次揮手的具體過程如下:

客戶端發(fā)送FIN 釋放連接報(bào)文,表示結(jié)束連接俩垃,報(bào)文seq = u(等于前面已經(jīng)傳送過來的數(shù)據(jù)的最后一個(gè)字節(jié)的序號加1)励幼,此時(shí),客戶端進(jìn)入FIN_WAIT1(終止等待1)狀態(tài)口柳。

服務(wù)器收到連接釋放報(bào)文苹粟,發(fā)出確認(rèn)報(bào)文,ACK=1跃闹,ack=u+1嵌削,并且?guī)献约旱男蛄刑杝eq=v毛好,此時(shí),服務(wù)端就進(jìn)入了CLOSE_WAIT(關(guān)閉等待)狀態(tài)苛秕。TCP接收方通知上層的應(yīng)用進(jìn)程肌访,客戶端向服務(wù)器方向的發(fā)送通道關(guān)閉了,這時(shí)候處于半關(guān)閉狀態(tài)艇劫,即客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送了(已經(jīng)發(fā)了FIN結(jié)束信號)吼驶,但是服務(wù)器若發(fā)送數(shù)據(jù),客戶端依然要接受港准。這個(gè)狀態(tài)要持續(xù)一段時(shí)間,也就是整個(gè)CLOSE_WAIT狀態(tài)持續(xù)的時(shí)間咧欣。

客戶端收到服務(wù)器的確認(rèn)請求后浅缸,此時(shí),客戶端就進(jìn)入FIN_WAIT2(終止等待2)狀態(tài)魄咕,等待服務(wù)器發(fā)送連接釋放報(bào)文(在服務(wù)端Close_Wiat期間還可以接受服務(wù)器發(fā)送的最后的數(shù)據(jù))衩椒。

服務(wù)端發(fā)送完最后的數(shù)據(jù),向客戶端發(fā)送FIN 連接釋放報(bào)文哮兰,ACK =1毛萌,由于在半關(guān)閉狀態(tài),服務(wù)器很可能又發(fā)送了一些數(shù)據(jù)喝滞,假定此時(shí)的序列號為seq=w阁将,ack 和回復(fù)ACK報(bào)文一致,ack = u+1, 此時(shí)右遭,服務(wù)器就進(jìn)入了LAST_ACK(最后確認(rèn))狀態(tài)做盅,等待客戶端的確認(rèn)。

客戶端收到服務(wù)器的連接釋放報(bào)文后窘哈,必須發(fā)出確認(rèn)吹榴,ACK=1,ack=w+1滚婉,而自己的序列號是seq=u+1图筹,此時(shí),客戶端就進(jìn)入了TIME_WAIT(時(shí)間等待)狀態(tài)让腹。注意此時(shí)TCP連接還沒有釋放远剩,必須經(jīng)過2 個(gè)MSL(最長報(bào)文段壽命)的時(shí)間后,當(dāng)客戶端撤銷相應(yīng)的TCB后骇窍,才進(jìn)入CLOSED狀態(tài)民宿。

服務(wù)器只要收到了客戶端發(fā)出的確認(rèn),立即進(jìn)入CLOSED狀態(tài)像鸡。同樣活鹰,撤銷TCB后哈恰,就結(jié)束了這次的TCP連接。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末志群,一起剝皮案震驚了整個(gè)濱河市着绷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锌云,老刑警劉巖荠医,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桑涎,居然都是意外死亡彬向,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門攻冷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娃胆,“玉大人,你說我怎么就攤上這事等曼±锓常” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵禁谦,是天一觀的道長胁黑。 經(jīng)常有香客問我,道長州泊,這世上最難降的妖魔是什么丧蘸? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮遥皂,結(jié)果婚禮上触趴,老公的妹妹穿的比我還像新娘。我一直安慰自己渴肉,他們只是感情好冗懦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仇祭,像睡著了一般披蕉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乌奇,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天没讲,我揣著相機(jī)與錄音,去河邊找鬼礁苗。 笑死爬凑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的试伙。 我是一名探鬼主播嘁信,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼于样,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了潘靖?” 一聲冷哼從身側(cè)響起穿剖,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卦溢,沒想到半個(gè)月后糊余,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单寂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年贬芥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宣决。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蘸劈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疲扎,到底是詐尸還是另有隱情昵时,我是刑警寧澤捷雕,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布椒丧,位于F島的核電站,受9級特大地震影響救巷,放射性物質(zhì)發(fā)生泄漏壶熏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一浦译、第九天 我趴在偏房一處隱蔽的房頂上張望棒假。 院中可真熱鬧,春花似錦精盅、人聲如沸帽哑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妻枕。三九已至,卻和暖如春粘驰,著一層夾襖步出監(jiān)牢的瞬間屡谐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工蝌数, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留愕掏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓顶伞,卻偏偏與公主長得像饵撑,于是被迫代替她去往敵國和親剑梳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容