引子
在之前的文章里面,我们介绍了TCP协议的相关内容。TCP协议是一种基于连接的传输层协议,他可以保证数据完整正确的从网络的一端到达另一端,但是代价是什么呢?当然就是传输速度了。
数据的可靠性和数据的传输速度是两个不可兼得的特性,可靠性就意味着要对数据进行反复确认,要实现建立连接,但是这些过程都需要浪费数据传输的时间。所以我们应该做的是在适当的使用场景使用适当的传输协议。
而在一些对数据可靠性要求不那么高,反而对数据传输速度要求比较高的场合,如视频聊天,语音通话等,就需要用到无连接的不可靠的传输协议了,也就是我们今天要讲的UDP协议。
UDP协议的特点
UDP协议具有以下特点
- 无连接性:UDP是一种无连接的协议,发送端和接收端之间在通信之前不需要建立连接。每个UDP数据报都是独立的,独立于其他数据报,这使得UDP协议的通信开销较低。
- 面向数据报的传输:UDP将应用程序传输的数据划分为较小的数据报进行传输,每个数据报都包含了完整的数据和目标地址信息。
- 低延迟和高性能:由于UDP协议的简单性和无连接性,UDP具有较低的通信延迟。相对于TCP协议而言,UDP不需要进行连接的建立和断开,因此可以更快地发送数据。
- 不可靠性和数据丢失:UDP协议不提供数据的可靠性保证。它不进行数据的确认和重传,也不提供错误检测和纠正机制。这意味着在传输过程中,UDP数据报可能会丢失、重复或者乱序。如果数据报在传输过程中丢失,UDP协议不会重新发送该数据报。
- 无拥塞控制和流量控制:UDP协议没有内建的拥塞控制和流量控制机制。它不会根据网络的拥塞情况调整发送速率,而是一股脑地发送数据。这可能导致数据包的丢失或者网络拥塞的发生。因此,应用程序需要自行处理拥塞和流量控制的问题。
UDP数据报格式
就像TCP协议一样,UDP协议同样也是将数据切割为一个一个的数据报进行发送,下面是一个典型的UDP数据报的格式:
可以看到,UDP数据报由两部分构成,分别是首部和数据部分,其中首部占8字节,由以下字段组成:
- 源端口号,目的端口号:标识发送方和接收方的应用程序使用的端口号,和TCP协议中端口号的概念一样;
- UDP长度:标识UDP数据报的长度,包括报文和数据;
- UDP校验和:用来判断该数据报在传输过程中是否发生了错误,如果发生了错误,直接丢弃。
以上就是UDP报文段的格式,当某个应用程序要发送数据时,UDP将数据报的报头字段填充好,并将数据附加在报头后面,形成一个完整的UDP数据报,然后顺着网络进行传输。
当接收方的UDP从网络中接收到UDP数据报后,根据目标端口号将数据报交给对应的应用程序进行处理。接收方将解析数据报的报头字段,提取出数据并传递给应用程序处理。
这就是UDP协议中数据报的封装和解封装的过程。
校验和的使用
当使用UDP协议进行数据传输时,校验和是一项重要的机制,用于检测数据报在传输过程中是否发生了错误。毕竟虽然UDP是不可靠的传输方式,但数据报对不对还是要知道的,毕竟丢掉错数据总是比传输错数据要好。
我们可以首先介绍一下校验和的计算方法,以n个字节的数据需要求他的校验和为例:
- 检查n是奇数还是偶数,如果是奇数的话,在所有数据的最后再添加1个字节的数据,这个字节的数据全设为0;
- 按顺序将数据划分为16位的字块,也就是说每个字块占据两个字节;
- 对多个字块执行二进制加法操作,注意,这里是二进制加法,而不是异或,是需要有进位的。通过加法操作,得到数据X;
- 如果X的值超过16位的话,将高位溢出的部分加回到低位;
- 将X的值按位取反,最后得到的数据便是校验和。
上面是这个过程的叙述,为了让大家更加直观的了解这个过程,可以举一个例子。比如说我有一个5字节的数据0x123456789A,我们要求这个数据的校验和。
-
首先,这个数据的字节数不是一个偶数,所以最这个数据的最后要添0,即将这个数据变为0x123456789A00;
-
按顺序将数据划分为16位的字块,如下图:
-
对多个字块执行二进制加法操作,得到数据X,如图:
-
X的值超过16位,将高位溢出的部分加回到低位,得到0000 0010 1010 1101
-
对X进行取反,得到校验和,所以0x123456789A的校验和就是1111 1101 0101 0010,也即0xFD52
如此,我们就知道了n个字节的数据如何求他的校验和,接下来我们介绍整个UDP报文段是如何求校验和的。
首先,会将UDP报文段进行扩展,在UDP报文段头部之前扩展出一个伪头部。伪头部中包含了4字节的源IP地址、4字节目的IP地址,1个字节的全0和1个字节的协议号最后还有2个字节的UDP长度,如下图:
伪头部的作用主要是将伪头部的这些消息也校验一次,防止发生比如发错地址等问题。当然,伪头部的消息在UDP报文段发送时候是不参与的,他们并不能算是UDP报文段的一部分,只是参与校验和的计算而已。
之后发送方把校验和置为全1,然后将所有的UDP伪头部、头部、数据部分一起进行校验和计算,得到最终的校验和,填入校验和字段,这就是UDP校验和计算的全过程。
UDP和TCP的应用场景
我们都知道TCP和UDP的一些区别,主要在于他们的可靠性和效率方面,我们这边列举了一些基于UDP和基于TCP的协议,供大家参考。
协议 | |
---|---|
TCP | HTTP、FTP、SSH、SMTP |
UDP | DNS、DHCP、TFTP、SNMP |