UDP通信概述
Contents
主要内容
- 服务端和客户端代码应该怎么写
- UDP 相对 TCP 的区别
- UDP 的分包、黏包问题
服务端和客户端代码开发流程
服务端与客户端需要完成的操作
- 创建套接字(Socket)
- 使用
Bind方法将套接字与本地地址绑定 - 使用
ReceiveFrom和SendTo方法进行消息收发 - 使用
Shutdown方法释放连接 - 关闭套接字
UDP 相对 TCP 的区别
- UDP:无连接、不可靠、高效,适合频繁发送小数据包。
- TCP:连接可靠、流控机制完整,适合需要数据一致性的场景。
UDP 的分包与黏包问题
黏包问题
UDP 不会黏包:
- 发送方发送的数据不会被合并。
- 一端发什么,另一端收到的就是独立的包。
分包问题
自动分包风险:
- UDP 消息可能在传递过程中因超出 MTU 而被分包。
- 自动分包可能导致消息丢失或乱序,处理起来非常困难。
MTU(Maximum Transmission Unit)
MTU 概念:
最大传输单元,通知对方所能接受的最大数据包尺寸。
常见 MTU 值:
- 局域网:1472 字节(1500 减去 UDP 头部 28 字节)。
- 互联网:548 字节(576 减去 UDP 头部 28 字节)。
避免分包建议
确保消息大小小于 MTU:
- 局域网环境下:1472 字节以内。
- 互联网环境下:548 字节以内。
手动分包与黏包
黏包:
- 消息过小可手动将多条消息合并为一个包。
分包:
- 消息过大时可手动拆分为多个包。
- 需要在逻辑中解决以下问题:
- 无序问题:通过包序号、总包数、包 ID 等进行控制。
- 丢包问题:实现消息确认与重发机制。
总结
服务端与客户端开发流程:
- 创建套接字 → 绑定地址 → 消息收发 → 释放与关闭。
UDP 相对 TCP 的特点:
- UDP 更简单高效,但不可靠。
UDP 分包与黏包问题:
- 避免自动分包,控制消息大小在 MTU 范围内。
- 手动处理分包与黏包需解决丢包与无序问题。