計算機網絡學習筆記:Wireshark觀察TCP通信

文章目錄

  • 前言
  • 一、前置準備
  • 二、三報文握手過程抓包
    • 2.1、第一次握手
    • 2.2、第二次握手
    • 2.3、第三次握手
  • 三、通信過程抓包
    • 3.1、報文 44379 – 客戶端發數據(PSH, ACK)
    • 3.2、 報文 44380 – 服務端確認收到數據(ACK)
    • 3.3、報文 44469 – 服務端回顯(PSH, ACK)
    • 3.4、報文 44470 – 客戶端確認收到回顯(ACK)
  • 四、四報文握手過程抓包
    • 4.1、第一次揮手
    • 4.2、第二次揮手
    • 4.3、第三次揮手
    • 4.4、第四次揮手


前言

??Wireshark是一款功能強大的網絡抓包和協議分析工具,用于實時捕獲和解析網絡通信數據,幫助用戶診斷網絡問題、分析協議細節或進行安全審計。
??本篇將用Wireshark工具對TCP通信案例進行抓包,分析三報文握手四報文揮手

一、前置準備

??服務端案例工程:

public class BIOServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(1848);System.out.println("EchoServer started on port 1848");//阻塞Socket clientSocket = serverSocket.accept();handleClient(clientSocket);}private static void handleClient(Socket clientSocket) {try(OutputStream out = clientSocket.getOutputStream();InputStream in = clientSocket.getInputStream()){byte[] bytes = new byte[1024];int len;while ((len = in.read(bytes))!= -1){out.write(bytes, 0, len);out.flush(); // 回顯}}catch (Exception e){System.out.println("Client disconnected");}}
}

??客戶端案例工程:

public class BIOClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 1848);OutputStream out = socket.getOutputStream();InputStream in = socket.getInputStream();out.write(("Hello Server:" + Thread.currentThread().getName()).getBytes());out.flush();byte[] buffer = new byte[1024];int len = in.read(buffer);System.out.println("Server Echo: " + new String(buffer, 0, len));socket.close();}
}

??Wireshark工具設置,選擇Adapter for loopback traffic capture
在這里插入圖片描述
??設置抓包過濾選項,為案例中的端口號1848
在這里插入圖片描述

二、三報文握手過程抓包

??案例工程中,三報文握手在java層面體現在客戶端的這一行代碼上,創建 Socket 時,會自動連接服務端并完成三次握手;

Socket socket = new Socket("localhost", 1848); 

??服務端阻塞在 accept(),等待連接;一旦返回,說明三次握手完成;

Socket clientSocket = serverSocket.accept(); 

??先啟動服務端,再啟動客戶端:
在這里插入圖片描述
進入斷點,準備建立連接
在這里插入圖片描述
??釋放客戶端的斷點,進入服務端的處理消息的邏輯:
在這里插入圖片描述
??此時三報文握手的過程已經結束了,觀察Wireshark
在這里插入圖片描述

2.1、第一次握手

??第一次握手的報文10358 371.405938 127.0.0.1 127.0.0.1 TCP 56 49931 → 1848 [SYN] Seq=0 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM 解釋:

字段含義
10358報文編號,在這次抓包中的編號
371.405938抓包開始后的時間戳(秒)
127.0.0.1 → 127.0.0.1源 IP 和目的 IP(都是 localhost)
TCP協議類型
56報文字節數(含 TCP 首部)
49931 → 1848源端口(49931,客戶端臨時端口)到目標端口(1848,服務端監聽端口)
[SYN]報文類型標志(發起連接請求)
Seq=0初始序列號,客戶端初始發送序號
Win=65535窗口大小(接收緩沖區大小)
Len=0數據長度(SYN 報文本身不帶數據)
MSS=65495最大報文段長度(Maximum Segment Size)是對方發送給我的最大 TCP 有效載荷,協商用
WS=256窗口擴大因子(Window Scale),用于擴大窗口大小(65535×256)
SACK_PERM表示支持選擇確認(Selective Acknowledgement),提高網絡性能

2.2、第二次握手

??第二次握手的報文10359 371.405972 127.0.0.1 127.0.0.1 TCP 56 1848 → 49931 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=65495 WS=256 SACK_PERM的解釋:

字段含義
10359報文編號
371.405972時間戳
1848 → 49931服務端端口(1848)回應客戶端臨時端口(49931)
[SYN, ACK]服務端回應連接請求,并確認客戶端的 SYN 報文
Seq=0服務端自己的初始序列號為 0
Ack=1確認號 = 客戶端 Seq(0)+ 1,表示收到了客戶端的 SYN,對于第一次握手中的seq的確認
Win=65535服務端窗口大小
Len=0無負載數據,僅握手信息
MSS=65495服務端協商的最大段大小
WS=256服務端窗口擴展因子
SACK_PERM服務端也支持 SACK

2.3、第三次握手

??第三次握手的報文10360 371.405991 127.0.0.1 127.0.0.1 TCP 44 49931 → 1848 [ACK] Seq=1 Ack=1 Win=327424 Len=0的含義:

字段含義
49931 → 1848客戶端端口 → 服務端端口
[ACK]確認包,確認服務端的 [SYN, ACK]
Seq=1客戶端的下一個發送序列號(上次 SYN 是 Seq=0,這次是 1)
Ack=1確認號:表示已收到服務端 Seq=0 的 [SYN] 報文(對于服務端seq的確認)
Win=327424窗口大小(注意,這里乘了窗口縮放因子)
Len=0僅為控制報文,無負載數據

??針對原理圖,理論聯系實際,從上面的握手報文可以看出,除了最關鍵的SYN,ACK,seq,ack以外,;還體現出了對于TCP參數的協商,例如最大段大小,窗口大小,數據長度等
在這里插入圖片描述

三、通信過程抓包

??在案例工程中,通信過程體現在客戶端發送:

out.write(("Hello Server:" + Thread.currentThread().getName()).getBytes());

??服務端接收并回顯:

while ((len = in.read(bytes))!= -1){out.write(bytes, 0, len); // echo 回顯out.flush();
}

在這里插入圖片描述

報文號時間戳源 → 目標標志位Seq/AckLen說明
443791279.76265549931 → 1848[PSH, ACK]Seq=1 Ack=117客戶端發送“Hello Server…”
443801279.7626821848 → 49931[ACK]Seq=1 Ack=180服務端確認收到了數據
444691283.1365511848 → 49931[PSH, ACK]Seq=1 Ack=1817服務端回顯“Hello Server…”
444701283.13656649931 → 1848[ACK]Seq=18 Ack=180客戶端確認收到了回顯

3.1、報文 44379 – 客戶端發數據(PSH, ACK)

??49931 → 1848 [PSH, ACK] Seq=1 Ack=1 Len=17

  • 客戶端發送數據(17 字節),“Hello Server:main”;
  • PSH(Push)表示告訴 TCP 層立即發送,無需等待緩沖區滿;
  • Seq=1 是三次握手后起始序列號,這里是重點,因為客戶端的第三次握手,報文段沒有攜帶數據,不占用seq,所以這次的seq還是從1開始。
  • Ack=1 表示仍然確認了服務端的 SYN。

3.2、 報文 44380 – 服務端確認收到數據(ACK)

??1848 → 49931 [ACK] Seq=1 Ack=18 Len=0

  • 服務端發送確認 ACK,表示已收到客戶端發送的 17 字節(1+17=18);
  • 這是純 ACK,不帶數據。

3.3、報文 44469 – 服務端回顯(PSH, ACK)

??1848 → 49931 [PSH, ACK] Seq=1 Ack=18 Len=17

  • 服務端將收到的數據原樣回顯;
  • PSH 表示回顯數據立即發送;
  • Seq=1 是服務端自己的起始序列號;
  • Ack=18 表示還在確認客戶端數據;

3.4、報文 44470 – 客戶端確認收到回顯(ACK)

??49931 → 1848 [ACK] Seq=18 Ack=18 Len=0

  • 客戶端收到回顯后發出確認 ACK;
  • Seq=18 表示客戶端準備下次發送的序號(之前發了 17 字節);
  • Ack=18 表示收到了服務端的 17 字節(1+17=18)。

四、四報文握手過程抓包

??案例工程中,四報文揮手在java層面體現在客戶端的這一行代碼上,通信完成關閉連接時,會通知服務端斷開連接,進行四報文揮手的流程;

socket.close();

??執行斷點:
在這里插入圖片描述

在這里插入圖片描述
三報文握手和四報文揮手,都是客戶端發起的

報文號時間戳方向標志位Len說明
468921380.87359149931 → 1848[FIN, ACK]0客戶端主動斷開連接
468931380.8736091848 → 49931[ACK]0服務端確認客戶端 FIN
469021380.8740911848 → 49931[FIN, ACK]0服務端也準備斷開連接
469031380.87411449931 → 1848[ACK]0客戶端確認服務端 FIN,連接徹底關閉

4.1、第一次揮手

??第一次揮手報文段46892 1380.873591 127.0.0.1 127.0.0.1 TCP 44 49931 → 1848 [FIN, ACK] Seq=18 Ack=18 Win=327424 Len=0的解釋:

字段含義
46892報文編號
1380.873591抓包開始以來的時間戳(秒)
127.0.0.1 → 127.0.0.1客戶端 → 服務端
TCP協議類型
44報文長度(含 TCP 頭部)
49931 → 1848客戶端臨時端口 → 服務端端口
[FIN, ACK]標志位:客戶端請求關閉連接,同時確認服務端數據
Seq=18序列號,表示上一次客戶端發送的數據是以 Seq=17 結尾的(如 “Hello Server” 17 字節),FIN 占用 1
Ack=18確認號:客戶端已收到服務端 Seq=0~17 的數據
Win=327424客戶端窗口大小
Len=0無數據,僅控制報文

4.2、第二次揮手

??第二次揮手報文段46893 1380.873609 127.0.0.1 127.0.0.1 TCP 44 1848 → 49931 [ACK] Seq=18 Ack=19 Win=2161152 Len=0的解釋:

字段含義
46893報文編號
1380.873609時間戳
1848 → 49931服務端端口 → 客戶端端口
[ACK]服務端確認客戶端關閉請求
Seq=18服務端數據已經發到 Seq=17,FIN 尚未發送
Ack=19確認號:確認客戶端 FIN,占用一個序號(Seq=18 → Ack=19)
Win=2161152服務端窗口大小
Len=0僅 ACK,沒有數據

4.3、第三次揮手

??第三次揮手報文段46902 1380.874091 127.0.0.1 127.0.0.1 TCP 44 1848 → 49931 [FIN, ACK] Seq=18 Ack=19 Win=2161152 Len=0的解釋:

字段含義
46902報文編號
1380.874091時間戳
1848 → 49931服務端 → 客戶端
[FIN, ACK]服務端請求關閉,同時 ACK
Seq=18服務端發出 FIN,占用序號 18(和第二次揮手一致,因為過程中沒有發送其他數據)
Ack=19繼續確認客戶端的 FIN
Win=2161152服務端窗口大小
Len=0無數據,僅控制位

4.4、第四次揮手

??第四次揮手報文段46903 1380.874114 127.0.0.1 127.0.0.1 TCP 44 49931 → 1848 [ACK] Seq=19 Ack=19 Win=327424 Len=0的解釋:

字段含義
46903報文編號
1380.874114時間戳
49931 → 1848客戶端 → 服務端
[ACK]客戶端確認服務端的關閉
Seq=19客戶端上一次是 Seq=18,FIN 占 1,+1 到 19
Ack=19表示已經收到服務端的 FIN(Seq=18)
Win=327424客戶端窗口大小
Len=0無數據

在這里插入圖片描述


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85611.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Linux中,Iptables能做什么?

概述 背景說明 在運維工作中,Iptables是一個不可或缺的工具,它提供了強大的網絡流量控制和管理能力。 問題呈現 iptables是一個不可獲取的工具,你對其了解多少?該工具你是否真的會用?詳細功能對應的應用場景你是否…

Linux——linux的基本命令

目錄 一、linux的目錄結構 二、絕對路徑和相對路徑 三、文件類型(linux下所有東西都可看作文件) 四、文件的權限 五、文件權限的修改(chmod) 六、linux常用的命令 七、文件查看命令 八、文件編輯命令 九、文件壓縮與解壓…

智慧水利數字孿生解決方案:百川孿生智領千行,100+標桿案例賦能智慧水利全域升級

在數字技術革命與產業變革深度交織的浪潮下,智慧水利作為保障國家水安全、推動水利高質量發展的核心載體,正以數字孿生技術為引擎,驅動水利行業從“經驗驅動”向“數據驅動”轉型。 山東融谷作為智慧水利數字孿生領域的創新實踐者&#xff0c…

深入解析ID3算法:信息熵驅動的決策樹構建基石

本文來自「大千AI助手」技術實戰系列,專注用真話講技術,拒絕過度包裝。 ID3(Iterative Dichotomiser 3) 是機器學習史上的里程碑算法,由Ross Quinlan于1986年提出。它首次將信息論引入決策樹構建,奠定了現代…

Java解析audio時長

前提需要電腦上先安裝后ffmpeg public long parseDuration(String audioPath) {long durationMs -1;try {Process process Runtime.getRuntime().exec("ffprobe " audioPath);// InputStream is process.getInputStream();InputStream is process.getErrorStrea…

python學智能算法(十五)|機器學習樸素貝葉斯方法進階-CountVectorizer多文本處理

【1】引言 前序學習進程中,已經學習CountVectorizer文本處理的簡單技巧,先相關文章鏈接為: python學智能算法(十四)|機器學習樸素貝葉斯方法進階-CountVectorizer文本處理簡單測試-CSDN博客 此次繼續深入&#xff0…

AiPy 監控視頻智能監察:人像一鍵抽取+可反復執行程序落地

兄弟們,不知道你們有沒有過查監控的經歷,雖然現在監控攝像頭是越來越多,硬盤越塞越滿,但真出了事兒,回放查錄像堪比大海撈針!純人工一幀幀的去找,能把眼睛盯瞎還是人影都找不到。不過我最近搞了…

期貨反向跟單-終止盤手合作原則(二)

在期貨反向跟單的領域中,數據就是實打實的真金白銀,是策略能否持續盈利的核心價值所在。然而,許多團隊在實際運營過程中,都遭遇了相似的困境:期初策略運轉良好,可隨著時間推移,數據表現卻每況愈…

【Unity】MiniGame編輯器小游戲(三)馬賽克【Mosaic】

更新日期:2025年6月17日。 項目源碼:后續章節發布 索引 馬賽克【Mosaic】一、游戲最終效果二、玩法簡介三、正式開始1.定義游戲窗口類2.規劃游戲窗口、視口區域3.地圖方塊陣列①.定義方塊結構體②.生成方塊陣列③.計算九宮格黑色方塊數量④.排除任意九宮…

基于深度學習的智能圖像質量評估系統:技術與實踐

前言 在數字圖像處理和計算機視覺領域,圖像質量評估(Image Quality Assessment, IQA)是一個重要的研究方向。圖像質量評估的目標是通過算法自動評估圖像的質量,包括清晰度、對比度、噪聲水平等。傳統的圖像質量評估方法主要依賴于…

【Golang面試題】Go語言實現請求頻率限制

Go語言實現請求頻率限制:從計數器到令牌桶的完整指南 在實際開發中,接口被惡意刷請求是常見問題。本文將深入探討Go語言中四種主流的請求限流方案,從簡單到復雜逐步深入,助你構建高可用服務。 一、基礎方案:計數器法…

11Labs 增長負責人分享:企業級市場將從消費級或開發者切入丨Voice Agent 學習筆記

本文摘自 Founder Park AI 產品如何做增長,ElevenLabs的案例很值得學習。 專注于 AI 語音生成的獨角獸企業 ElevenLabs 可以說一直在高速增長。在今年 1 月完成 1.8 億美元 C 輪融資后,ElevenLabs 的估值突破 30 億,直指 33 億美元。2024 年…

Linux 命令:grep

概述 在Linux系統里,grep是一款十分實用的命令行工具,它主要用于在文件或者輸入流中搜索符合特定模式的文本。下面為你詳細介紹它的用法。資料已經分類整理好:https://pan.quark.cn/s/26d73f7dd8a7 基本語法 grep [選項] 搜索模式 [文件..…

Java八股文——MySQL「架構篇」

MySQL主從復制了解嗎 面試官您好,我了解MySQL的主從復制。它是構建高可用、高可擴展數據庫架構的核心基石。 1. 主從復制的核心原理與流程 整個主從復制的過程,就是一場圍繞 binlog(二進制日志) 的“接力賽”。這個過程主要可以…

ubuntu下python版本升級導致pyqt不能正常運行解決

最終解決方案 ubuntu下多python版本pyqt兼容性問題解決 python3.9 -m pip install --upgrade --force-reinstall --prefer-binary pyqt5)嘗試解決方案一(失敗) 系統默認python版本可以,其他版本不行 sudo apt install pyqt5-dev-tools嘗試解決方案二(失敗) 一直…

AIGC工具平臺-VideoRetalking音頻對口型數字人

唇形合成技術正逐漸成為AIGC內容生產領域的重要工具,能夠實現音視頻數據的高度融合。基于VideoRetalking模塊的可視化界面降低了技術門檻,使非技術背景的用戶也能便捷體驗唇形驅動數字人合成的流程。 本文重點解析該模塊的使用方式及開發流程&#xff0…

前端項目如何部署為https

如何為項目部署設置HTTPS 設置HTTPS是保護網站數據傳輸安全的重要步驟。以下是設置HTTPS的主要方法: 1. 獲取SSL/TLS證書 免費證書選項 Let’s Encrypt:最流行的免費證書頒發機構Cloudflare:提供免費SSL和CDN服務ZeroSSL:另一…

nginx 配置 系統升級頁面

默認80端口配置如下: server {listen 80; # 指定端口號server_name 192.168.2.96; # 替換為實際域名或IP# 全局重定向到升級頁面(排除自身防循環)if ($request_uri !~* "/upgrade.html") {return 307 /upgrade.html; # 臨時重定…

計算機基礎(一)——設計模式

一、設計模式 設計模式(Design Patterns)是軟件開發中反復出現問題的解決方案的通用描述。 它是經過總結、提煉的高效代碼結構和設計方案,幫助開發者寫出更靈活、可維護和可擴展的代碼。 優點注意點規范代碼結構,提高開發效率設…

Mac電腦 磁盤檢測和監控工具 DriveDx

DriveDx Mac 一款不監視驅動器的內置S.M.A.R.T.狀態的先進驅動器運行狀況診斷和監測工具。 還分析了所有驅動器健康密切相關的指標, SSD或硬盤驅動器故障(像SSD磨損 /耐久性,壞扇區重新分配,離線壞道,未定扇形區&…