1. 程式人生 > >TCP三次握手wireshark抓包分析

TCP三次握手wireshark抓包分析

本文內容有以下三個部分:

  1. wireshark過濾規則
  2. osi模型簡述
  3. tcp三次握手

一、wireshark過濾規則

wireshark只是一個抓包工具,用其他抓包工具同樣能夠分析tcp三次握手協議。以下這張圖片完整地展現了wireshark的面板。

這裡寫圖片描述

使用好wireshark一個關鍵是如何從抓到的眾多的包中找到我們想要的那一個。這裡就要說filter過濾規則了。如上圖,在過濾器方框,我們加上了ip.src==192.168.1.102 or ip.dst==192.168.1.102的過濾規則,意思是在封包列表中,只顯示源ip地址為192.168.1.102或者目的ip地址為192.168.1.102的包。
下面列舉一些常用的過濾規則:

  1. 過濾IP,如來源IP或者目標IP等於某個IP
    如前面說的例子: ip.src==192.168.1.102 or ip.dst==192.168.1.102
    比如TCP,只顯示TCP協議。
  2. 過濾埠
    tcp.dstport == 80 // 只顯tcp協議的目標埠80
    tcp.srcport == 80 // 只顯tcp協議的來源埠80
    也可以寫成tcp.port eq 80 or udp.port eq 80 這樣的模式
  3. 過濾協議
    單獨寫上tcp、udp、xml、http就可以過濾出具體協議的報文。你也可以用tcp or xml這樣格式來過濾。
    我們還可以更加具體過濾協議的內容,如tcp.flags.syn == 0x02 表示顯示包含TCP SYN標誌的封包。
  4. 過濾mac地址
    eth.src eq A0:00:00:04:C5:84 // 過濾來源mac地址
    eth.dst==A0:00:00:04:C5:84 // 過濾目的mac地址
  5. http模式過濾
    http.request.method == “GET”
    http.request.method == “POST”
    http.request.uri == “/img/logo-edu.gif”
    http contains “GET”
    http contains “HTTP/1.”
    // GET包
    http.request.method == “GET” && http contains “Host: ”
    http.request.method == “GET” && http contains “User-Agent: ”
    // POST包
    http.request.method == “POST” && http contains “Host: ”
    http.request.method == “POST” && http contains “User-Agent: ”
    // 響應包
    http contains “HTTP/1.1 200 OK” && http contains “Content-Type: ”
    http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “
  6. 過濾內容
    contains:包含某字串
    ip.src==192.168.1.107 and udp contains 02:12:21:00:22
    ip.src==192.168.1.107 and tcp contains “GET”
    前面也有例子,http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “

更加高階的用法就不討論了,讀者有興趣可以查閱wireshark官網使用者手冊

二、osi模型簡述

OSI定義了網路互連的七層框架(物理層、資料鏈路層、網路層、傳輸層、會話層、表示層、應用層),即ISO開放互連繫統參考模型。如下圖左邊部分。在每個分層中,都會對所傳送的資料附加一個首部,在這個首部中包含了該層必要的資訊,如源ip地址和目的ip地址等。
這裡寫圖片描述
osi模型中,在下一層的角度看,當收到上一層的包時,全部會被認為是本層的資料,然後在本層中加上自己本層的首部,繼續往下傳遞。一個數據包格式如下:
這裡寫圖片描述
舉一個例子,比如客戶端應用程式A向遠端伺服器應用程式B傳送“早上好”的資料,那麼大致流程是這樣的:

  1. 應用程式A把資料傳送給下一層的TCP模組。
  2. TCP模組屬於傳輸層。TCP在應用層資料的前端加上一個TCP首部。TCP首部中包含源埠號和目標埠號等資訊。然後將包傳送給IP模組。
  3. IP模組屬於網路層。IP將TCP傳過來的TCP首部和TCP資料合起來當做自己的資料,並且在TCP首部的前面加上自己的IP首部。IP首部包含了源ip地址和目的ip地址。然後,IP包將被髮送給資料鏈路層,也就是乙太網驅動程式。
  4. 從IP傳過來的包,對於乙太網驅動程式來說不過就是資料。給這些資料加上乙太網首部,裡面包含了源MAC地址和目的MAC地址。然後再通過物理層把資料傳送給目的MAC地址。
  5. 伺服器物理層接收到來自客戶端的資料包時,首先從乙太網的包首部找到MAC地址,判斷是否為發給自己的包,如果不是就丟棄,如果是就向上轉移給IP模組解析。
  6. IP模組收到IP包首部和後面的資料以後,判斷包首部的目的ip地址與自己的ip地址是否匹配,如果匹配,就接收資料並傳給TCP模組處理。
  7. TCP模組會檢查埠號確定接收資料的應用程式是哪一個。
  8. 應用程式接收到資料包之後也會根據自己的規則判斷做出一系列的處理。

通過上面例子大致的過程,可以體會到從上而下發包再到從下而上收包的過程。

三、tcp三次握手

這裡寫圖片描述
上圖為tcp三次握手,很多書籍都能看到。TCP提供面向有連線的通訊傳輸,在資料通訊開始之前先做好通訊兩端之間的準備工作。也就是說必須握手成功之後,才能進行通訊。 接下來,用wireshark來抓取tcp三次握手報文。開啟瀏覽器輸入 http://blog.csdn.net/u014530704/article/。運用我們再前面介紹的過濾規則,在過濾框中輸入http contains u014530704,找到如下包:
這裡寫圖片描述

可以發現我們向伺服器請求的包,其中目的ip地址是47.95.165.112。這個地址是blog.csdn.net的ip地址。
然後我們找 ip.src==47.95.165.112 or ip.dst==47.95.165.112 的包,找到了如下:

這裡寫圖片描述
紅色方框為本機192.168.1.101和伺服器47.95.165.112之間的三次握手協議。三次握手協議的過程為:

  1. 客戶端通過TCP首部發送一個SYN包作為建立連線的請求等待確認應答。
  2. 伺服器傳送ACK包確認應答,傳送SYN包請求連線。
  3. 客戶端針對SYN包傳送ACK包確認應答。

最後,講述一下看懂報文的方法。想要讀懂tcp報文,頭部至關重要,對著下圖去看wireshark tcp報文,並且找到tcp首部各個欄位代表的意思,你就能讀懂tcp報文了。其他像乙太網報文、ip報文、http報文等同樣如此。

這裡寫圖片描述