Contents

UDP通信概述

主要内容

  1. 服务端和客户端代码应该怎么写
  2. UDP 相对 TCP 的区别
  3. UDP 的分包、黏包问题

服务端和客户端代码开发流程

服务端与客户端需要完成的操作

  1. 创建套接字(Socket)
  2. 使用 Bind 方法将套接字与本地地址绑定
  3. 使用 ReceiveFromSendTo 方法进行消息收发
  4. 使用 Shutdown 方法释放连接
  5. 关闭套接字

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 字节以内。

手动分包与黏包

黏包

  • 消息过小可手动将多条消息合并为一个包。

分包

  • 消息过大时可手动拆分为多个包。
  • 需要在逻辑中解决以下问题:
    1. 无序问题:通过包序号、总包数、包 ID 等进行控制。
    2. 丢包问题:实现消息确认与重发机制。

总结

服务端与客户端开发流程

  • 创建套接字 → 绑定地址 → 消息收发 → 释放与关闭。

UDP 相对 TCP 的特点

  • UDP 更简单高效,但不可靠。

UDP 分包与黏包问题

  • 避免自动分包,控制消息大小在 MTU 范围内。
  • 手动处理分包与黏包需解决丢包与无序问题。