Python网络编程实战_TCP与UDP协议底层解析与应用

大萱姑娘_6958

大萱姑娘_6958

2026-01-03

195人浏览

原创

三次握手是为解决网络中数据包乱序、丢失、重复问题,通过SYN、SYN+ACK、ACK三步确认双方收发能力并同步初始序列号;UDP因无连接、无重传、无排序而“不可靠”,但低延迟高吞吐,适用于音视频、DNS等场景。

python网络编程实战_tcp与udp协议底层解析与应用

TCP连接的三次握手到底在做什么

三次握手不是为了“打招呼”,而是为了解决网络中数据包乱序、丢失、重复的问题。客户端发SYN,告诉服务端“我想建连,初始序列号是X”;服务端回SYN+ACK,表示“收到,我也准备好了,我的初始序列号是Y,确认你的X+1”;客户端再发ACK,确认收到Y+1。这三步确保双方都具备收发能力,且初始序列号达成一致。

实际写代码时,socket.connect() 调用后,Python底层自动完成这三步。你不需要手动构造SYN包——那是内核协议栈的事。但理解它,能帮你快速定位连接超时、RST重置、TIME_WAIT堆积等常见问题。

UDP为什么“不可靠”却依然被广泛使用

UDP不握手、不重传、不排序、不拥塞控制。它只负责把应用层数据封装成IP包发出,至于对方收没收到、顺序对不对、丢没丢,一概不管。这种“裸奔”模式换来的是极低延迟和高吞吐,适合音视频流、DNS查询、游戏状态同步等场景。

用Python写UDP服务时,socket.bind() 后直接 recvfrom() 即可接收任意来源的数据报;发送用 sendto() 指定目标地址。注意:单个UDP数据报建议控制在512字节以内(避免IP分片),超过65507字节会直接报错。

如何用Python观察真实TCP/UDP通信过程

光看代码不够,得看到底发了什么包。推荐组合使用:Wireshark抓包 + Python socket + 简单服务端/客户端。比如启动一个UDP echo server,用Wireshark过滤 udp.port==8080,就能清楚看到每个sendto对应的UDP帧结构;换成TCP服务器后,还能看到SYN、ACK、PSH、FIN等标志位的实际变化。

Adblock Dns
Adblock Dns

在你的机器上运行DNS服务器,使用Pi-hole黑名单阻止189,000+个广告、追踪器和恶意软件域名,实现全网拦截。

下载

小技巧:

  • 在代码中加 time.sleep(0.1) 控制发送节奏,方便Wireshark逐帧分析
  • 服务端用 setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 避免端口被占用报错
  • 抓包时选择正确的网卡(别抓到环回接口或虚拟机网卡)

TCP粘包问题不是bug,是设计使然

TCP是字节流协议,没有消息边界概念。你调用两次 send(b'hello') 和 send(b'world'),对方可能一次 recv(1024) 就拿到 b'helloworld',也可能分三次收到 b'he' / b'llo' / b'world'。这不是Python的问题,也不是网络问题,而是TCP传输机制决定的。

解决思路只有两种:

  • 固定长度头 + 变长内容:先发4字节表示后续数据长度,再发正文
  • 特殊分隔符:如每条消息末尾加 \n(适合文本协议,但需转义处理)

不要依赖 recv 的调用次数去“对应” send 的次数——这是初学者最常踩的坑。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3208

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5229

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3869

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

486

15

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6487

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2708

6

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

6487

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2708

6

tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.25

563

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程