文章目录
TCP 和 UDP 是网络传输层最核心的两个协议,它们之间的区别是网络编程的基础。
简单来说,它们像是两种不同风格的快递服务:
-
TCP (Transmission Control Protocol) : 像顺丰或FedEx的签约快递 📦。
- 先联系:寄件前,快递员会先给你打电话确认地址和时间(建立连接)。
- 保送达:有签收回执,保证包裹一定送到你手上(可靠)。
- 按顺序:如果你寄了三个包裹,会按1、2、3的顺序送达(有序)。
- 速度慢:因为要确认、要签收、要排序,流程多,所以速度相对较慢,开销也大。
-
UDP (User Datagram Protocol) : 像中通、圆通 ✉️。
- 直接寄:写上地址就直接扔进邮筒,不用提前联系(无连接)。
- 不保证:信件可能会在路上丢失,你也不知道对方是否收到(不可靠)。
- 可能乱序:你连续寄三封信,对方收到的顺序可能是2、1、3(无序)。
- 速度快:流程简单,没有额外的确认环节,所以速度非常快,开销小。
核心区别详解
它们都位于网络的传输层 ,都使用端口号来识别不同的应用程序,但它们的设计哲学和工作方式截然不同。
1. 连接性:面向连接 vs. 无连接
- TCP (面向连接) : 在发送数据之前,必须先通过**"三次握手"与对方建立一个稳定的连接。数据传输结束后,还需要通过"四次挥手"**来断开连接。整个过程像打电话,需要先拨号、通话、再挂机。
- UDP (无连接): 发送数据前不需要建立任何连接,直接把数据打包(称为数据报,Datagram)就往外扔。不管对方是否准备好,是否在线,直接发送。这被称为"即发即忘"。
2. 可靠性:可靠 vs. 不可靠
- TCP (可靠) : TCP 提供了强大的可靠性保障机制。
- 确认与重传: 接收方每收到一个数据包,都会发送一个确认(ACK)信息。如果发送方在一定时间内没收到确认,就会重新发送该数据包。
- 数据校验: 通过校验和检查数据在传输过程中是否损坏。
- 流量控制: 控制发送方的发送速率,防止过快的数据淹没接收方。
- 拥塞控制: 当网络拥堵时,会主动减慢发送速率,防止网络崩溃。
- UDP (不可靠): UDP 不提供任何可靠性保证。它只负责把数据尽可能快地发出去,但不保证数据能否到达、何时到达、是否完整。可靠性需要由上层的应用程序自己来保障。
3. 有序性:有序 vs. 无序
- TCP (有序): TCP 给每个数据包都编了号(序列号),接收方会根据序号对数据包进行排序,确保应用程序读到的数据流是完整且有序的。
- UDP (无序): UDP 不保证数据包的顺序,它们到达的顺序可能与发送顺序完全不同。
4. 速度与效率:慢 vs. 快
- TCP (较慢): 因为需要建立连接、发送确认、处理排序、进行流量和拥塞控制等,这些可靠性机制带来了额外的延迟和系统开销。
- UDP (非常快): 没有这些复杂的控制逻辑,协议本身非常轻量,因此传输延迟低,效率高。
5. 头部开销:大 vs. 小
- TCP : 头部较大,至少需要 20字节,包含了序列号、确认号、窗口大小等大量控制信息。
- UDP : 头部非常小,固定为 8字节,只包含源/目的端口、长度和校验和。
总结对比表
特性 | TCP (传输控制协议) | UDP (用户数据报协议) |
---|---|---|
连接性 | 面向连接 (需三次握手/四次挥手) | 无连接 (即发即忘) |
可靠性 | 可靠 (确认、重传、校验机制) | 不可靠 (尽力而为) |
有序性 | 有序 (通过序列号保证顺序) | 无序 (到达顺序不确定) |
速度 | 较慢 | 非常快 |
头部大小 | 20+ 字节 | 8 字节 |
数据形式 | 流式传输 (Stream) | 数据报 (Datagram) |
适用场景 | 要求高可靠性:网页(HTTP)、文件传输(FTP)、邮件(SMTP) | 要求低延迟、可容忍丢包:直播、视频通话、在线游戏、DNS |
何时选择?
- 选择 TCP: 当数据完整性和可靠性至关重要,不容许任何差错时。例如,你下载一个文件,绝不能缺少任何一个字节。
- 选择 UDP: 当实时性和速度的要求高于一切,并且可以容忍少量数据丢失时。例如,在视频通话中,丢失一两帧画面影响不大,但如果为了等一个丢失的包而导致画面卡顿,是无法接受的。