谈谈UDP协议

1,436 阅读5分钟

本文正在参与 “网络协议必知必会”征文活动

概述

UDP是面向消息的传输层协议,使用具有最小协议机制的简单无连接通信模型。UDP提供数据完整性的校验和,以及用于在数据报的源和目标寻址不同函数的端口号,它没有握手对话机制。其特点如下:

无连接: UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收,不需要重发。

不可靠:UDP中的每个数据报都是一个独立的信息,包括完整的源或目的地址,它在网络上以任何可能的路径传往目的地,对于能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

高速率: 因为UDP不必进行收发数据的确认,而且资源消耗小,处理速度快,所以它的实时性更好,传输速率更高。

UDP协议

UDP是基于IP的简单协议。其结构如下: udp1.png UDP有两个字段:数据字段和首部字段。首部字段只有8个字节,由4个字段组成,每个字段的长度都是两个字节。具体如下:

源端口:源端口号。在需要对方回信时选用。不需要时可用全0。

目的端口:目的端口号。这在终点交付报文时必须要使用到。

长度: UDP用户数据报的长度,其最小值是8(仅有首部),发送一个带0字节数据的UDP数据报是允许的。

校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。

伪首部甚至还包含IP地址这样的IP协议里面都有的信息,目的是让UDP两次检查数据是否已经正确到达目的地。如果发送端没有打开检验和选项,而接收端计算检验和有差错,那么UDP数据将会被悄悄的丢掉(不保证送达),而不产生任何差错报文。

端口

传输层是负责端与端(端点,端口)之间传输的,无论是UDP协议还是Tcp协议,都是负责端口与端口之间的数据传输。端口号是16位的非负整数,它的范围是0 - 65535之间,这个范围会分为三种不同的端口号段,由端口号是由互联网分配号码管理局(IANA)进行分配。

周知/标准端口号,它的范围是0 - 1023。在Unix的操作系统上,使用这些端口之一需要超级用户操作权限

注册端口号,范围是1024 - 49151。是用于IANA 注册服务的注册端口。

私有端口号,范围是49152 - 6553。未正式指定用于任何特定服务,可用于任何目的。这些端口也可以用作临时端口,在主机上运行的软件可以使用这些端口根据需要动态创建通信终结点。

UDP校验和

UDP校验和是一个端到端的传输层校验和,是对包含了IP头部中的源(Source)和目的IP地址(Destination Address)字段的UDP伪首部计算得到的。首先把检验和字段置为0,然后对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份数据报后,同样对首部中每个16bit进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么接收方就丢弃收到的数据报。对于UDP来说,校验和是可选的,而其他的则是强制的。当UDP在IPV6中使用时,校验和的计算与使用是强制的,因为在IP层没有头部校验和。

UDP的使用

通信实时性和持续性

分组交换通信当中,主要问题在以下两方面:

封装带来的空间复杂度;

缓存带来的时间复杂度;

通信的持续性对两者的影响比较大,根据通信的持续性有两种通信类型:短连接通信 长连接通信。对于短连接通信,一方面如果业务只需要发一两个包并且对丢包有一定的容忍度,同时业务自己有简单的轮询或重复机制,那么采用UDP会较为好些。另一方面,如果业务实时性要求非常高,并且不能忍受重传,那么首先就是UDP了,例如NTP协议。

多点通信

对于一些多点通信的场景,如果采用有连接的TCP,那么就需要和多个通信节点建立其双向连接,然后有时在NAT环境下,两个通信节点建立其直接的TCP连接不是一个容易的事情,在涉及NAT穿越的时候,UDP协议的无连接性使得穿透成功率更高 一个典型的场景是多人实时音视频通信,这种场景下实时性要求比较高,可以容忍一定的丢包率。对于这样的场景就比较合适用UDP了,如果采用TCP,那么在出现丢包的时候,就可能会出现比较大的延时。