文章目录

  • 前言
  • 一、前置准备
  • 二、三报文握手过程抓包
    • 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磨损 /耐久性,坏扇区重新分配,离线坏道,未定扇形区&…