UN2L10——UDP通信概述

服务端和客户端需要做什么

UDP通信逻辑要比TCP通信的逻辑更简单一点,UDP中客户端与服务器端要做的事情大同小异,细节上有差异

  • 客户端和服务端

    1. 创建套接字Socket
    2. Bind​方法将套接字与本地地址进行绑定
    3. ReceiveFrom​和SendTo​方法在套接字上收发消息
    4. Shutdown​方法释放连接
    5. 关闭套接字

image

UDP相对TCP的区别

image

TCP通信与UDP通信逻辑上的区别:

imageimage

分包、黏包问题

  1. UDP不会黏包
  2. 因为UDP不可靠,我们要避免其自动分包,消息大小要控制在一定范围内

但是我们可以根据自己的需求自己在实现逻辑时加入分包黏包功能:

  1. 消息过小可以手动黏包
  2. 消息过大可以手动分包

但是对于手动分包,我们必须解决UDP无序和丢包的问题

黏包问题

UDP本身作为无连接的不可靠的传输协议(适合频繁发送较小的数据包),他不会对数据包进行合并发送
一端发送什么数据,直接就发出去了,他不会对数据合并,因此在UDP当中不会出现黏包问题(除非你手动进行黏包)

分包问题

由于UDP是不可靠的连接,消息传递过程中可能出现无序、丢包等情况****所以如果允许UDP进行分包,那后果将会是灾难性的,比如分包的后半段丢包或者比上半段先发来,我们在处理消息时将会非常困难
因此为了避免其分包,我们建议在发送UDP消息时,控制消息的大小在MTU(最大传输单元) 范围内

MTU(Maximum Transmission Unit)最大传输单元,用来通知对方所能接受数据服务单元的最大尺寸
不同操作系统会提供用户一个默认值,以太网和802.3对数据帧的长度限制,其最大值分别是1500字节和1492字节
由于UDP包本身带有一些信息,因此建议:

  1. 局域网环境下:1472字节以内(1500减去UDP头部28为1472)
  2. 互联网环境下:548字节以内(老的ISP拨号网络的标准值为576减去UDP头部28为548)

只要遵守这个规则,就不会出现自动分包的情况

如果想要发送的消息确实比较大,要大于548字节或1472字节这个限制呢?
比如我们要发一个5000字节的数据,他是一条完整消息
我们可以进行手动分包,将5000拆分成多个消息,每个消息不超过限制,但是手动分包的前提是要解决UDP的丢包和无序问题
我们可以将不可靠的UDP通信实现为可靠的UDP通信
比如:在消息中加入序号、消息总包数、自己的包ID、长度等等信息,并且实现消息确认、消息重发等功能

总结

  1. 服务端和客户端代码应该怎么写

    创建—>绑定—>收发消息—>释放关闭

  2. UDP相对TCP的区别

    代码流程更简单,UDP不可靠效率高

  3. UDP的分包、黏包问题,UDP不会黏包,要避免UDP自动分包

    1. 局域网环境下:1472字节以内
    2. 互联网环境下:548字节以内

    我们可以根据需求自己处理UDP的分包黏包,
    但是前提是要自己解决无序和丢包的问题

image​​image