一、UDP核心特性:速度优先
- 无连接通信:无需握手建立连接,直接发送数据包
- 尽力而为传输:不保证数据到达顺序与可靠性
- 低延迟优势:头部开销小(仅8字节),比TCP快30%以上
- 适用场景:实时视频/语音、DNS查询、游戏状态同步
二、Python UDP编程四步法
# 创建UDP Socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口(服务端必需)
udp_socket.bind(('0.0.0.0', 8888)) # 监听所有接口
# 发送数据(需指定目标地址)
udp_socket.sendto(b"Hello UDP!", ('192.168.1.100', 8888))
# 接收数据(返回数据+发送方地址)
data, addr = udp_socket.recvfrom(1024) # 缓冲区大小
三、完整示例:双向通信
服务端代码(持续响应客户端):
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('', 8888))
print("UDP服务端启动...")
while True:
data, addr = server.recvfrom(1024)
print(f"收到来自{addr}的消息: {data.decode()}")
server.sendto(f"已接收:{len(data)}字节".encode(), addr)
客户端代码(发送并接收响应):
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = b"Python UDP测试"
client.sendto(msg, ('127.0.0.1', 8888))
response, _ = client.recvfrom(1024) # 忽略发送方地址
print("服务器响应:", response.decode())
四、关键问题与优化策略
- 数据包大小限制:单次传输建议≤1472字节(以太网MTU 1500 - IP头20 - UDP头8)
- 丢包处理:
# 设置超时避免永久阻塞
udp_socket.settimeout(5.0)
try:
data = udp_socket.recvfrom(1024)
except socket.timeout:
print("等待超时!")
- 乱序问题:在应用层添加序列号(如
struct.pack('I', seq_num) + data) - 广播通信:
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
udp_socket.sendto(b"Broadcast", ('255.255.255.255', 8888))
性能实测:在千兆局域网下,Python UDP可达12万包/秒的吞吐量,延迟低于0.1ms
选择UDP的场景:当你的应用需要毫秒级响应(如VR控制信号)、能容忍偶发包丢失(如视频帧)、或需组播/广播(如设备发现)时,UDP是比TCP更高效的选择。掌握其特性,方能发挥Python网络编程的真正威力!
1960

被折叠的 条评论
为什么被折叠?



