Python 网络编程:TCP 与 UDP 的区别详解
1. TCP 协议概述
TCP(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
1.1 TCP 通信流程
TCP 通信类似于生活中的打电话,通信开始前一定要先建立相关的连接。主要包含三个步骤:
本文详细解析了 Python 网络编程中 TCP 与 UDP 两种核心传输层协议的区别。内容涵盖 TCP 的三次握手、四次挥手、可靠传输机制及优缺点,并提供了完整的 TCP 文件下载客户端与服务端代码示例。同时补充了 UDP 协议的无连接特性及基础编程实现。文章最后通过对比表格总结了两者在连接性、可靠性、传输速度及适用场景上的差异,帮助开发者根据实际需求选择合适的协议。

TCP(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
TCP 通信类似于生活中的打电话,通信开始前一定要先建立相关的连接。主要包含三个步骤:
| 优点 | 缺点 |
|---|---|
| 可靠、稳定 | 传输速度慢 |
| 适合传输大量数据 | 占用系统资源高 |
对网络通讯质量有较高要求的应用场景:
客户端与服务端建立连接的过程称为三次握手:
断开连接的过程称为四次挥手:
TCP 严格区分客户端与服务端。以下是一个基于 TCP 的文件下载器示例(同步下载)。
import socket
if __name__ == '__main__':
# 创建 tcp 客户端套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 和服务端程序建立连接
tcp_client_socket.connect(("127.0.0.1", 8989))
# 接收用户下载的文件名数据
file_name = input("请输入您要下载的文件名:")
# 对字符串进行编码成为二进制数据
file_name_data = file_name.encode("utf-8")
# 发送数据
tcp_client_socket.send(file_name_data)
# 指定路径,先把文件创建到指定路径,然后在打开文件写入数据
save_path = "/home/python/Desktop/"
with open(save_path + file_name, "wb") as file:
# 循环接收服务端发送的文件二进制数据
while True:
# 接收一次服务端发送的数据
file_data = tcp_client_socket.recv(1024)
if file_data:
# 循环往文件中写入数据
file.write(file_data)
else:
# 服务端发送文件完成
break
print("文件下载完成")
except Exception as e:
print(f"发生错误:{e}")
finally:
# 关闭套接字
tcp_client_socket.close()
import socket
import os
if __name__ == '__main__':
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置 socket 选项,程序退出端口号立即释放,可以复用端口号
# 提示:默认是 tcp 断开连接,但真正释放端口号需要等待 1-2 分钟
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 给程序绑定端口号
tcp_server_socket.bind(("", 8989))
# 设置监听
tcp_server_socket.listen(128)
print("服务器已启动,等待连接...")
# 循环等待接收客户端的连接请求
while True:
# 等待接收客户端的连接请求
service_client_socket, ip_port = tcp_server_socket.accept()
# 代码执行到此,说明连接建立成功
print(f"客户端的 ip 地址和端口号:{ip_port}")
try:
# 接收客户端请求数据 (其实就是客户端发送的文件名)
recv_data = service_client_socket.recv(1024)
# 对二进制数据进行解码
file_name = recv_data.decode("utf-8")
print(f"请求文件名:{file_name}")
# 判断请求的文件是否存在
if os.path.exists(file_name):
# 根据客户端请求文件名打开指定文件,读取文件中的数据
with open(file_name, "rb") as file:
while True:
# 读取文件数据
file_data = file.read(1024)
if file_data:
# 发送数据给客户端
service_client_socket.send(file_data)
else:
# 文件读取完成
break
else:
service_client_socket.send("无此文件".encode("utf-8"))
except Exception as e:
print(f"处理请求时出错:{e}")
finally:
service_client_socket.close()
# tcp_server_socket.close() # 主循环通常不关闭,除非需要停止服务
UDP(User Datagram Protocol)即用户数据报协议,是与 TCP 相对的另一种传输层协议。
UDP 编程相对简单,无需建立连接。
import socket
if __name__ == '__main__':
udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_ip = "127.0.0.1"
server_port = 8989
msg = "Hello UDP Server"
udp_client_socket.sendto(msg.encode("utf-8"), (server_ip, server_port))
udp_client_socket.close()
import socket
if __name__ == '__main__':
udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server_socket.bind(("", 8989))
while True:
recv_data, addr = udp_server_socket.recvfrom(1024)
print(f"来自 {addr} 的消息:{recv_data.decode('utf-8')}")
udp_server_socket.sendto(b"OK", addr)
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 不面向连接 |
| 可靠性 | 可靠传输,保证数据完整 | 不可靠,易丢包 |
| 传输速度 | 较慢,因有握手和确认机制 | 快,无额外开销 |
| 广播支持 | 不支持 | 支持 |
| 资源占用 | 较多,维护连接状态 | 较少 |
| 流量控制 | 有 | 无 |
| 适用场景 | 文件传输、网页浏览、邮件 | 视频直播、语音通话、DNS |
在选择网络协议时,应根据具体业务需求决定。如果对数据准确性要求极高,如文件传输、数据库操作,应优先选择 TCP;如果对实时性要求高,允许少量丢包,如视频会议、在线游戏,则 UDP 更为合适。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online