網(wǎng)絡(luò)基本功(二十三):Wireshark抓包實(shí)例診斷TCP連接問題

介紹

前文論述了TCP基礎(chǔ)知識(shí),從本節(jié)開始,通過(guò)TCP抓包實(shí)例來(lái)診斷TCP常見問題。

TCP進(jìn)程通訊時(shí),雙方打開連接,發(fā)送數(shù)據(jù),最后關(guān)閉連接。當(dāng)TCP打開連接時(shí),從源端口到目的端口發(fā)送一個(gè)請(qǐng)求。在應(yīng)用建立或關(guān)閉時(shí)可能發(fā)生一些問題。本文討論用Wireshark網(wǎng)絡(luò)抓包的方法來(lái)定位及解決這一問題。

更多信息

問題的表現(xiàn)形式:

問題可能有多種表現(xiàn)類型:

·嘗試運(yùn)行應(yīng)用程序但發(fā)現(xiàn)應(yīng)用程序無(wú)法工作。嘗試瀏覽網(wǎng)絡(luò)但無(wú)法獲得響應(yīng)。

·嘗試發(fā)送郵件但無(wú)法連接到郵件服務(wù)器。

·問題可能由簡(jiǎn)單原因引起,如服務(wù)器宕機(jī),服務(wù)器上沒有運(yùn)行應(yīng)用程序,或在客戶端到服務(wù)器的某一處網(wǎng)絡(luò)斷開。

·問題也可能由復(fù)雜原因引起,如DNS問題,服務(wù)器內(nèi)存不足無(wú)法連接(例如某一應(yīng)用占用高內(nèi)存空間),重復(fù)IP,以及其他原因。

處理方法:

下文會(huì)介紹解決問題的線索以及如何通過(guò)抓包來(lái)診斷TCP連接問題。通常,這些問題會(huì)導(dǎo)致運(yùn)行應(yīng)用程序時(shí)無(wú)法得到任何結(jié)果。

當(dāng)你在運(yùn)行一個(gè)應(yīng)用程序時(shí),例如數(shù)據(jù)庫(kù)客戶端,郵件客戶端,觀看視頻等等,而又無(wú)法獲得輸出,按照以下步驟診斷:

1.確認(rèn)服務(wù)器和應(yīng)用程序正在運(yùn)行。

2.確認(rèn)客戶端正在運(yùn)行,IP地址已配置(手動(dòng)或通過(guò)DHCP),并連接至網(wǎng)絡(luò)。

3.Ping服務(wù)器并確認(rèn)連接正常。

4.在某些情況下,ping不通服務(wù)器但連接正常。這是由于防火墻攔截了ICMP信息,所以如果無(wú)法ping通并不一定表示連接有問題。防火墻可能是網(wǎng)絡(luò)中的專用設(shè)備或Windows/Linux/UNIX終端設(shè)備上安裝的防火墻。

5.抓包文件中,查找以下模式:

·三重SYN信息而沒有響應(yīng)(見以下截屏)

·SYN信息帶一個(gè)reset(RST)響應(yīng)

這兩種情況下都有可能是防火墻攔截了特定應(yīng)用程序或應(yīng)用程序沒有在運(yùn)行。

以下截屏是一個(gè)簡(jiǎn)單的case:客戶端無(wú)法連接到web服務(wù)器81.218.31.171(報(bào)文61,62和63)。可能是由于不被防火墻允許,或服務(wù)器發(fā)生故障。可以看到另一個(gè)站點(diǎn)108.160.163.43(報(bào)文65,66和67)的連接正常,因此連接問題僅限于81.218.31.171。

下例是一個(gè)這種情況相對(duì)復(fù)雜的case。該case中,客戶想要登錄到camera服務(wù)器來(lái)訪問遠(yuǎn)程站點(diǎn)的camera。camera服務(wù)器的IP地址為135.82.12.1,問題在于客戶能夠看到服務(wù)器主頁(yè)上的登錄窗口,但無(wú)法登進(jìn)系統(tǒng)。在下面的截圖中可以看到,打開了一個(gè)到IP地址135.82.12.1的連接。到HTTP服務(wù)器的TCP連接是打開的,一開始看上去沒有連接問題:

當(dāng)我們過(guò)濾出目的IP地址為135.82.12.1的數(shù)據(jù)流,也就是camera服務(wù)器。這里可以看到,當(dāng)嘗試連接TCP端口6036時(shí),得到了一個(gè)RST/ACK響應(yīng),有以下可能性:

·防火墻攔截了端口6036

·如果配置了端口地址轉(zhuǎn)換(PAT),那么僅轉(zhuǎn)換端口80而非6036

·用戶名和密碼驗(yàn)證是在TCP端口6036上完成的,防火墻僅允許端口80,驗(yàn)證被攔截,應(yīng)用無(wú)法工作

總之,當(dāng)無(wú)法正常連接服務(wù)器時(shí),檢查服務(wù)器和客戶端是否所有TCP/UDP端口都能通過(guò)網(wǎng)絡(luò)轉(zhuǎn)發(fā),以及是否有未知的端口。

工作過(guò)程:

TCP連接開始時(shí),發(fā)生了以下三步:

1.客戶端TCP進(jìn)程發(fā)送了一個(gè)SYN報(bào)文。該報(bào)文中SYN標(biāo)志位設(shè)置為1。這一報(bào)文中客戶端:

·指定自己的初始序列號(hào)。這是客戶端發(fā)送給服務(wù)器的第一個(gè)字節(jié)。

·指明自己的窗口大小。這是客戶端分配給進(jìn)程的緩存大小(位于客戶端的RAM)。

·設(shè)置自己將要使用的選項(xiàng):MSS,Selective ACK,等等。

2.當(dāng)服務(wù)器收到建立連接請(qǐng)求,服務(wù)器:

·發(fā)送SYN/ACK給客戶端,確認(rèn)接收到SYN請(qǐng)求。

·指明服務(wù)器端的初始序列號(hào)。這是服務(wù)器發(fā)送給客戶端的第一個(gè)字節(jié)。

·指明服務(wù)器的窗口大小。這是服務(wù)器分配給進(jìn)程的緩存大小(位于服務(wù)器RAM)。

·回復(fù)請(qǐng)求選項(xiàng)并設(shè)置服務(wù)器端選項(xiàng)。

3.當(dāng)接收到服務(wù)器的SYN/ACK,客戶端:

·發(fā)送ACK報(bào)文給服務(wù)器,確認(rèn)從服務(wù)器接收到SYN/ACK.

·指明客戶端窗口大小。盡管這一參數(shù)在第一個(gè)報(bào)文中定義過(guò)了,服務(wù)器還是會(huì)參考這個(gè)值,因?yàn)檫@是最新的窗口大小。

在TCP頭部的選項(xiàng)字段中,有以下幾個(gè)主要選項(xiàng):

·Maximum Segment Size(MSS):TCP數(shù)據(jù)報(bào)的最大字節(jié)數(shù),即從TCP頭部開始直到報(bào)文末尾的字節(jié)數(shù)。

·Windows Scale Option (WSopt):這一因子與TCP頭部的Window Size字段相乘,通知接收方擴(kuò)大緩存。由于頭部最大窗口大小是64KB,乘以因子4也就是256KB窗口大小。

·SACK:Selective ACK,該選項(xiàng)使連接雙方能夠僅確認(rèn)指定報(bào)文,當(dāng)單個(gè)報(bào)文丟失,只有這個(gè)報(bào)文會(huì)被重傳。連接建立時(shí),雙方都需要同意SACK。

·Timestamps Option(TSopt):該參數(shù)指客戶端和服務(wù)器之間的延時(shí)。

在這一階段,雙方:

·同意建立連接

·知道對(duì)方的初始序列號(hào)

·知道對(duì)方的窗口大小

在建立連接時(shí),除了三路握手信號(hào)之外,其他都表示有問題。包括SYN沒有響應(yīng),SYN之后SYN/ACK最后沒有ACK,SYN響應(yīng)為RST,等等。

總結(jié):

·如果SYN報(bào)文收到回復(fù)RST,則檢查攔截了port號(hào)的防火墻。

·三次SYN而沒有任何回復(fù),或者是由于應(yīng)用程序沒有響應(yīng),或者是由于防火墻攔截了特定端口上的請(qǐng)求。

·永遠(yuǎn)記住確認(rèn)一下是否有NAT端口轉(zhuǎn)發(fā),以及涉及TCPUDP端口的機(jī)制。這些機(jī)制可能會(huì)中斷TCP正常操作。


轉(zhuǎn)自https://community.emc.com/thread/197851 【好文章,收藏】

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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