相信大家總是能聽到TCP、UDP,還有TCP三次握手,之前都是看的書上的理論,今天來用Wireshark抓一個tcp三次握手。
在平時的開發(fā)中,如果是一般的Http或者Https請求,我們直接在Windows上使用Fiddler、Mac上使用Charles來抓包即可。當然,使用Wireshark也可以抓取http、https請求,不過一般使用Wireshark來抓TCP請求。
官方下載地址:https://www.wireshark.org/download.html
首先,來看下wireshark界面

這里選擇Wi-Fi就能抓到本機所有的請求了,我這里是wifi,如果是直接連網線,看到的就是本地連接了。這個很簡單,你試一下就能知道了。
然后就能看到各種網絡請求了,包括應用層協(xié)議和傳輸層協(xié)議。

因為數據傳輸記錄太多了,那么就一定需要過濾器功能了。上面的過濾器欄中支持以下幾種表達式:
表達式規(guī)則
- 協(xié)議過濾
比如tcp,只顯示TCP協(xié)議。http,就是只顯示HTTP協(xié)議。注意,這里是區(qū)分大小寫的。 - IP 地址過濾
比如 ip.src ==192.168.1.102 顯示源地址為192.168.1.102,
ip.dst==192.168.1.102, 目標地址為192.168.1.102 - 端口過濾
tcp.port ==80, 端口為80的
tcp.srcport == 80, 只顯示TCP協(xié)議的愿端口為80的。 - Http模式過濾
http.request.method=="GET", 只顯示HTTP GET方法的。 - 邏輯運算符為 AND/ OR
點擊任意一個記錄,下面會顯示該記錄的封包詳細信息

- Frame: 物理層的數據幀概況
- Ethernet II: 數據鏈路層以太網幀頭部信息,這里就可以看到本機mac地址以及目標mac地址了
- Internet Protocol Version 4: 互聯(lián)網層IP包頭部信息,這里可以看到本機以及目標ip地址
- Transmission Control Protocol: 傳輸層T的數據段頭部信息,此處是TCP,這里能看到TCP的數據包了,下面會講到。
- Hypertext Transfer Protocol: 應用層的信息,此處是HTTP協(xié)議
關于互聯(lián)網通信協(xié)議,推薦阮一峰的“互聯(lián)網協(xié)議入門”,寫的真好。http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html
下面看下TCP報文頭部格式:

再來對比看一下Wireshark抓的TCP包,終于從理論到實踐了。大學期間看了很多遍TCP報文頭都記不住。重點關注一下Sequence number 和 Acknowledgment number 以及Flags。

現在進入我們的重點,TCP三次握手,這個歷史性的握手
我們先訪問一個http請求“http://www.cnblogs.com/tankxiao”,注意這里不是https哦,關于https我后面再講。

我們找到我們請求的http地址,注意看Stream index = 2,這個index等下可以追蹤到這次http建立之前的tcp三次握手過程。
我們鼠標右鍵這個http請求,Follow-TCP Stream,就可以看到此次tcp建立連接的歷史性握手了。

上面的地址欄過濾"tcp.stream eq 2"中的2就是上面的Stream index。
咱么首先看下TCP三次握手經典圖

大學時看過很多遍這個圖,卻記不住到底啥意思,就是因為太抽象了,抽象到只能死記硬背,今天通過wireshark一看就明白了。
下面來分步解析一下三次握手過程,主要關注三個參數,分別是Flags、Sequence number、Acknowledgment number。
第一次握手
Flags:SYN
Sequence number:0
Acknowledgment number:0

第二次握手
Flags:SYN,ACK
Sequence number:0
Acknowledgment number:1

第三次握手
Flags:ACK
Sequence number:1
Acknowledgment number:1

總結:TCP三次握手過程
- 客戶端發(fā)送SYN標志和序列號Seq來向服務器發(fā)起連接
- 服務端收到請求,向客戶端發(fā)送ACK表示確認,確認號是接收到的序列號+1。同時發(fā)送SYN標志位以及自己的序列號給客戶端發(fā)起連接
- 客戶端再發(fā)送ACK標志給服務端表示確認,其中確認號是服務端發(fā)送過來的序列號+1
參考博客:https://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html