|
11 | 11 |
|
12 | 12 | ### TCP 与 UDP 的区别(重要)
|
13 | 13 |
|
14 |
| -1. **是否面向连接**:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 |
15 |
| -2. **是否是可靠传输**:远地主机在收到 UDP 报文后,不需要给出任何确认,并且不保证数据不丢失,不保证是否顺序到达。TCP 提供可靠的传输服务,TCP 在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。 |
16 |
| -3. **是否有状态**:这个和上面的“是否可靠传输”相对应。TCP 传输是有状态的,这个有状态说的是 TCP 会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此 ,TCP 需要维持复杂的连接状态表。而 UDP 是无状态服务,简单来说就是不管发出去之后的事情了(**这很渣男!**)。 |
17 |
| -4. **传输效率**:由于使用 TCP 进行传输的时候多了连接、确认、重传等机制,所以 TCP 的传输效率要比 UDP 低很多。 |
18 |
| -5. **传输形式**:TCP 是面向字节流的,UDP 是面向报文的。 |
19 |
| -6. **首部开销**:TCP 首部开销(20 ~ 60 字节)比 UDP 首部开销(8 字节)要大。 |
20 |
| -7. **是否提供广播或多播服务**:TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多; |
| 14 | +1. **是否面向连接**: |
| 15 | + - TCP 是面向连接的。在传输数据之前,必须先通过“三次握手”建立连接;数据传输完成后,还需要通过“四次挥手”来释放连接。这保证了双方都准备好通信。 |
| 16 | + - UDP 是无连接的。发送数据前不需要建立任何连接,直接把数据包(数据报)扔出去。 |
| 17 | +2. **是否是可靠传输**: |
| 18 | + - TCP 提供可靠的数据传输服务。它通过序列号、确认应答 (ACK)、超时重传、流量控制、拥塞控制等一系列机制,来确保数据能够无差错、不丢失、不重复且按顺序地到达目的地。 |
| 19 | + - UDP 提供不可靠的传输。它尽最大努力交付 (best-effort delivery),但不保证数据一定能到达,也不保证到达的顺序,更不会自动重传。收到报文后,接收方也不会主动发确认。 |
| 20 | +3. **是否有状态**: |
| 21 | + - TCP 是有状态的。因为要保证可靠性,TCP 需要在连接的两端维护连接状态信息,比如序列号、窗口大小、哪些数据发出去了、哪些收到了确认等。 |
| 22 | + - UDP 是无状态的。它不维护连接状态,发送方发出数据后就不再关心它是否到达以及如何到达,因此开销更小(**这很“渣男”!**)。 |
| 23 | +4. **传输效率**: |
| 24 | + - TCP 因为需要建立连接、发送确认、处理重传等,其开销较大,传输效率相对较低。 |
| 25 | + - UDP 结构简单,没有复杂的控制机制,开销小,传输效率更高,速度更快。 |
| 26 | +5. **传输形式**: |
| 27 | + - TCP 是面向字节流 (Byte Stream) 的。它将应用程序交付的数据视为一连串无结构的字节流,可能会对数据进行拆分或合并。 |
| 28 | + - UDP 是面向报文 (Message Oriented) 的。应用程序交给 UDP 多大的数据块,UDP 就照样发送,既不拆分也不合并,保留了应用程序消息的边界。 |
| 29 | +6. **首部开销**: |
| 30 | + - TCP 的头部至少需要 20 字节,如果包含选项字段,最多可达 60 字节。 |
| 31 | + - UDP 的头部非常简单,固定只有 8 字节。 |
| 32 | +7. **是否提供广播或多播服务**: |
| 33 | + - TCP 只支持点对点 (Point-to-Point) 的单播通信。 |
| 34 | + - UDP 支持一对一 (单播)、一对多 (多播/Multicast) 和一对所有 (广播/Broadcast) 的通信方式。 |
21 | 35 | 8. ……
|
22 | 36 |
|
23 |
| -我把上面总结的内容通过表格形式展示出来了!确定不点个赞嘛? |
| 37 | +为了更直观地对比,可以看下面这个表格: |
24 | 38 |
|
25 |
| -| | TCP | UDP | |
26 |
| -| ---------------------- | -------------- | ---------- | |
27 |
| -| 是否面向连接 | 是 | 否 | |
28 |
| -| 是否可靠 | 是 | 否 | |
29 |
| -| 是否有状态 | 是 | 否 | |
30 |
| -| 传输效率 | 较慢 | 较快 | |
31 |
| -| 传输形式 | 字节流 | 数据报文段 | |
32 |
| -| 首部开销 | 20 ~ 60 bytes | 8 bytes | |
33 |
| -| 是否提供广播或多播服务 | 否 | 是 | |
| 39 | +| 特性 | TCP | UDP | |
| 40 | +| ------------ | -------------------------- | ----------------------------------- | |
| 41 | +| **连接性** | 面向连接 | 无连接 | |
| 42 | +| **可靠性** | 可靠 | 不可靠 (尽力而为) | |
| 43 | +| **状态维护** | 有状态 | 无状态 | |
| 44 | +| **传输效率** | 较低 | 较高 | |
| 45 | +| **传输形式** | 面向字节流 | 面向数据报 (报文) | |
| 46 | +| **头部开销** | 20 - 60 字节 | 8 字节 | |
| 47 | +| **通信模式** | 点对点 (单播) | 单播、多播、广播 | |
| 48 | +| **常见应用** | HTTP/HTTPS, FTP, SMTP, SSH | DNS, DHCP, SNMP, TFTP, VoIP, 视频流 | |
34 | 49 |
|
35 | 50 | ### 什么时候选择 TCP,什么时候选 UDP?
|
36 | 51 |
|
37 |
| -- **UDP 一般用于即时通信**,比如:语音、 视频、直播等等。这些场景对传输数据的准确性要求不是特别高,比如你看视频即使少个一两帧,实际给人的感觉区别也不大。 |
38 |
| -- **TCP 用于对传输准确性要求特别高的场景**,比如文件传输、发送和接收邮件、远程登录等等。 |
| 52 | +选择 TCP 还是 UDP,主要取决于你的应用**对数据传输的可靠性要求有多高,以及对实时性和效率的要求有多高**。 |
| 53 | + |
| 54 | +当**数据准确性和完整性至关重要,一点都不能出错**时,通常选择 TCP。因为 TCP 提供了一整套机制(三次握手、确认应答、重传、流量控制等)来保证数据能够可靠、有序地送达。典型应用场景如下: |
| 55 | + |
| 56 | +- **Web 浏览 (HTTP/HTTPS):** 网页内容、图片、脚本必须完整加载才能正确显示。 |
| 57 | +- **文件传输 (FTP, SCP):** 文件内容不允许有任何字节丢失或错序。 |
| 58 | +- **邮件收发 (SMTP, POP3, IMAP):** 邮件内容需要完整无误地送达。 |
| 59 | +- **远程登录 (SSH, Telnet):** 命令和响应需要准确传输。 |
| 60 | +- ...... |
| 61 | + |
| 62 | +当**实时性、速度和效率优先,并且应用能容忍少量数据丢失或乱序**时,通常选择 UDP。UDP 开销小、传输快,没有建立连接和保证可靠性的复杂过程。典型应用场景如下: |
| 63 | + |
| 64 | +- **实时音视频通信 (VoIP, 视频会议, 直播):** 偶尔丢失一两个数据包(可能导致画面或声音短暂卡顿)通常比因为等待重传(TCP 机制)导致长时间延迟更可接受。应用层可能会有自己的补偿机制。 |
| 65 | +- **在线游戏:** 需要快速传输玩家位置、状态等信息,对实时性要求极高,旧的数据很快就没用了,丢失少量数据影响通常不大。 |
| 66 | +- **DHCP (动态主机配置协议):** 客户端在请求 IP 时自身没有 IP 地址,无法满足 TCP 建立连接的前提条件,并且 DHCP 有广播需求、交互模式简单以及自带可靠性机制。 |
| 67 | +- **物联网 (IoT) 数据上报:** 某些场景下,传感器定期上报数据,丢失个别数据点可能不影响整体趋势分析。 |
| 68 | +- ...... |
39 | 69 |
|
40 | 70 | ### HTTP 基于 TCP 还是 UDP?
|
41 | 71 |
|
|
0 commit comments