Contents

UDP通信概述

主要内容

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

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

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

  1. 创建套接字(Socket)
  2. 使用 Bind 方法将套接字与本地地址绑定
  3. 使用 ReceiveFrom 和 SendTo 方法进行消息收发
  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 范围内。
  • 手动处理分包与黏包需解决丢包与无序问题。