UN2L10——UDP通信概述
UN2L10——UDP通信概述
服务端和客户端需要做什么
UDP通信逻辑要比TCP通信的逻辑更简单一点,UDP中客户端与服务器端要做的事情大同小异,细节上有差异
-
客户端和服务端
- 创建套接字Socket
- 用
Bind
方法将套接字与本地地址进行绑定 - 用
ReceiveFrom
和SendTo
方法在套接字上收发消息 - 用
Shutdown
方法释放连接 - 关闭套接字
UDP相对TCP的区别
TCP通信与UDP通信逻辑上的区别:
分包、黏包问题
- UDP不会黏包
- 因为UDP不可靠,我们要避免其自动分包,消息大小要控制在一定范围内
但是我们可以根据自己的需求自己在实现逻辑时加入分包黏包功能:
- 消息过小可以手动黏包
- 消息过大可以手动分包
但是对于手动分包,我们必须解决UDP无序和丢包的问题
黏包问题
UDP本身作为无连接的不可靠的传输协议(适合频繁发送较小的数据包),他不会对数据包进行合并发送
一端发送什么数据,直接就发出去了,他不会对数据合并,因此在UDP当中不会出现黏包问题(除非你手动进行黏包)
分包问题
由于UDP是不可靠的连接,消息传递过程中可能出现无序、丢包等情况****所以如果允许UDP进行分包,那后果将会是灾难性的,比如分包的后半段丢包或者比上半段先发来,我们在处理消息时将会非常困难
因此为了避免其分包,我们建议在发送UDP消息时,控制消息的大小在MTU(最大传输单元) 范围内
MTU(Maximum Transmission Unit)最大传输单元,用来通知对方所能接受数据服务单元的最大尺寸
不同操作系统会提供用户一个默认值,以太网和802.3对数据帧的长度限制,其最大值分别是1500字节和1492字节
由于UDP包本身带有一些信息,因此建议:
- 局域网环境下:1472字节以内(1500减去UDP头部28为1472)
- 互联网环境下:548字节以内(老的ISP拨号网络的标准值为576减去UDP头部28为548)
只要遵守这个规则,就不会出现自动分包的情况
如果想要发送的消息确实比较大,要大于548字节或1472字节这个限制呢?
比如我们要发一个5000字节的数据,他是一条完整消息
我们可以进行手动分包,将5000拆分成多个消息,每个消息不超过限制,但是手动分包的前提是要解决UDP的丢包和无序问题
我们可以将不可靠的UDP通信实现为可靠的UDP通信
比如:在消息中加入序号、消息总包数、自己的包ID、长度等等信息,并且实现消息确认、消息重发等功能
总结
-
服务端和客户端代码应该怎么写
创建—>绑定—>收发消息—>释放关闭
-
UDP相对TCP的区别
代码流程更简单,UDP不可靠效率高
-
UDP的分包、黏包问题,UDP不会黏包,要避免UDP自动分包
- 局域网环境下:1472字节以内
- 互联网环境下:548字节以内
我们可以根据需求自己处理UDP的分包黏包,
但是前提是要自己解决无序和丢包的问题