使用TCP協議傳輸數據相對來說更安全,因爲通信雙方擁有一個專屬的通信通道,每發送一個數據包都有確認回覆,若數據包丟失。如果發送放沒收到確認包,就可以重發這個數據包。
最經典的例子就是三次握手。三次握手是通信雙方建立TCP連接前的必須步驟。第一次握手時請求方向接收方發送友好問候,請求建立連接。第二次握手接收方禮貌回覆,表示收到請求。第三次握手請求方堅定交往信息,向接收方表示已做好了連接準備。於是雙方的TCP連接就建好啦~
完成三次握手後,雙方就可以開始傳輸數據了。當然,握手很嚴謹,說再見也是一絲不苟的。詳細內容可以在合天網安實驗室裏進行實驗操作《Wireshark數據抓包分析之傳輸層協議(TCP協議)》瞭解。下面開始實戰。
根據已經搭建好的實驗環境,本次實戰步驟如下:
1. 在測試環境使用發包工具和Wireshark抓取TCP三次握手和四次斷開的數據包
2. 詳細分析TCP協議的三次握手以及四次斷開。
本次的任務可以拆分成:安裝發包工具,配置TCP客戶端(請求方),服務端(接收方),與學習Wireshark軟件懂使用。咱開始吧~
我們使用" TCP&UDP測試工具"來製作和發送TCP數據包,雙擊實驗機器桌面的" TCP&UDP測試工具",會出現下圖顯示頁面:
下面我們需要配置TCP的服務端以及客戶端。首先配置服務器端:選擇地址爲10.1.1.33的機器,雙擊桌面的" TCP&UDP測試工具",右鍵點擊服務器模式,在下拉列表中,選擇創建服務器,如下圖:
選擇"創建服務器"之後,會彈出服務器端口設置,本次使用默認工具給的6000端口即可,點擊"確定"按鈕。
點擊"確定"按鈕之後,在左側的服務器模式列表中,會出現創建的列表,選擇我們創建的服務器,右鍵點擊,選擇"啓動服務器",即完成了服務器端的配置。
接下來配置客戶端,步驟與前面的類似:選擇地址爲10.1.1.142的機器,雙擊桌面的" TCP&UDP測試工具",右鍵點擊客戶端模式,在下拉列表中,選擇"創建連接",如下圖:
在彈出的窗口中,選擇TCP協議,服務器IP爲10.1.1.33.端口6000,本機隨意IP,如下圖:
點擊創建後,如下圖:
那麼我們看看Wireshark軟件獲取到的客戶端與服務器端之間發送到TCP數據包吧。
獲取的TCP協議的數據包分爲兩部分,即TCP三次握手,四次斷開的數據。在實際的操作中,我們往往還會抓到除了目標地址之外往來到數據包,因此先使用過濾器過濾一下IP源,方便我們查看。
啓動Wireshark,在Filter中輸入tcp,點擊Apply會看到很多的數據包,這是因爲測試環境中,有很多的應用程序,與其服務器連接,使用TCP協議。如下圖:
在這裏,我們已知兩臺機器的IP情況下,可以在filter中輸入"ip.addr == 10.1.1.142 and ip.addr == 10.1.1.33"來過濾出我們想要的數據,點擊工具中的"apply連接"按鈕。如下圖:
在上圖中,70,73,74幀是tcp的三次握手,428,429,430,431幀是四次斷開的數據。
分析握手
通過前面到工作,我們已經找到了想要的數據包,接下來我們將對TCP的三次握手進行詳細分析。
首先我們看TCP包的首部。TCP首部的通用格式如下圖所示:
在上面的圖中,標出了每一個字段,咱今天就說說比較重要的源端口、目標端口、標記。
源端口表明了發送方的輸出端口號。目標端口表示數據包進入接收方的端口號端口對上了,才能正確地將數據包傳達。標記用來表示所傳輸的TCP數據包類型,包括URG、ACK、PSH、RST、SYN和FIN,其中SYN表示同步序號,使用在建立連接時;ACK是確認標誌,表示應答域有效,就是前面所說的接收方對請求方的問候表示禮貌致意;FIN表示發送端以及達到數據末尾,此時雙方就準備揮手告別了。
那麼接下來咱具體分析下三次握手。
乾貨來了!
TCP第一次握手,捕獲的數據包信息如下所示:
從Wireshark的Packet List面板中的Info列可以看到顯示的TCP標誌位是SYN,所以該數據包是客戶端向服務器發送的第一次握手連接。在Packet Details面板中,顯示了該包的詳細信息,下面詳細介紹。
以上信息,表示該包的大小爲62個字節。
以上內容表示源IP是10.1.1.142,目的IP爲10.1.1.33。
以上內容是傳輸層首部的詳細信息,這裏使用TCP協議,其中源端口爲56678,目標端口爲6000。
更多詳細的信息,可以進入合天實戰實驗課程查詢。
接下來是第二次握手,TCP第二次握手捕獲數據包相信信息,如下:
在該界面顯示了第二次握手數據包的詳細信息,其中位於TCP上面的信息與第一次握手時相類似,留給文後照着上面的分析獨立思考。
同樣地,第三次握手也一定沒問題,看下圖:
於是這樣就完成了TCP連接的建立啦~
五 再來看看再見
TCP的四次斷開,也是TCP協議的主要工作之一。那咱也看看四次分手,偶不,四次斷開~TCP第一次斷開連接的數據包如下:
在該界面顯示了TCP第一次斷開,數據包的詳細信息,是不是和握手時的數據包很像?
查看tcp數據包可以看到客戶端向服務器發送FIN和ACK標誌的數據包開始斷開連接,其中FIN和ACK標誌位都爲1。
Source Port: 56678(56678) #源端口號
Destination Port: 6000(6000) #目標端口號
Stream index: 0 #流節點號
TCP Segment Len: 0 #分段長度
Sequence number: 1 (relative sequence number) #序列號
Acknowledgment number: 1 (relative ack number) #確認編號
Header Length: 20 bytes #首部長度
.... 0000 0001 0001 = Flags: 0x011 (FIN,ACK) #標誌位,此處爲(FIN,ACK)
\000. .... .... = Reserved: Not set
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set
.... .0.. .... = ECN-Echo: Not set
.... ..0. .... = Urgent: Not set
.... ...1 .... = Acknowledgment: Not set #確認編號已設置
.... .... 0... = Push: Not set
.... .... .0.. = Reset: Not set
.... .... ..0. = Syn: Set #請求位
.... .... ...1 = Fin: Not set #FIN標誌位
Expert Info (Chat/Sequence): Connection finish (FIN) #專家信息
Connection finish (FIN) #消息內容,連接完成(FIN)
Severity level: Chat #安全級別
Group: Sequence
Window size value: 64240 #窗口大小
Calculated window size: 64240 #估計的窗口大小
Window size scaling factor: -1 (unknown) 窗口大小縮放比例因素
Checksum: 0x16cb [validation disabled] #校驗和
Good Checksum: False
Bad Checksum: False
Urgent pointer: 0
FIN是1表示要分手啦~
在TCP第二次斷開連接的數據包是服務器向客戶端發送的ACK包,其中ACK標誌位爲1。
TCP第三次斷開連接的數據包是服務器向客戶端發送的FIN和ACK包。其中FIN和ACK標誌位爲1。
TCP第四次斷開連接的數據包,客戶端向服務器發送ACK的包。其中,ACK標誌位都爲1。