Wireshark(前稱Ethereal)是一個網絡封包分析軟件。網絡封包分析軟件的功能是擷取網絡封包,並儘可能顯示出最爲詳細的網絡封包資料。Wireshark使用WinPCAP作爲接口,直接與網卡進行數據報文交換,是與tcpdump具有同樣威力,但是提供了簡單易用的用戶操作界面的一款網絡分析軟件。
ipconfig執行:
1、修改環境變量,PATH下加入C:\Windows\System32
2、在命令行界面下將路徑直接改爲C:\Windows\System32(利用以前學習過的DOS命令)
1.8版本的過濾器問題:初次啓動如果無法獲取端口,提示配置錯誤(在此係統中,無法使用當前配置捕獲接口有關詳細信息,請參閱下面的捕獲幫助),試着以管理員模式啓動一次。
1.8版本的捕獲過濾條件設置
單擊紅色標記處,選擇運行的網卡點擊options,雙擊選擇的網卡,在紅色標記處寫入捕獲過濾條件
使用:
1、直接選擇一個有數據傳輸的網卡,然後點擊Start按鈕開始抓取
2、看到已經抓取了所有的在通信的數據包後設置抓包過濾比如抓到指定的源、目標、協議等
點擊capture options(捕獲選項),設置過濾語句,例如:
過濾百度網址的數據包:dst host www.baidu.com
只抓TCP協議並且端口是80的:tcp port 80
tcp端口80的,並且目標ip是47.89.48.123
參考如下:
協議 tcp、udp、icmp等
src 源
dst 目標(可以是網址,也可以是IP地址)
port 端口
host 主機
使用Wireshark分析TCP三次握手過程
1 、三次握手原理
第一次握手:建立連接時,客戶端發送SYN到服務器,並進入SYN_SENT狀態。
第二次握手:服務器收到請求後,回送SYN+ACK信令到客戶端,此時服務器進入SYN_RECV狀態。
第三次握手:客戶端收到SYN+ACK包,向服務器發送確認ACK包,客戶端進入ESTABLISHED狀態,服務器收到請求後也進入ESTABLISHED狀態,完成三次握手,此時TCP連接成功,客戶端與服務器開始傳送數據。
1.1 第一次握手
第一次握手:建立連接時,客戶端發送SYN到服務器,並進入SYN_SENT狀態。
SYN :標誌位,表示請求建立連接。
Seq = 0 :初始建立連接值爲0,數據包的相對序列號從0開始,表示當前還沒有發送數據。
Ack =0:初始建立連接值爲0,已經收到包的數量,表示當前沒有接收到數據。
WIN = 1222 來自Window size: 1222。
MSS = 1460 來自 Maximum segment size: 1460 byte ,最長報文段,TCP包所能攜帶的最大數據量,不包含TCP頭和Option。一般爲MTU值減去IPv4頭部(至少20字節)和TCP頭部(至少20字節)得到。
WS = 4 來自windows scale : 2 (multiply by 4): 窗口擴張,放在TCP頭之外的Option,向對方聲明一個shift count,作爲2的指數,再乘以TCP定義的接收窗口,得到真正的TCP窗口。
1.2 第二次握手
第二次握手:服務器收到請求後,回送SYN+ACK信令到客戶端,此時服務器進入SYN_RECV狀態。
Seq = 0 :初始建立值爲0,表示當前還沒有發送數據
Ack = 1 : 表示當前端成功接收的數據位數,雖然客戶端沒有發送任何有效數據,確認號還是被加1,因爲包含SYN或FIN標誌位。儘管客戶端沒有發送任何有效數據,確認號還是被加1,這是因爲接收的包中包含SYN或FIN標誌位(並不會對有效數據的計數產生影響,因爲含有SYN或FIN標誌位的包並不攜帶有效數據。
1.3 第三次握手
第三次握手:客戶端收到SYN+ACK包,向服務器發送確認ACK包,客戶端進入ESTABLISHED狀態,服務器收到請求後也進入ESTABLISHED狀態,完成三次握手,此時TCP連接成功,客戶端與服務器開始傳送數據。
ACK :標誌位,表示已經收到記錄
Seq = 1 :表示當前已經發送1個數據
Ack = 1 : 表示當前端成功接收的數據位數,雖然客戶端沒有發送任何有效數據,確認號還是被加1,因爲包含SYN或FIN標誌位。儘管客戶端沒有發送任何有效數據,確認號還是被加1,這是因爲接收的包中包含SYN或FIN標誌位(並不會對有效數據的計數產生影響,因爲含有SYN或FIN標誌位的包並不攜帶有效數據)
信道不可靠, 但是通信雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在消息中包含什麼信息, 三次通信是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是爲了滿足”在不可靠信道上可靠地傳輸信息”這一需求所導致的.
也是爲了最小的代價驗證會話雙方的收發功能正常:
-
第一次握手成功:說明客戶端的數據可以被服務端收到,說明客戶端的發功能可用,說明服務端的收功能可用。但客戶端自己不知道數據是否被接收。
-
第二次握手成功:說明服務端的數據可以被客戶端收到,說明服務端的發功能可用,說明客戶端的收功能可用。同時客戶端知道自己的數據已經正確到達服務端,自己的發功能正常。但是服務端自己不知道數據是否被接收。
-
第三次握手成功:說明服務端知道自己的數據已經正確到達客戶端端,自己的發功能正常。至此服務成功建立。
2. 請求數據的過程
客戶端和服務端建立連接後,開始傳輸數據。下圖中首先是客戶端發起一個GET請求,服務端收到請求後首先返回確認信息。待服務端處理完成後,將數據返回給客戶端,客戶端對收到的數據進行確認,完成一次數據交互的過程。
交互過程中,SEQ表示發送的數據,LEN表示發送的數據長度,下一次的SEQ就等於當前SEQ加上LEN。ACK表示接收的數據位。客戶端和服務端分別計算自己的增長值。對應上圖最後一次服務端返回數據時SEQ是2737,LEN是450。客戶端對接收數據做了兩次返回確認,第一次ACK是2737,表示還沒有完成數據接收。第二次ACK是3187,等於服務端SEQ+LEN(2737+450)表示已經完成了全部數據的接收。
分析四次揮手過程
-
第一次揮手:客戶端 發送一個[FIN+ACK],表示自己沒有數據要發送了,想斷開連接,並進入FIN_WAIT_1狀態(不能再發送數據到服務端,但能夠發送控制信息ACK到服務端)。
-
第二次揮手:服務端收到FIN後,知道不會再有數據從客戶端傳來,發送ACK進行確認,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),服務端進入CLOSE_WAIT狀態。
-
第三次揮手:服務端發送FIN給對方,表示自己沒有數據要發送了,服務端進入LAST_ACK狀態,然後直接斷開TCP會話的連接,釋放相應的資源。
-
第四次揮手:客戶端收到了服務端對FIN的ACK後,進入FIN_WAIT2狀態(等待服務端完成資源釋放的一系列工作:然後釋放你爲創建這個連接所分配的資源,並通知我你關閉了); 客戶端收到了服務端的FIN信令後,進入TIMED_WAIT狀態,併發送ACK確認消息。客戶端在TIMED_WAIT狀態下,等待2MSL一段時間,沒有數據到來的,就認爲對面已經收到了自己發送的ACK並正確關閉了進入CLOSE狀態,自己也斷開了到服務端的TCP連接,釋放所有資源。當服務端收到客戶端的ACK迴應後,會進入CLOSE狀態,並關閉本端的會話接口,釋放相應資源。TIME_WAIT狀態持續2MSL(MSL是數據分節在網絡中存活的最長時間)。網絡上比較主流的文章都說關閉TCP會話是四次揮手,但是實際上爲了提高效率通常合併第二、三次的揮手,即三次揮手。
關閉連接需要四次握手。一般情況下:
客戶端向服務端發送FIN爲1的報文,服務端返回確認,關閉客戶端與服務端通信的部分。
服務端向客戶端發送FIN爲1的報文,客戶端返回確認,關閉服務端與客戶端通信的部分。