一、UDP - 尽力而为的服务
“尽力而为”一定程度上等于“不可靠”,UDP(User Datagram Protocol,用户数据报协议)提供这种尽力而为、不可靠的传输服务,传输的报文可能丢失、乱序,在实践中主要用于实时流媒体和一些事务性应用,通常DNS就是使用UDP的。UDP有以下特点:
- 提供复用、解复用和少量的差错检测功能。首先需要明确,运输层协议最低限度必须提供一种复用、解复用服务,以便在网络层与正确的应用进程间传递数据。UDP就是做了这种最少的工作,仅仅在IP之上增加了供复用、解复用和少量的差错检测功能外,几乎没有对IP增加别的东西。
- 无连接的服务。使用UDP时,在报文发送之前,发送方和接收方实体间并没有进行握手,即是无连接的。
二、UDP存在的理由
既然UDP是不可靠的服务,而且存在可以提供可靠服务的传输协议,例如TCP,那么UDP还有什么存在的理由呢?原因如下:
- 对于发送数据的应用层控制更加精细。即使用UDP时,只要进程将数据传递给UDP,UDP就会将数据打包并立即将其传递给网络层。而反观TCP,TCP的拥塞控制机制则可能使交付时间延长太多。一些应用通常只要求最小的发送速率,不希望过分地延迟,并能容忍一些数据丢失,这便是UDP的用武之地。
- 无须建立连接。相较于TCP在传输之前需要进行三次握手,UDP不需要任何准备即可进行数据传输,这在一定程度上表明UDP有着更低的传输时延。
- 无连接状态。相较于TCP必须维护连接状态,UDP无需维护连接状态。因此对某些特定应用来说,服务器可以支持更多的用户。
- 分组首部开销小。UDP仅有8字节开销,而TCP都有20字节的首部开销。
可以看出,UDP适合使用在一些可以容忍少量分组丢失的应用中,例如视频会议、流式媒体传输等。有意思的是,不可靠的服务在某些场景中可能会优于可靠的服务,这也提醒我们对于事物的认知应该是多维度的,“因地制宜”!此外,使用UDP的应用是可能实现可靠传输服务的,例如谷歌的QUIC协议。
三、UDP检验和
UDP检验和提供了差错检测功能。检验和用于确定UDP报文段从源到目的地移动过程时,其中的比特是否发生了改变。检验和计算方式较为简单,不在此描述,但需要注意的是
- UDP检验和不通过则数据一定发生了错误,而即使通过校验数据也不一定是对的,被称为“残存错误”。
- UDP提供差错检测,不进行差错恢复。UDP的某些实现仅丢弃受损的报文段,有的实现则是将受损报文交给应用进程并发出警告。
本文为个人学习笔记,如有错漏之处,敬请指正!