UDP协议的概念
用户数据报协议(英语:User Datagram Protocol,缩写:UDP;又称用户数据包协议)是一个简单的面向数据报的通信协议。
UDP协议工作在OSI模型的传输层,面向无连接,不保证可靠传输,也就是说,通信双方不能知道UDP报文是否安全完整地抵达了对方。UDP的缺点是不能确保数据完整到达,但这样做提升了数据传输的性能。当数据传输的速度比数据传输的性能更重要时,UDP是一个很好的选择。
现在,UDP协议仍然是一个非常重要和实用的数据传输协议,因为UDP可以保证数据传输的实时性,至今仍有许多网络应用在使用UDP协议。比如网络视频会议系统(会议软件),多媒体数据流(直播软件)。
UDP主要特点
1. 无连接。即源端口和目的端口之间的数据传输不需要建立连接。可有效减少数据传输时的开销和发送数据前的时延。
2. 最大努力交付。即根据不可靠协议提供不保证可靠性的交付。
3. 面向报文。UDP对于应用层下发的报文只添加首部就下发到IP层。同理对于IP层上交的报文只删除首部就上交到应用层。UDP一次交付一个完整的报文,因此对报文的长度有要求。UDP数据报最大长度为1480字节。其中首部占8字节,数据部分最大长度为1472字节.
4. 没有拥塞控制。网络出现的拥塞不会使源主机的发送速率降低,可以令源主机以恒定的速率发送数据。
5. 多种类交互通信。支持一对一、一对多、多对一和多对多的交互通信。
6. 首部开销小。只有8个字节。
UDP报文头部
UDP报文有两个部分,一个是首部字段,一个是数据字段
首部字段由4格部分组成,每个部分占两个字节,具体解释如下
(1)源端口。在需要对方回信时选用。不需要时可用全0。
(2)目的端口。目的端口号。这在终点交付报文时必须使用。
(3)长度。UDP用户数据报的长度,其最小值是8(仅有首部)。
(4)检验和。检测UDP用户数据报在传输中是否有错。有错就丢弃。
数据字段最大长度为1472字节。
UDP的传输过程
当进程之间想要发送数据时,先要创建一个UDP套接字,然后应用层使用这个UDP套接字将数据传输到传输层,传输层把数据加上源端口号和目的端口号,封装起来变成数据报,然后交给网络层,网络层再为数据报封装上源IP和目的IP。上图中SP表示源端口,DP表示目的端口,黄色块表示套接字
在传输过程中,首部字段中的检验和有检测是否出现差错的功能(即在报文传输过程中,数据的比特是否发生了改变)。主要使用了奇偶校验来实现这一功能:当传输的数据的字节个数是奇数时,在检验和数填入0,偶数则填入1,当接收方接受到传输的UDP信息后,对UDP报文的数据部分的字节进行检验,然后确定数据部分是奇数还是偶数,确定后与检验和进行对比,如果一致则数据无误,如果不一致则数据有误。
此外,在数据传输过程中,UDP协议有消息保护边界。就是指传输协议把数据当作一条独立的消息在网上传输,接收端只能接收独立的消息,也就是说存在保护消息边界,接收端一次只能接收发送端发出的一个数据包。应用程序每请求一次UDP输出将产生一个UDP数据报,而接收端每请求一次UDP接收都将接收一个完整的UDP报(如果有),并发送一个IP数据报作为应答信号。
例如,我们连续发送两个数据包,大小分别是4k 、3k两个数据包,都已经到达了接收端的网络堆栈中。若使用TCP协议,我们只要把接收的缓冲区大小设置在7k以上,我们就能够一次把所有的数据包接收下来,只需要有一次接收动作,这也会造成粘包的现象。但如果使用UDP协议,不管我们使用多大的接收缓冲区去接收数据,我们必须有两次接收动作,才能够把所有的数据包接收完。