UDP协议详解:最简单的传输层协议
UDP协议详解:最简单的传输层协议
一、UDP协议概述
一、UDP概述:轻便快速的“无连接”协议
大家一定都听过“TCP”,那是 TCP/IP网络协议栈中最知名的协议之一,TCP/IP 协议栈用 TCP 和 IP 命名就足以说明这两个协议的关键地位。
但是 TCP/IP 协议栈还有一个没那么出名的传输层协议——UDP(用户数据报协议)
UDP(User Datagram Protocol),顾名思义,跟它的“兄弟”TCP相比,它更简单、轻便,且省略了很多“繁琐”的环节。
UDP不提供连接管理,也没有 TCP 那么复杂的流量控制和重传机制,它仅仅负责**“尽力而为”**地传输数据。
说到这,你可能会想:“这家伙,怎么听起来那么不靠谱?没有可靠性,那我怎么放心用它?”
答案其实就在于:UDP有自己的优势,在某些场景下,它的这种“无状态”性质反而使它变得高效。
二、UDP 协议的前世今生
关于 UDP、TCP 和 IP 这几个协议,并不是一开始就分的这么层次清晰的。
当互联网协议栈(TCP/IP 协议栈)最初在1970年代被设计和开发时,TCP(传输控制协议)和 IP(互联网协议)是作为一个整体协议来处理的。这一协议的目的是提供可靠的数据传输,同时具备路由功能。
简单理解为早期 TCP + IP 是一个整体,叫做网络控制协议(NCP),提供类似当前 TCP 的可靠传输能力。
但是,开发人员慢慢意识到将传输控制功能和网络寻址功能放在同一层设计的局限性,并不是所有的应用程序都需要为了“可靠传输”来容忍建立连接、重传这些可靠传输的额外开销。
特别是随着网络的扩展和应用越来越多样性的需求,网络层和传输层的分离显得越来越必要。
最终,TCP 和 IP 被分离成了独立的协议:
- IP:专注于网络层,负责数据包的寻址和路由。IP提供的是一种“无连接、不可靠”的传输方式,仅负责把数据包送达目的地,不保证数据包的顺序和完整性。
- TCP:专注于传输层,负责端到端的数据传输可靠性。TCP在IP的基础上增加了“可靠性”特性,通过三次握手、数据包重传、流量控制等机制保证数据的完整传输。
有意思的是,将 NCP 协议一分为 TCP 和 IP 的过程也挺长的,并且在 TCP 协议第四版中终于确定了第三层成为互联网协议(IP),因为第一个 IP 协议,也就叫做 IPv4,这是 IPv4 的由来~
这样,网络层的 IP 可以独立发展,用于其他传输协议(如UDP),而 TCP 则依赖 IP 来进行底层的数据传输。
三、UDP 协议特点
UDP 协议最大的特点就是 emmm 没什么特点,写这篇关于 UDP 的文章,我就发现似乎 UDP 真没太多可说的。
因为 UDP 协议是所有 TCP/IP 协议中最简单的。
它所做的只是拿到上层应用层的数据,将其封装为简化的消息格式,然后将其发送到 IP 层进行传输。
不过还是总结一下 UDP 的特点吧:
- 无连接:与 TCP 不同,UDP 在发送数据之前,不需要与目标主机建立连接,也不需要经过“三次握手”这些复杂的步骤。它就像是投掷一封信到远方,根本不管信是否能够成功送达。
- 无状态:UDP 不维护任何的连接状态,也不记录数据的发送情况。每次发送的数据包都是独立的,UDP不关心数据包的顺序和丢失。每个数据包(Datagram)独立存在,和其他的数据包没有任何关系。
- 尽力而为:UDP 会尽力传输数据,但并不保证数据一定能够成功到达目标主机,也不保证数据的顺序。它没有流量控制、拥塞控制,也不提供重传机制。如果一个数据包丢失了,发送方也不会自动重新发送。它的目标就是尽可能快速地把数据送到目标。
- 较小的开销:由于没有TCP那种复杂的控制机制,UDP报文头的大小也较小(只有8字节),这使得它在带宽受限或要求低延迟的场景反而表现得更好。
在 TCP/IP Guide 这本书中,作者说 UDP 非常简单,以致于经常描述它不做什么,而不是它做什么。
从不做什么角度,可能更能清晰的记住 UDP 提供的服务:
- UDP 在发送数据之前不建立连接,它只是将其打包然后发送。
- UDP 不提供确认来表明数据已收到。
- UDP 不保证其消息一定会到达。
- UDP 不会检测丢失的消息并重新传输它们。
- UDP 不确保数据的接收顺序与发送顺序相同。
- UDP 不提供任何机制来管理设备之间的数据流或处理拥塞。
**这些描述基本上和 IP 协议差不多,所以可以把 UDP 当成具有传输层端口寻址的 IP **
四、UDP协议报文格式
尽管没有连接管理,UDP仍然有自己的“报文头”来确保数据的基础传输功能,UDP 报文头长度仅为 8 个字节:
Field Name | Size (bytes) | Description |
---|---|---|
Source Port 源端口 | 2 | 源设备上发起 UDP 消息的进程的 16 位端口号。通常是客户端向服务器发送请求的临时(客户端)端口号,或者是服务器向客户端回复的众所周知/注册的(服务器)端口号。 |
Destination Port 目标端口 | 2 | 作为目标设备上消息的最终预期接收者的进程的 16 位端口号。通常是客户端请求的众所周知/注册的(服务器)端口号,或者是服务器回复时(客户端)端口号。 |
Length 长度 | 2 | 整个 UDP 数据报的长度,包括报头和数据字段。 |
Checksum 校验和 | 2 | 在整个 UDP 数据报上计算的可选 16 位校验和以及特殊的“伪标头”字段。 |
Data 数据 | 可变的 | 封装后要发送的高层消息。 |