UDP学习
本文是什么
在学习音视频的过程中,需要接触各种各样的协议。尤其是在实时的音视频传输中,需要了解很多的网络协议。UDP就是其中重要的协议之一,所以我们有必要对其进行学习。UDP的内容还是蛮简单的,所以本文的内容不会很多,后续有什么想到的会在本文进行添加或修改。关于与UDP同样重要的TCP,以及UDP和TCP之间的区别,会在该系列中的其他文章进行介绍,尽情期待吧。
正文
UDP
UDP是User Datagram Protocol,也就是用户数据报协议的缩写。UDP处于TCP/IP协议族的传输层中,上层协议为各种应用层协议,底层协议为IP(IP中的协议号为17)。
什么是连接
我们经常听到UDP是一个无连接,最大可能交付的协议。这句话是什么意思呢?关于连接,我们会在TCP中进行介绍。在这里我们可以把连接看作是维持一种状态,与对方进行沟通并为了后续的通信交换一些必要的信息和资源的建立。
那么,我们有了连接能够实现怎样功能呢?因为双方进行了互相沟通,那么当网络中的数据丢失的时候,接收方就能进行察觉并告知发送方重新进行发送;当网络拥挤的时候,丢包率会上升,双方也会进行沟通来放缓数据的发送来避免大量数据淹没网络。
看起来,有连接是一个很好的性质,那么为什么要有无连接的协议呢?我们说过连接是一种状态。而为了创建这个状态并且维持这个状态,就必须花费一些时间和空间上的资源。当我们的服务对于丢包是可以接受并且想要这个数据尽可能快地发过去,无连接的协议就非常友好了。无连接的UDP在收到上层协议发来的数据再加上UDP报文头后就直接进行发送。
UDP报文格式
UDP的内容简单,也是为了尽快地发出数据,UDP报文的格式也很简单。下图就是报文格式,我们对下面的字段进行说明。
- 源端口号:2字节长度,为发送端的端口号。
- 目的端口号:2字节长度,为接收端的端口号。
- 长度:2字节长度,单位为字节。为UDP报文头和数据载荷的总长度。因为报文头的长度为8字节,所以最小值为8.
- 校验和:2字节长度,用于判断这个数据是否是合法的。
![](https://img2024.cnblogs.com/blog/3272170/202402/3272170-20240224014217453-1258409863.png)
一个例子
我们使用Wireshark抓取一个UDP包,看看里面的内容。
![](https://img2024.cnblogs.com/blog/3272170/202402/3272170-20240224022507706-1213925209.png)
![](https://img2024.cnblogs.com/blog/3272170/202402/3272170-20240224022707184-804435560.png)
其中高亮的部分是UDP的报文头。
- 0~15为源端口,0xebc1=60353。
- 16~31为目的端口,0xe9de=59870。
- 32~47为长度,0x00d4=212。报文头+数据载荷=8+204。
- 48~63为校验和。
我们根据UDP报文格式去解读UDP包的内容,结果也与我们的预期相同。