网络协议|网络协议(UDP)

一 UDP协议及其特点 1.1 什么是UDP协议
UDP: User Datagram Protocol, 用户数据报协议,它是一种无连接,不可靠的传输,面向报文的一种协议。在IP协议的基础上提供了简答的功能,比如:复用分用和差错检测功能

1.2 UDP协议特点
#1 无连接: 和IP协议一样,发送数据报之前不需要建立连接,减少了网络开销和延时,节省了系统资源
#2 不可靠: 和IP协议一样,只保证尽最大努力交付,所以不保证可靠交付。因此不需要维护一些复杂的连接状态信息,适合可以接受数据丢失的报文。
#3面向报文:对于应用层的报文既不拆分也不合并,上层报文是什么样,UDP就是什么样。适合一次性传输少量数据的应用。
网络协议|网络协议(UDP)
文章图片


#4 UDP协议没有拥塞控制,网路出现拥塞的时候不会使得源主机的发送速率降低,这对某些实时应用是很重要的。比如视频会议。
#5 UDP支持一对一 一对多 多对一的交互通信
#6 UDP 首部开销小,只有8个字节,比TCP的20个字节首部要短

二 UDP协议数据报首部格式 网络协议|网络协议(UDP)
文章图片


2.1 源端口号 指的是发送端应用程序端口

2.2 目标端口端口 指的是接收端应用程序端口

2.3 长度 指的是UDP首部和数据部分总长度

2.4 校验和 【网络协议|网络协议(UDP)】UDP的校验和覆盖UDP首部和UDP 数据部分。主要用于判断UDP报文字啊传输过程中是否出差错。

三 UDP为什么会丢包?解决办法 3.1 丢包原因 #1 socket缓冲区满了
如果socket缓冲区满了,应用程序没来得及处理在缓冲区中的UDP包,那么后续来的UDP包会被内核丢弃,造成丢包。在socket缓冲区满造成丢包的情况下,可以通过增大缓冲区的方法来缓解UDP丢包问题。
#2 socket缓冲区太小
如果发送端报文很大,接收端缓冲太小,也会造成数据丢失
#3 IP分片丢失,CRC校验失败

3.2 解决方式(UDP冗余传输) 有什么办法可以降低UDP的丢包率呢?一个简单的办法来采用冗余传输的方式。如下图,一般采用较多的是延时双发,双发指的是将原本单发的前后连续的两个包合并成一个大包发送,这样发送的数据量是原来的两倍。这种方式提高丢包率的原理比较简单,例如本例的冗余发包方式,在偶数包全丢的情况下,依然能够还原出完整的数据,也就是在这种情况下,50%的丢包率,依然能够达到100%的数据接收。
网络协议|网络协议(UDP)
文章图片

四 UDP是否存在粘包和拆包问题?为什么? UDP是不存在粘包和拆包问题的。因为UDP不是面向流的,是面向报文的,正因为这个特性,所以决定UDP发送数据是一份一份的,接收的时候也是一份一份的,发送和接收的都是完整的报文。即发送端发送了多少次,接收端就要接收多少次。比如接收缓冲区大小为10K, 那么发送端分别发送三次报文,1次2K,2次1K,三次6K总共9K,那么接收端就会接收三次,并且放入接收缓冲区。

那问题来了? 接收缓冲区如何保区别缓冲区里的数据呢?因为UDP接收缓冲区以链式结构来存储到达UDP包,每一个包都包含头部信息(消息来源地址,端口等)。所以它是具有保护消息边界特性。

那如果缓冲区满了,怎么办? 如果缓冲区满了,数据就会被丢失。所以UDP适合一些发送频繁,且数据包比较小,对安全性不高的网络应用。如果数据包比较大,很容易造成频繁丢包。


    推荐阅读