UDP在某些场景下也是非常好用的

UDP在某些场景下也是非常好用的

UDP协议介绍

在网络通信OSI的传输层中,一般有UDP和TCP这两种传输协议,常见的各种HTTP协议,RPC协议等等各种协议都是在这两种协议之上的封装。这里主要结合具体使用场景来讨论下UDP的优势。UDP最大的特点是无面向链接,传输不可靠。所以很多情况下,基于B/S端框架的开发者使用多是基于TCP的http协议,导致在一定程度上对UDP协议的优势没有足够的认识。这里分别按照场景需要来说明一下使用UDP协议的优点。

UDP协议通信速度快

相比较于TCP的可靠性传输,UDP协议的第一个优势就是速度快。在物联网的时代下,很多时候时间的控制精度要求非常高,但是对于可靠性可以通过周期下发来弥补。而基于TCP的协议必然要求进行三次握手(1.5RTT)来保证一个稳定链接,这三次握手会根据网络的复杂度从几毫秒到上百毫秒,特别是再网络环境比较差时,握手耗费时长会进一步显现。当有大量链接时,每个通道都需要进行这种操作会大量消耗服务器资源。

另外TCP协议建立连接后,当应用层将数据从用户层拷贝到内核发送缓冲区时,TCP协议默认开启的Nagle算法为了减少小包,降低网络包头开销,并不会立刻将小数据给立即发送,这里会等待40ms等攒够一个mss或者超时才会发送。只有当关闭了这个算法(游戏,语音或者远程控制场景)之后,放入缓冲区的数据会立即发送。

UDP协议的包头小

相较于TCP的最小20字节,最多可达60字节的头部,UDP的专用头部只有8个字节。在物联网领域需要传感器周期上传数据,这种高频小包的场景可以节省大量带宽。

UDP协议延迟低

相较于TCP协议,发送端需要等待ACK,还有为了保障有序需要超时重传,这会极大的影响数据的实时性,在一些对实时性要求比较高但是容忍少量丢包的场合,使用UDP协议是合适的。

UDP天然支持组播

TCP协议一般只能点对点传播,而UDP协议天然支持组播(支持一次发送,小组内多台设备接收)场景。但是这个组一般不能太大,一般上限为百台量级,多了有可能引发网络风暴。

UDP协议通信对象占用资源少

TCP协议一般只能一个fd绑定一条通信通道,而UDP单个服务端socket由于无面向链接,所以理论上可以无限制的接收来自于任意多个客户端的数据包。但是如果soket的取包速度过慢就会导致其接收缓冲区爆满,新来的数据包就会丢失。在物联网场景中,单个socket服务端理论上可以承受十万台设备客户端上报数据。

UDP可控性强

虽然这个放在了最后,但是很多场景下这个才是考虑将UDP协议作为传输层协议的原因。TCP为了保证安全可靠传输做了很多工作,而UDP简单直接,特别适合用户根据需求进行封装.特别是滑动窗口和拥塞控制.一旦丢包,发送速度会大幅下降,这个是内核维护的TCP算法来控制的,上层用户很难根据业务需要来管理这个发送速度.而基于UDP协议的自定义协议就可以根据自己业务需要,自定义ACK确认发送数量,丢包补偿规则,重传策略等.比如在物联网进行命令下发时,并不需要对错误包后的所有包都进行重传,而是指定丢失错乱的包进行重传即可.

总结

虽然TCP通信协议稳定可靠,但是其并不是适用于所有场景,特别是在物联网高频短包这种对实时性要求比较高的场景下,UDP其实被广泛应用.现在HTTP3.0已经不再使用TCP作为传输层协议,而是使用UDP协议来处理.其原理就是因为TCP在移动物联网保留的缺点太多(流阻塞,控制算法不灵活,网络切换需要重新建立连接等)而直接使用UDP协议.当然UDP协议也不是万能的,需要开发设计者们在不同场景下选择合适的协议.