概述
UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个简单的面向数据报的传输层协议,在网络中用于处理数据包,是一种无连接的协议。UDP不提供可靠性的传输,它只是把应用程序传给 IP 层的数据报发送出去,但是并不能保证它们能到达目的地。由于 UDP 在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
此外,UDP不提供数据包分组、组装,不能对数据包进行排序。
UDP的主要特点
无连接性:UDP不需要在发送数据之前建立连接,因此发送端和接收端之间没有建立和维护连接的开销。每个UDP数据报都是独立的,不会与其他数据报之间有任何关系。
不可靠性:UDP不提供可靠性保证,即它无法确保数据报的可靠传输。一旦发送端将数据报发送给接收端,它就无法得知数据报是否成功到达目标,也无法处理丢失、重排或重复的数据报。UDP仅仅提供一种尽力而为的传输服务。
简单性:由于UDP的设计目标是简化传输协议,它的头部字段数量较少,占用的开销相对较小。这使得UDP具有较低的延迟和较小的数据报大小。
快速:UDP没有像TCP那样处理可靠性、流量控制和拥塞控制等复杂机制,因此它的处理速度更快。这使得UDP成为一些对实时性要求较高的应用(如音频和视频传输)的理想选择。
UDP的报文格式
源端口号(Source Port):占用16位,表示发送端的端口号。
目标端口号(Destination Port):占用16位,表示接收端的端口号。
长度(Length):占用16位,表示UDP报文(包括头部和数据部分)的总长度,以字节为单位。
校验和(Checksum):占用16位,用于检测UDP报文在传输过程中的错误。发送端计算校验和,并将其存储在报文头部,接收端通过计算校验和来验证报文的完整性。
UDP的工作原理
应用程序准备数据:应用程序将要发送的数据准备好,并指定目标接收端的IP地址和端口号。
数据封装:UDP将应用程序准备好的数据封装成UDP数据报,包括UDP头部和应用数据部分。UDP头部包含源端口号和目标端口号等信息。
IP寻址和发送:操作系统根据目标接收端的IP地址进行寻址,在网络层(IP层)将数据进行封装,加上IP头部信息(如源IP地址和目标IP地址),并将其传递给网络接口层。
网络传输:数据经过网络进行传输,沿着网络路径通过路由器、交换机等网络设备最终到达目标接收端所在的网络。
接收端接收数据:目标接收端的操作系统接收到数据报,进行解析和处理。
数据解封装:接收端操作系统根据UDP头部的目标端口号确定将数据报传递给哪个应用程序。
应用程序处理数据:接收端的应用程序使用接收到的数据进行后续的处理,如解析、显示、存储等操作。
UDP的应用场景
实时游戏:在实时游戏中,每个玩家都需要实时地向服务器发送和接收数据,包括玩家的位置、动作等信息,这些信息需要快速传输,而不必保证数据的可靠性。UDP 可以满足这种实时性的需求,可以实现低延迟的游戏体验。
视频和音频流传输:在视频和音频流传输过程中,数据量非常大,而且需要实时传输,延迟较高的话会导致视频和音频的不同步。UDP 可以通过抛弃部分数据包来保证传输速率,从而实现实时的视频和音频传输。
DNS 解析:DNS(Domain Name System)是一种用于将域名映射到 IP 地址的系统。在进行 DNS 解析时,需要尽快地将请求和响应传输出去,因为 DNS 请求很多,而且需要尽快得到响应,否则会影响用户的访问体验。
简单的广播或多播应用:UDP支持广播和多播功能,可以将数据同时传输给多个接收者,适用于一些简单的广播或多播场景。
简单的请求-响应协议:一些简单的请求-响应协议,比如网络时间协议(NTP)、简单网络管理协议(SNMP)等,可以使用 UDP 实现,因为这些协议的数据包较小,而且需要实时传输。
TCP与UDP的区别:
连接性:TCP是面向连接的协议,必须在发送数据之前先建立连接。而UDP是无连接的协议,不需要建立连接。
可靠性:TCP提供可靠的数据传输机制,通过序列号、确认应答、超时重传和流量控制等机制来确保数据的可靠传输。UDP不提供可靠性保证,数据报可能丢失、重排或重复。
有序性:TCP保证数据的有序性,即发送的数据会按照发送的顺序到达接收端。UDP不保证数据的有序性,数据报可能以任意顺序到达接收端。
拥塞控制:TCP具有拥塞控制机制,如果网络出现拥塞,TCP会降低发送速率以避免网络的过载。UDP没有拥塞控制机制,它会以恒定的速率发送数据,因此在拥塞的网络中可能会导致丢包情况。