# 網絡基本功(二十三):Wireshark抓包實例診斷TCP連接問題
**轉載請在文首保留原文出處:EMC中文支持論壇**[https://community.emc.com/go/chinese](https://community.emc.com/go/chinese) [](https://community.emc.com/servlet/JiveServlet/showImage/2-861019-105855/image001.gif)
## 介紹
前文論述了TCP基礎知識,從本節開始,通過TCP抓包實例來診斷TCP常見問題。
TCP進程通訊時,雙方打開連接,發送數據,最后關閉連接。當TCP打開連接時,從源端口到目的端口發送一個請求。在應用建立或關閉時可能發生一些問題。本文討論用Wireshark網絡抓包的方法來定位及解決這一問題。
## 更多信息
**問題的表現形式:**
問題可能有多種表現類型:
+ 嘗試運行應用程序但發現應用程序無法工作。嘗試瀏覽網絡但無法獲得響應。
+ 嘗試發送郵件但無法連接到郵件服務器。
+ 問題可能由簡單原因引起,如服務器宕機,服務器上沒有運行應用程序,或在客戶端到服務器的某一處網絡斷開。
+ 問題也可能由復雜原因引起,如DNS問題,服務器內存不足無法連接(例如某一應用占用高內存空間),重復IP,以及其他原因。
**處理方法:**
下文會介紹解決問題的線索以及如何通過抓包來診斷TCP連接問題。通常,這些問題會導致運行應用程序時無法得到任何結果。
當你在運行一個應用程序時,例如數據庫客戶端,郵件客戶端,觀看視頻等等,而又無法獲得輸出,按照以下步驟診斷:
1. 確認服務器和應用程序正在運行。
2. 確認客戶端正在運行,IP地址已配置(手動或通過DHCP),并連接至網絡。
3. Ping服務器并確認連接正常。
4. 在某些情況下,ping不通服務器但連接正常。這是由于防火墻攔截了ICMP信息,所以如果無法ping通并不一定表示連接有問題。防火墻可能是網絡中的專用設備或Windows/Linux/UNIX終端設備上安裝的防火墻。
5\. 抓包文件中,查找以下模式:
+ 三重SYN信息而沒有響應(見以下截屏)
+ SYN信息帶一個reset(RST)響應
**這兩種情況下都有可能是防火墻攔截了特定應用程序或應用程序沒有在運行。**
以下截屏是一個簡單的case:客戶端無法連接到web服務器81.218.31.171(報文61,62和63)。可能是由于不被防火墻允許,或服務器發生故障。可以看到另一個站點108.160.163.43(報文65,66和67)的連接正常,因此連接問題僅限于81.218.31.171。
[](https://community.emc.com/servlet/JiveServlet/showImage/2-861019-105856/image002.jpg)
下例是一個這種情況相對復雜的case。該case中,客戶想要登錄到camera服務器來訪問遠程站點的camera。camera服務器的IP地址為135.82.12.1,問題在于客戶能夠看到服務器主頁上的登錄窗口,但無法登進系統。在下面的截圖中可以看到,打開了一個到IP地址135.82.12.1的連接。到HTTP服務器的TCP連接是打開的,一開始看上去沒有連接問題:
[](https://community.emc.com/servlet/JiveServlet/showImage/2-861019-105857/image003.jpg)
當我們過濾出目的IP地址為135.82.12.1的數據流,也就是camera服務器。這里可以看到,當嘗試連接TCP端口6036時,得到了一個RST/ACK響應,有以下可能性:
+ 防火墻攔截了端口6036
+ 如果配置了端口地址轉換(PAT),那么僅轉換端口80而非6036
+ 用戶名和密碼驗證是在TCP端口6036上完成的,防火墻僅允許端口80,驗證被攔截,應用無法工作
[](https://community.emc.com/servlet/JiveServlet/showImage/2-861019-105858/image004.jpg)
**總之,當無法正常連接服務器時,檢查服務器和客戶端是否所有TCP/UDP端口都能通過網絡轉發,以及是否有未知的端口。**
**工作過程:**
TCP連接開始時,發生了以下三步:
[](https://community.emc.com/servlet/JiveServlet/showImage/2-861019-105859/image005.jpg)
1\. 客戶端TCP進程發送了一個SYN報文。該報文中SYN標志位設置為1。這一報文中客戶端:
+ 指定自己的初始序列號。這是客戶端發送給服務器的第一個字節。
+ 指明自己的窗口大小。這是客戶端分配給進程的緩存大小(位于客戶端的RAM)。
+ 設置自己將要使用的選項:MSS,Selective ACK,等等。
2\. 當服務器收到建立連接請求,服務器:
+ 發送SYN/ACK給客戶端,確認接收到SYN請求。
+ 指明服務器端的初始序列號。這是服務器發送給客戶端的第一個字節。
+ 指明服務器的窗口大小。這是服務器分配給進程的緩存大小(位于服務器RAM)。
+ 回復請求選項并設置服務器端選項。
3\. 當接收到服務器的SYN/ACK,客戶端:
+ 發送ACK報文給服務器,確認從服務器接收到SYN/ACK.
+ 指明客戶端窗口大小。盡管這一參數在第一個報文中定義過了,服務器還是會參考這個值,因為這是最新的窗口大小。
在TCP頭部的選項字段中,有以下幾個主要選項:
+ Maximum Segment Size(MSS):TCP數據報的最大字節數,即從TCP頭部開始直到報文末尾的字節數。
+ Windows Scale Option (WSopt):這一因子與TCP頭部的Window Size字段相乘,通知接收方擴大緩存。由于頭部最大窗口大小是64KB,乘以因子4也就是256KB窗口大小。
+ SACK:Selective ACK,該選項使連接雙方能夠僅確認指定報文,當單個報文丟失,只有這個報文會被重傳。連接建立時,雙方都需要同意SACK。
+ Timestamps Option(TSopt):該參數指客戶端和服務器之間的延時。
在這一階段,雙方:
+ 同意建立連接
+ 知道對方的初始序列號
+ 知道對方的窗口大小
?????? **在建立連接時,除了三路握手信號之外,其他都表示有問題。**包括SYN沒有響應,SYN之后SYN/ACK最后沒有ACK,SYN響應為RST,等等。
**總結:**
+ **如果SYN報文收到回復RST,則檢查攔截了port號的防火墻。**
+ **三次SYN而沒有任何回復,或者是由于應用程序沒有響應,或者是由于防火墻攔截了特定端口上的請求。**
+ **永遠記住確認一下是否有NAT**,**端口轉發,以及涉及TCP和UDP端口的機制。這些機制可能會中斷TCP正常操作。**
## 參考
Network Analysis Using Wireshark Cookbook
- 介紹
- 網絡基本功(一):細說網絡傳輸
- 網絡基本功(二):細說交換機
- 網絡基本功(三):細說VLAN與Trunk
- 網絡基本功(四):細說路由(上)
- 網絡基本功(五):細說路由(下)
- 網絡基本功(六):鏈路聚合
- 網絡基本功(七):細說IP地址與子網
- 網絡基本功(八):細說TCP滑動窗口
- 網絡基本功(九):細說TCP重傳
- 網絡基本功(十):細說TCP確認機制
- 網絡基本功(十一):TCP窗口調整與流控
- 網絡基本功(十二):細說Linux網絡配置(上)
- 網絡基本功(十三):細說Linux網絡配置(下)
- 網絡基本功(十四):細說診斷工具ping
- 網絡基本功(十五):細說網絡性能監測與實例(上)
- 網絡基本功(十六):細說網絡性能監測與實例(下)
- 網絡基本功(十七):細說tcpdump的妙用(上)
- 網絡基本功(十八):細說tcpdump的妙用(下)
- 網絡基本功(十九):細說NAT原理與配置
- 網絡基本功(二十):細說ICMP和ARP
- 網絡基本功(二十一):細說HTTP(上)
- 網絡基本功(二十二):細說HTTP(下)
- 網絡基本功(二十三):Wireshark抓包實例診斷TCP連接問題
- 網絡基本功(二十四):Wireshark抓包實例分析TCP重傳
- 網絡基本功(二十五):Wireshark抓包實例分析TCP重復ACK與亂序
- 網絡基本功(二十六):Wireshark抓包實例分析TCP窗口及reset
- 網絡基本功(二十七):Wireshark抓包實例分析HTTP問題(上)
- 網絡基本功(二十八):Wireshark抓包實例分析HTTP問題(下)
- 網絡基本功(二十九):Wireshark抓包實例診斷數據庫常見問題
- 網絡基本功(三十):細說DNS(上)
- 網絡基本功(三十一):細說DHCP