# TCP和UDP的区别

TCP（Transmission Control Protocol 传输控制协议）是一种面向连接的、可靠的、基于字节流的传输层通信协议。\
UDP(User Datagram Protocol用户数据报协议）是OSI（Open System Interconnection，开放式系统互联） 参考模型中一种无连接的传输层协议，提供面向事务的简单不可靠信息传送服务。

## 对比

|   对比  |   TCP   |  UDP  |
| :---: | :-----: | :---: |
|  是否连接 |   面向连接  | 面向非连接 |
| 传输可靠性 |   可靠的   |  不可靠的 |
|  应用场合 | 传输大量的数据 |  少量数据 |
|   速度  |    慢    |   快   |

UDP 与 TCP 的主要区别在于 **UDP 不一定提供可靠的数据传输**。事实上，该协议不能保证数据准确无误地到达目的地。UDP 在许多方面非常有效。当某个程序的目标是尽快地传输尽可能多的信息时（其中任意给定数据的重要性相对较低），可使用 UDP。

ICQ 短消息使用 UDP 协议发送消息。\
许多程序将使用单独的TCP连接和单独的UDP连接。重要的状态信息随可靠的TCP连接发送，而主数据流通过UDP发送。

**TCP的目的是提供可靠的数据传输，并在相互进行通信的设备或服务之间保持一个虚拟连接。** TCP在数据包接收无序、丢失或在交付期间被破坏时，负责数据恢复。它通过为其发送的每个数据包提供一个序号来完成此恢复。记住，较低的网络层会将每个数据包视为一个独立的单元，因此，数据包可以沿完全不同的路径发送，即使它们都是同一消息的组成部分。这种路由与网络层处理分段和重新组装数据包的方式非常相似，只是级别更高而已。

为确保正确地接收数据，**TCP要求在目标计算机成功收到数据时发回一个确认（即 ACK）**。如果在某个时限内未收到相应的 ACK，将重新传送数据包。如果网络拥塞，这种重新传送将导致发送的数据包重复。但是，接收计算机可使用数据包的序号来确定它是否为重复数据包，并在必要时丢弃它。

**TCP与UDP的选择**

如果比较UDP包和TCP包的结构，很明显UDP包不具备TCP包复杂的可靠性与控制机制。与TCP协议相同，UDP的源端口数和目的端口数也都支持一台主机上的多个应用。一个16位的UDP包含了一个字节长的头部和数据的长度，校验码域使其可以进行整体校验。（许多应用只支持UDP，如：多媒体数据流，不产生任何额外的数据，即使知道有破坏的包也不进行重发。）

很明显，**当数据传输的性能必须让位于数据传输的完整性、可控制性和可靠性时，TCP协议是当然的选择。当强调传输性能而不是传输的完整性时，如：音频和多媒体应用，UDP是最好的选择**在数据传输时间很短，以至于此前的连接过程成为整个流量主体的情况下，UDP也是一个好的选择，如：DNS交换。把SNMP建立在UDP上的部分原因是设计者认为当发生网络阻塞时，UDP较低的开销使其有更好的机会去传送管理数据。TCP丰富的功能有时会导致不可预料的性能低下，但是我们相信在不远的将来，TCP可靠的点对点连接将会用于绝大多数的网络应用。

TCP协议和UDP协议特性区别总结：\
1\. TCP协议在传送数据段的时候要给段标号；UDP协议不\
2\. TCP协议可靠；UDP协议不可靠 3. TCP协议是面向连接；UDP协议采用无连接 4. TCP协议负载较高，采用虚电路；UDP采用无连接 5. TCP协议的发送方要确认接收方是否收到数据段（3次握手协议）\
6\. TCP协议采用窗口技术和流控制

一个非典型的例子：

关于QQ采用UDP而不用TCP是一个比较特殊的例子，与当时环境有一定的关系，当时的网络环境并不好，TCP需要三次握手，网络问题经常导致问题，TCP方式的完整性，可靠等反而成了劣势，导致当时选择UDP，而且腾讯现在关于UDP的QQ做的非常不错，所以就没有换回来。

具体详细可参考：[QQ 为什么以 UDP 协议为主，以 TCP 协议为辅？](https://www.zhihu.com/question/20292749)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xia-ao.gitbook.io/notes/computer/network/tcp-he-udp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
