目录
- TCP 和 UDP 有哪些区别?
- UDP 包头解析
- UDP 的三大特点
- UDP 的三大使用场景
- 总结
传输层里比较重要的两个协议,一个是 TCP,一个是 UDP。
TCP 和 UDP 有哪些区别?
大部分人会想到:TCP 是面向连接的,UDP 是面向无连接的。
什么是面向连接?
面向连接的协议在通信之前会先建立连接。例如,TCP 通过三次握手建立连接,而 UDP 则无需如此。这么一看,似乎 TCP 的“三次握手”也可以被 UDP 模仿,简单发三个包就行了。那么,二者有何不同?
建立连接的本质是为了在客户端和服务端之间维护一个连接状态,并通过一定的数据结构记录交互状态。这些状态维护为 TCP 提供了所谓“面向连接”的能力。
TCP 的特性
-
可靠交付
TCP 提供可靠的数据传输,保证数据无差错、不丢失、不重复,并按序到达。相比之下,IP 包本身不具备可靠性,一旦丢失,便无法挽回。而 TCP 则通过状态维护和机制补偿,实现了可靠传输。
-
面向字节流
TCP 是面向字节流的协议,数据被抽象为一个连续的流,收发时没有明确的分段。虽然底层仍然依赖 IP 包(一个一个地发送),但 TCP 通过状态管理,将其抽象成一个完整的数据流。而 UDP 直接继承了 IP 包的特性,按数据报发送,每个报文独立处理。
-
拥塞控制
TCP 能根据网络状况进行流量控制。例如,发现丢包或网络质量恶化时,它会调整发送速率,避免进一步加剧拥堵。UDP 则完全不管这些——应用让我发多少,我就发多少,不考虑网络的承受能力。
-
有状态服务
TCP 是有状态的,它精确记录了已经发送和接收的数据状态,比如:发送到哪里了?接收到了什么?应该接收哪些?任何差错都会被捕获和修复。UDP 则是无状态的,简单发送,不关心是否丢包、是否按序到达。
UDP 的特性
UDP 简单地继承了 IP 包的特性,基本不维护状态,发送和接收全靠应用层自己处理。它的特点可以总结为:
-
不保证可靠性:丢包、错包都可能发生,UDP 不会纠正这些问题。
-
不保证顺序:数据可能乱序到达,应用层需要自己排序。
-
基于数据报:UDP 直接处理每个独立报文,不会抽象为流。
-
无拥塞控制:UDP 不关心网络情况,不会主动调整发送速率。
对比总结
可以简单比喻:
- TCP 是有“脑子”的协议,它通过状态维护和机制保证可靠、流畅的数据传输。
- UDP 是“没脑子”的协议,它只负责把数据发出去,其他问题完全不管。
如果把网络通信比作家庭,MAC 层负责定义局域网络的行为,IP 层定义整个网络端到端的传输行为。这两层奠定了通信的“基因”:以包为单位传输,包的单独选路和传递不保证可靠性。基于这些基因,UDP 完全继承了特性,几乎没有自己的思想。而 TCP 则在此基础上,通过复杂的状态管理,成为了更智能的协议。
UDP 包头解析
在讨论 UDP 包头之前,我们需要理解数据包的传输过程:
当一个 UDP 数据包到达目标机器时,MAC 层首先验证包的目标 MAC 地址是否匹配。如果匹配,它会剥离 MAC 层头部,并将剩余部分传递给IP 层。IP 层检查 IP 包头中的目标 IP 地址是否匹配当前机器。如果匹配,IP 层会继续解析,判断数据包应该交由哪个协议处理。
IP 包头的作用
在 IP 包头中,有一个 8 位协议字段,用于标识当前传输的协议类型,例如 TCP 或 UDP。如果该字段指向 UDP,系统会将 IP 头剥离,并将剩下的部分交给 UDP 协议进行处理。
UDP 包头的作用
当 IP 层交出 UDP 数据后,UDP 层需要解析自己的包头。那么 UDP 包头的内容是什么样的呢?
-
端口号
UDP 包头中有两个端口号字段:- 源端口号:表示数据来自哪个端口。
- 目标端口号:表示数据要发往哪个端口。
正是通过目标端口号,系统能够将数据交给对应监听该端口的应用程序。
-
长度字段
表示整个 UDP 数据报的长度,包括 UDP 包头和数据的总长度。 -
校验和
UDP 提供了简单的错误检测机制,利用校验和字段确保数据传输的完整性。尽管 UDP 不负责重传或纠正错误,但校验和可以帮助检测数据是否被破坏。
UDP 包头格式
UDP 包头固定为 8 字节,结构如下图。

UDP 包头特点
与 TCP 包头相比,UDP 包头非常简单,仅包含必要信息。没有复杂的状态管理字段,也没有用于重传的机制。正因为如此,UDP 的数据传输效率较高,适用于实时性要求强的场景(如视频流、在线游戏等)。
总结
UDP 包头的设计简洁高效,核心作用是:
- 使用 端口号 确定数据的目标应用程序。
- 使用 校验和 检查数据完整性。
尽管 UDP 不提供可靠性和顺序保证,但其轻量化的特性使得它成为对传输效率要求较高场景的首选。与之相比,TCP 的包头则包含了更多状态管理信息,为复杂的数据传输提供支持。
UDP 的三大特点
UDP 就像个简单直白的小孩子,有以下三个显著特点:
-
沟通简单
UDP 没有复杂的“花花肠子”,省去了繁琐的连接建立和状态维护。它的设计非常简洁:
-
没有冗长的包头:仅包含端口号、长度和校验和字段。
-
没有复杂的机制:不需要考虑重传、流量控制等逻辑。
-
它天真地相信网络世界是美好的,数据包发出去就能到达目的地,丢包和错误是小概率事件。因此,它的通信效率极高。
- 不设防的信任
UDP 不需要像 TCP 那样建立连接:- 任何人都可以通过端口发送数据给它。
- 它也可以毫无顾忌地向任何人发送数据,甚至能同时广播给多个目标。
这种“开放式”的沟通方式让 UDP 非常灵活,但也意味着它缺乏安全性和可靠性。
- 坚持到底的“愣头青”
UDP 从不根据网络环境调整自己的行为:- 不关心拥塞控制:即使网络已经挤得喘不过气,它也会按照应用要求的速率继续发包。
- 不考虑丢包情况:数据丢失时,它不会重发,交给应用自己处理。
这种“不懂变通”的性格让 UDP 非常适合对实时性要求高的场景,比如在线直播、实时游戏等。
UDP 的三大使用场景
基于 UDP 的简单高效和“不拘小节”,它适用于以下场景:
-
资源受限,容忍失败的内网应用
UDP 的设计简单,不需要大量资源,非常适合内网环境或者对丢包不敏感的场景。
比如:- DHCP:动态获取 IP 地址的协议。因为内网环境可靠性较高,即使丢包也可以重新尝试,适合使用 UDP。
- PXE 和 TFTP:在操作系统未加载前,资源受限的设备需要轻量级协议下载操作系统镜像,UDP 的简洁正是它们的最佳选择。
在这些场景中,UDP 像“初出茅庐的新人”,虽然简单,但足以应对没有复杂需求的项目。
-
广播和多播的通信需求
UDP 的无连接特性,非常适合广播和多播场景。
例如:- 广播(DHCP):DHCP 使用广播让局域网中的设备接收地址分配请求。
- 多播(组播地址 D 类 IP):支持一对多通信,例如 VXLAN 协议通过 UDP 实现跨路由器的组播。
这种“公开透明”的特性,让 UDP 成为广播和多播协议的基础。而 TCP 的连接机制决定了它只能用于一对一通信,不适合这种场景。、
-
低时延、高实时性、容忍丢包的应用
UDP 的轻量级和简单性,使其非常适合对时延敏感、追求实时性且能容忍少量丢包的应用场景。
比如:- 在线游戏:实时游戏需要尽可能快地传输位置信息和动作指令,少量丢包对体验影响不大。
- 实时视频/音频流:直播或视频通话,时延比丢包更关键,宁可画面模糊、声音断续,也不能拖延。
这些场景中,UDP 的“不讲究”反而成为优势。TCP 在丢包时的重传和拥塞控制会拖慢传输速度,而 UDP 则坚持“能发多少发多少”,即使网络环境恶劣,也不轻易退缩。
总结
如果将 TCP 比作成熟的社会人,UDP 则是头脑简单的小朋友。TCP 复杂,UDP 简单;TCP 维护连接,UDP 谁都相信;TCP 会坚持知进退;UDP 愣头青一个,勇往直前;
UDP 虽然简单,但它有简单的用法。它可以用在环境简单、需要多播、应用层自己控制传输的地方。例如 DHCP、VXLAN、QUIC 等。
思考题:
1、都说 TCP 是面向连接的,在计算机看来,怎么样才算一个连接呢?
2、你知道 TCP 的连接是如何建立,又是如何关闭的吗?
1.两端各自记录对方的IP端口序列号连接状态等,并且维护连接状态
2.三次握手四次挥手
