轉載請在文首保留原文出處:EMC中文支持論壇https://community.emc.com/go/chinese
介紹
前文論述了TCP基礎知識,從本節開始,經過TCP抓包實例來診斷TCP常見問題。
TCP進程通信時,雙方打開鏈接,發送數據,最後關閉鏈接。當TCP打開鏈接時,從源端口到目的端口發送一個請求。在應用創建或關閉時可能發生一些問題。本文討論用Wireshark網絡抓包的方法來定位及解決這一問題。
更多信息
問題的表現形式:
問題可能有多種表現類型:
· 嘗試運行應用程序但發現應用程序沒法工做。嘗試瀏覽網絡但沒法得到響應。
· 嘗試發送郵件但沒法鏈接到郵件服務器。
· 問題可能由簡單緣由引發,如服務器宕機,服務器上沒有運行應用程序,或在客戶端到服務器的某一處網絡斷開。
· 問題也可能由複雜緣由引發,如DNS問題,服務器內存不足沒法鏈接(例如某一應用佔用高內存空間),重複IP,以及其餘緣由。
處理方法:
下文會介紹解決問題的線索以及如何經過抓包來診斷TCP鏈接問題。一般,這些問題會致使運行應用程序時沒法獲得任何結果。
當你在運行一個應用程序時,例如數據庫客戶端,郵件客戶端,觀看視頻等等,而又沒法得到輸出,按照如下步驟診斷:
確認服務器和應用程序正在運行。
確認客戶端正在運行,IP地址已配置(手動或經過DHCP),並鏈接至網絡。
Ping服務器並確認鏈接正常。
在某些狀況下,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。web
下例是一個這種狀況相對複雜的case。該case中,客戶想
要登陸到camera服務器來訪問遠程站點的camera。camera服務器的IP地址爲135.82.12.1,問題在於客戶可以看到服務器主頁上的登陸窗口,但沒法登進系統。在下面的截圖中能夠看到,打開了一個到IP地址135.82.12.1的鏈接。到HTTP服務器的TCP鏈接是打開的,一開始看上去沒有鏈接問題:
數據庫
當咱們過濾出目的IP地址爲135.82.12.1的數據流,也就是camera服務器。這裏能夠看到,當嘗試鏈接TCP端口6036時,獲得了一個RST/ACK響應,有如下可能性:
· 防火牆攔截了端口6036
· 若是配置了端口地址轉換(PAT),那麼僅轉換端口80而非6036
· 用戶名和密碼驗證是在TCP端口6036上完成的,防火牆僅容許端口80,驗證被攔截,應用沒法工做緩存
總之,當沒法正常鏈接服務器時,檢查服務器和客戶端是否全部TCP/UDP端口都能經過網絡轉發,以及是否有未知的端口。
工做過程:
TCP鏈接開始時,發生瞭如下三步:服務器
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網絡