“本文换一种问答式的风格来总结一下UDP协议,由于UDP协议比较简单,因此也没有必要花大篇进行讲解。”
1、UDP是无连接的,体现在哪些方面。
所谓建立连接,是指在服务端和客户端之间各种维护一套连接状态。而UDP协议没有服务端和客户端的概念。比如,TCP协议传输的数据保证无差错,有序到达,不重复。在IP层是没有任何可靠性保证的,而UDP继承了IP的特性,不保证不丢包,不保证有序到达。
其次,TCP是面向字节流的,因为TCP底层发送应用层的数据时候会拆成一个个包,然后交给IP层进行发送,且在TCP层维护了发送包和接收包的序列号。而UDP继承了IP的特性,基于数据报文,一个一个报文发,一个一个报文接收,不存在TCP流式协议中存在的“半包粘包”问题。
再其次,TCP提供拥塞控制,当TCP自己意识到网络丢包重发严重,会自动降低发包速度从而减少对网络的影响,也就是说TCP会根据网络情况调整自己的行为。而UDP协议不会,只要应用层让发包,那么就发,不管网络情况如何。
2、UDP协议头是什么样的。
当发送的UDP报文到达目标主机,发现MAC地址匹配,于是将该报文接收下来进行层层传递给应用层去处理。这里在IP报文头里面会有一个8位协议存放到底是TCP还是UDP协议,于是会安装UDP格式取报文头进行解析,到这里内核层完成了自己的任务。

从下面UDP协议的报文头可以看出,只有源端口和目的端口。不同的应用程序去不同的端口读取数据即可(数据从内核中拷贝到用户态)。从这报文头也可以看出UDP协议确实比TCP简单太多。
3、UDP协议使用场景。
由于UDP是一种“无脑”协议,一般可以考虑在以下场景下使用。
第一,在网络较好的内网,对于丢包不敏感的应用。比如DHCP协议就是基于UDP的,一般像获取IP地址这种请求一般在内网,而且一次获取不到IP地址也可以再试。还有像TFTP协议也是基于UDP的,这是因为没有操作系统的时候,使用UDP协议可以不消耗很多资源进行维护连接状态。
第二,不需要一对一连接,可以广播的场景。比如DHCP协议就是基于UDP进行广播的。一个D类地址,也就是一个组播地址可以将一个数据包发送给一批机器。当某个机器的进程需要监听广播包,一般需要先发送IGMP包,所在的网络路由器收到这个包就知道该机器在监听该组播地址,然后路由器收到这个组播地址,就会将包转发给给进程,从而实现了跨路由器的组播。此外,像云协议的VXLAN也是基于UDP的组播实现的。
第三,需要处理速度快,低时延场景。比如原来直播使用的RTMP协议是基于TCP的,这样在网络不好的情况下就会越来越卡顿。所有现在很多厂商都基于UDP实现了自己的直播协议。另外,像我们目前使用的DDS(分布式消息总线)底层也是基于UDP进行实现的,因此速度和时延会比较低。




