尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Wireshark结合Python脚本模拟TCP连接,可视化解析握手与挥手数据流
1. 为什么需要本地模拟TCP连接很多网络教程都会用浏览器访问网站的方式来演示TCP协议但这种方式有个明显的问题实际抓包时会混入大量HTTP协议的数据干扰我们对TCP协议本身的理解。我自己刚开始学网络协议时就踩过这个坑——看着密密麻麻的数据包完全分不清哪些是TCP握手哪些是HTTP请求。后来发现用Python脚本模拟TCP通信才是更干净的方案。通过编写简单的客户端/服务器程序我们可以精确控制每个数据包的发送时机和内容。配合Wireshark抓取本地回环(127.0.0.1)的数据就能像看慢动作回放一样观察TCP连接的每个细节。这种方法的优势很明显数据纯净没有HTTP等上层协议的干扰完全可控可以随时暂停、重放通信过程深度定制能模拟各种异常场景如突然断网2. 环境准备与工具配置2.1 安装必要软件首先确保你的电脑上已经安装Wireshark官网下载最新版安装时记得勾选Install WinPcapPython 3.x建议3.6以上版本自带socket库无需额外安装我测试时用的是Wireshark 3.6和Python 3.8这两个版本组合非常稳定。如果遇到权限问题记得以管理员身份运行Wireshark。2.2 配置Wireshark过滤器打开Wireshark后选择捕获Loopback网卡本地回环接口。在捕获过滤器中输入tcp port 12345这样只会显示我们测试用的端口数据避免其他干扰。如果你改用了其他端口号记得同步修改这里的过滤条件。提示初次使用可能会看到大量SSDP或MDNS协议的包这些都是系统服务产生的不用理会。只要确保后续能抓到我们脚本产生的TCP包即可。3. Python实现TCP通信脚本3.1 基础版服务器代码先来看一个最简单的TCP服务器实现import socket def start_server(): server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((127.0.0.1, 12345)) server_socket.listen(1) print(服务器启动等待连接...) conn, addr server_socket.accept() print(f接收到来自 {addr} 的连接) data conn.recv(1024) print(f收到数据: {data.decode()}) conn.sendall(bHello from server) conn.close() server_socket.close() if __name__ __main__: start_server()这段代码做了以下几件事创建TCP socket绑定到本地回环地址的12345端口开始监听连接接受客户端连接后接收数据发送响应并关闭连接3.2 增强版客户端代码对应的客户端代码稍复杂些我们增加了连接状态打印和手动控制import socket import time def tcp_client(): client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) print(准备连接服务器...) client_socket.connect((127.0.0.1, 12345)) print(连接成功) message input(输入要发送的消息(回车发送): ) client_socket.sendall(message.encode()) print(等待服务器响应...) response client_socket.recv(1024) print(f服务器回复: {response.decode()}) input(按回车键断开连接...) client_socket.close() print(连接已关闭) if __name__ __main__: tcp_client()关键设计点使用input()让用户可以控制发送和断开时机添加了连接状态提示方便观察程序执行流程显式调用close()确保连接正确关闭4. 抓包分析TCP三次握手4.1 执行流程先运行服务器脚本打开Wireshark开始捕获运行客户端脚本在客户端输入任意消息并发送这时Wireshark会捕获到类似下面的数据流1 0.000000 127.0.0.1 → 127.0.0.1 TCP 74 50782 → 12345 [SYN] Seq0 Win65535 2 0.000023 127.0.0.1 → 127.0.0.1 TCP 74 12345 → 50782 [SYN, ACK] Seq0 Ack1 Win65535 3 0.000106 127.0.0.1 → 127.0.0.1 TCP 66 50782 → 12345 [ACK] Seq1 Ack1 Win655354.2 握手细节解析第一次握手SYN客户端发送SYN1, Seq0这表示客户端请求建立连接并初始化序列号第二次握手SYNACK服务器回应SYN1, ACK1, Seq0, Ack1Ack1表示已收到客户端的SYN期待下一个序号为1的数据包同时服务器也发送自己的SYN请求第三次握手ACK客户端发送ACK1, Seq1, Ack1确认收到服务器的SYN连接正式建立注意实际序列号不会真的是0这里是为了便于理解。Wireshark显示的是相对序列号。5. 四次挥手过程详解5.1 触发挥手在客户端脚本中当我们按下回车键时会执行socket.close()这时就会触发TCP的四次挥手过程。Wireshark会捕获到类似下面的数据4 12.345678 127.0.0.1 → 127.0.0.1 TCP 66 50782 → 12345 [FIN, ACK] Seq101 Ack201 Win65535 5 12.345701 127.0.0.1 → 127.0.0.1 TCP 66 12345 → 50782 [ACK] Seq201 Ack102 Win65535 6 12.345789 127.0.0.1 → 127.0.0.1 TCP 66 12345 → 50782 [FIN, ACK] Seq201 Ack102 Win65535 7 12.345812 127.0.0.1 → 127.0.0.1 TCP 66 50782 → 12345 [ACK] Seq102 Ack202 Win655355.2 挥手步骤拆解第一次挥手FIN主动关闭方客户端发送FIN1, ACK1进入FIN_WAIT_1状态第二次挥手ACK被动关闭方服务器回应ACK客户端进入FIN_WAIT_2状态服务器进入CLOSE_WAIT状态第三次挥手FIN服务器处理完数据后发送FIN进入LAST_ACK状态第四次挥手ACK客户端回应ACK服务器立即关闭连接客户端进入TIME_WAIT状态等待2MSL后关闭5.3 为什么是四次挥手这是因为TCP是全双工协议每个方向都需要单独关闭。当客户端发送FIN时只是表示它没有数据要发送了但还可以接收数据。服务器需要先ACK这个FIN等自己也没有数据要发送时再发送自己的FIN。6. 数据传输过程分析6.1 正常数据传输在三次握手之后四次挥手之前客户端和服务器会进行实际的数据传输。在我们的例子中这对应着客户端发送消息和服务器回复的过程。Wireshark会显示类似这样的数据包4 1.234567 127.0.0.1 → 127.0.0.1 TCP 81 50782 → 12345 [PSH, ACK] Seq1 Ack1 Win65535 Len15 5 1.234590 127.0.0.1 → 127.0.0.1 TCP 66 12345 → 50782 [ACK] Seq1 Ack16 Win65535 6 1.234678 127.0.0.1 → 127.0.0.1 TCP 81 12345 → 50782 [PSH, ACK] Seq1 Ack16 Win65535 Len17 7 1.234701 127.0.0.1 → 127.0.0.1 TCP 66 50782 → 12345 [ACK] Seq16 Ack18 Win65535关键点说明PSH标志表示有应用层数据需要尽快处理每个数据包都会带有ACK确认之前的接收序列号会随着数据长度递增6.2 重传机制观察为了观察TCP的重传机制我们可以修改客户端代码在发送数据后立即关闭网络接口禁用网卡。这时Wireshark会显示类似下面的重传记录8 2.000000 127.0.0.1 → 127.0.0.1 TCP [Retransmission] 81 50782 → 12345 [PSH, ACK] Seq1 Ack1 Win65535 Len15 9 4.000000 127.0.0.1 → 127.0.0.1 TCP [Retransmission] 81 50782 → 12345 [PSH, ACK] Seq1 Ack1 Win65535 Len15 10 8.000000 127.0.0.1 → 127.0.0.1 TCP [Retransmission] 81 50782 → 12345 [PSH, ACK] Seq1 Ack1 Win65535 Len15可以看到TCP采用了指数退避的重传策略第一次重传间隔约2秒第二次约4秒第三次约8秒。7. 常见问题与调试技巧7.1 连接被拒绝问题如果遇到ConnectionRefusedError通常有以下几种可能服务器没有运行端口号不匹配防火墙阻止了连接解决方法检查服务器是否已启动确认客户端和服务器使用相同端口临时关闭防火墙测试7.2 Wireshark看不到数据包如果Wireshark没有捕获到任何数据尝试确认选择了正确的网卡Loopback检查过滤器语法是否正确以管理员身份运行Wireshark7.3 序列号理解技巧Wireshark默认显示相对序列号从0开始这在大多数情况下更方便阅读。如果需要查看绝对序列号可以右键任意TCP包选择Protocol Preferences取消勾选Relative sequence numbers8. 扩展应用场景掌握了基础TCP通信分析后可以进一步探索8.1 模拟网络延迟通过修改Python代码可以模拟各种网络条件import time # 在send和recv之间添加延迟 time.sleep(1.5) # 模拟1.5秒网络延迟8.2 测试大文件传输修改代码支持文件传输观察TCP窗口缩放和流量控制# 服务器端接收文件 with open(received_file, wb) as f: while True: data conn.recv(4096) if not data: break f.write(data)8.3 分析TCP状态机通过netstat -ano命令可以查看实时的TCP连接状态配合Wireshark抓包可以完整跟踪TCP状态机的变化过程。
RELATED

相关推荐

搜索引擎如何工作?为何是信息时代的导航仪?

搜索引擎如何工作?为何是信息时代的导航仪?

1. 搜索引擎的核心工作原理每天我们打开电脑或手机,第一件事可能就是打开搜索引擎查找信息。但你是否想过,当你在搜索框输入关键词点击"搜索"后,背后发生了什么?搜索引擎就像一个不知疲倦的图书管理员,它需要…

📅 2026/9/12 2:36:59
拨动光的开关:金属度贴图如何深刻地改变渲染

拨动光的开关:金属度贴图如何深刻地改变渲染

引子:一场"平行世界"的对照实验 让我们做一个思想实验。 假设你面前有一个纯白色的球体,一个 3D 模型。它的基础色是白色,摆在一个布置精美的场景里——身后有一扇透光的窗户,头顶挂着一盏暖黄的灯,四周是错…

📅 2026/8/5 23:33:56
【实战指南】STM32内部FLASH模拟EEPROM:从原理到HAL库驱动详解

【实战指南】STM32内部FLASH模拟EEPROM:从原理到HAL库驱动详解

1. STM32内部FLASH基础认知第一次接触STM32内部FLASH时,我误以为它只能存储程序代码。直到某次项目需要保存设备参数,才发现这块"宝藏区域"还能当EEPROM用。STM32全系列芯片都内置FLASH存储器,但不同型号容量差异很大——从16KB到1…

📅 2026/8/31 17:31:26
MORE NEWS

更多资讯

📰

ClickHouse ReplacingMergeTree引擎:数据去重与实时更新实战

1. ReplacingMergeTree引擎的核心定位与适用场景在ClickHouse的MergeTree引擎家族中,ReplacingMergeTree是一个专门处理数据去重问题的特殊成员。与基础版MergeTree相比,它最大的特点就是能够在后台合并过程中自动消除具有相同排序键的重复数据行。这种设…

📰

Leptos 无宏编程实战:用纯 Rust 函数式 API 构建计数器组件(counter_without_macros 示例详解)

Leptos 无宏编程实战:用纯 Rust 函数式 API 构建计数器组件(counter_without_macros 示例详解) 【免费下载链接】leptos Build fast web applications with Rust. 项目地址: https://gitcode.com/GitHub_Trending/le/leptos 本文基于 L…

📰

虚拟电厂中P2G-CCS与燃气掺氢技术的Matlab建模与优化

1. 项目背景与核心概念解析在能源转型的大背景下,虚拟电厂(Virtual Power Plant, VPP)作为聚合分布式能源资源的新型运营模式,正成为电力系统灵活性的重要来源。本项目聚焦于两个关键技术方向:P2G-CCS耦合系统与燃气掺…

📰

.NET MAUI 跨平台布局系统深度解析:Layout、Measure/Arrange 与平台适配原理

.NET MAUI 跨平台布局系统深度解析:Layout、Measure/Arrange 与平台适配原理 【免费下载链接】maui .NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop. 项目地址: https…

📰

NATS Server 发布工作流全解析:发布周期、语义化版本与支持策略

NATS Server 发布工作流全解析:发布周期、语义化版本与支持策略 【免费下载链接】nats-server High-Performance server for NATS.io, the cloud and edge native messaging system. 项目地址: https://gitcode.com/GitHub_Trending/na/nats-server 导读 本…

📰

WorkBuddy创建专家全攻略:从智能体设计到自动化落地

1. WorkBuddy不像你想的那么简单——先搞懂“创建专家”到底在做什么我最早接触WorkBuddy,是看到有人拿它处理表格、盯群消息、定时发周报,以为又是一个套壳的聊天机器人。真正上手之后才发现,这个工具的底层逻辑完全不是“你问我答”&#x…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬