Python 网络编程:TCP 与 UDP 协议详解及实战代码

引言

在万物互联的时代,网络编程已成为开发者必备的核心技能。Python 凭借其简洁优雅的语法和强大的标准库支持,为网络应用开发提供了高效解决方案。本文将深入剖析 TCP 和 UDP 两大核心传输协议,通过代码实例演示其在 Python 中的具体实现,助力开发者构建稳定可靠的网络应用。

一、网络编程核心概念

1.1 协议栈体系

  • OSI 七层模型:应用层 -> 表示层 -> 会话层 -> 传输层 -> 网络层 -> 数据链路层 -> 物理层
  • TCP/IP 四层模型:应用层 -> 传输层 -> 网络层 -> 网络接口层 ^^《计算机网络:自顶向下方法》^^

1.2 Socket 编程

python 复制代码
import socket
# 创建TCP Socket
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建UDP Socket  
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

AF_INET指定 IPv4 协议族,SOCK_STREAM面向连接,SOCK_DGRAM无连接

二、TCP 协议深度解析

2.1 协议特性

  • 面向连接的三次握手
  • 可靠传输机制(ACK 确认、超时重传)
  • 流量控制(滑动窗口协议)
  • 拥塞控制(慢启动、拥塞避免)

2.2 服务端实现

python 复制代码
def tcp_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('0.0.0.0', 8888))  # 绑定所有网络接口
    server.listen(5)  # 设置监听队列长度
    
    print("TCP服务端已启动,等待连接...")
    while True:
        client, addr = server.accept()  # 接受客户端连接
        print(f"收到来自 {addr} 的连接")
        
        # 接收数据
        data = client.recv(1024)
        print(f"收到数据:{data.decode()}")
        
        # 发送响应
        client.send(b"Message received!")
        client.close()

if __name__ == '__main__':
    tcp_server()

2.3 客户端实现

python 复制代码
def tcp_client():
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('127.0.0.1', 8888))  # 连接服务器
    
    # 发送数据
    client.send(b"Hello TCP Server!")
    
    # 接收响应
    response = client.recv(1024)
    print(f"服务器响应:{response.decode()}")
    
    client.close()

if __name__ == '__main__':
    tcp_client()

三、UDP 协议实战应用

3.1 协议特点

  • 无连接通信
  • 尽最大努力交付
  • 支持广播 / 多播
  • 首部开销小(8 字节)

3.2 服务端实现

python 复制代码
def udp_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    server.bind(('0.0.0.0', 9999))
    
    print("UDP服务端已启动,等待数据...")
    while True:
        data, addr = server.recvfrom(1024)  # 接收数据包
        print(f"收到来自 {addr} 的消息:{data.decode()}")
        
        # 发送响应
        server.sendto(b"UDP Message received!", addr)

if __name__ == '__main__':
    udp_server()

3.3 客户端实现

python 复制代码
def udp_client():
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    # 发送数据(无需建立连接)
    client.sendto(b"Hello UDP Server!", ('127.0.0.1', 9999))
    
    # 接收响应
    response, addr = client.recvfrom(1024)
    print(f"收到来自 {addr} 的响应:{response.decode()}")

if __name__ == '__main__':
    udp_client()

四、协议对比与选型指南

特性 TCP UDP
连接方式 面向连接 无连接
可靠性 可靠传输 尽力而为
传输顺序 保证顺序 不保证顺序
速度 较慢(需要建立连接) 更快
头部开销 20 字节 8 字节
适用场景 文件传输、Web 浏览 视频流、实时游戏

五、高级应用技巧

5.1 多线程服务端

python 复制代码
import threading

def handle_tcp_client(client, addr):
    try:
        while True:
            data = client.recv(1024)
            if not data:
                break
            print(f"{addr} 发送:{data.decode()}")
            client.send(data.upper())
    finally:
        client.close()

# 在tcp_server的accept后启动线程
client_thread = threading.Thread(target=handle_tcp_client, args=(client, addr))
client_thread.start()

5.2 超时设置

python 复制代码
# 设置接收超时(秒)
socket.settimeout(10.0)
try:
    data = sock.recv(1024)
except socket.timeout:
    print("接收超时")

5.3 数据序列化

python 复制代码
import pickle

# 发送对象
data = pickle.dumps({"name": "Alice", "age": 25})
sock.send(data)

# 接收对象
received_data = pickle.loads(sock.recv(1024))

六、安全注意事项

  1. 使用SSL/TLS加密通信

    python 复制代码
    import ssl
    context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
    secure_sock = context.wrap_socket(sock, server_side=True)
  2. 防范 DDoS 攻击(限制连接频率)

  3. 数据验证(防止缓冲区溢出攻击)

  4. 使用防火墙规则限制端口访问

七、性能优化建议

  1. 使用selectors模块实现 I/O 多路复用

    python 复制代码
    import selectors
    sel = selectors.DefaultSelector()
    sel.register(sock, selectors.EVENT_READ, callback)
  2. 调整缓冲区大小

    python 复制代码
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4096)

八、结论

掌握 TCP 和 UDP 协议的原理及 Python 实现,是构建现代网络应用的基石。开发者应根据具体场景需求选择合适的传输协议:当需要可靠传输时选择 TCP,追求实时性时选用 UDP。建议通过 Wireshark 等抓包工具实际观察协议交互过程,深入理解协议工作机制。随着对底层机制的深入掌握,可以进一步探索 Twisted、asyncio 等高级框架,构建高性能网络应用。

九、思维导图

相关推荐
想会飞的蒲公英11 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
SeaTunnel12 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记12 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
CCPC不拿奖不改名12 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
Marst Code13 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
databook13 小时前
当散点图不够用时:用 t-SNE 可视化多维数据
python·数据分析·数据可视化
星恒讯工业路由器14 小时前
5G FWA技术演进与趋势
网络·5g·信息与通信·4g·5g fwa·3gpp规范·fwa趋势
我的xiaodoujiao15 小时前
快速学习Python基础知识详细图文教程9--函数进阶
开发语言·python·学习·测试工具
weixin_4080996716 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
去码头整点薯条ing16 小时前
某当网登录滑块【协议+OCR】
爬虫·python·ocr