# TCP与UDP 对比

**面向报文的传输方式**是应用层交给UDP多长的报文，UDP就照样发送，即一次发送一个报文。发送方的UDP对应用程序交下来的报文，在添加首部后就向下交付给IP层。既不拆分，也不合并，而是保留这些报文的边界，因此，应用程序需要选择合适的报文大小。

**面向字节流**的话，虽然应用程序和TCP的交互是一次一个数据块（大小不等），但TCP把应用程序看成是一连串的无结构的字节流。TCP有一个缓冲，当应用程序传送的数据块太长，TCP就可以把它划分短一些再传送。如果应用程序一次只发送一个字节，TCP也可以等待积累有足够多的字节后再构成报文段发送出去。

## TCP协议

* Transmission Control Protocol，传输控制协议
* 面向连接的协议
* 需要三次握手建立连接
* 需要四次挥手断开连接
* TCP报头最小长度：20字节

## 三次握手的过程：

1. 客户端发送：SYN = 1, SEQ = X, 端口号
2. 服务器回复：SYN = 1, ACK = X + 1, SEQ = Y
3. 客户端发送：ACK = Y + 1, SEQ = X + 1

> 确认应答信号ACK = 收到的SEQ + 1。 连接建立中，同步信号SYN始终为1。连接建立后，同步信号SYN=0。

## 四次挥手过程

1. A向B提出停止连接请求，FIN = 1
2. B收到，ACK = 1
3. B向A提出停止连接请求，FIN = 1
4. A收到，ACK = 1

**优点：**

* 可靠，稳定
  * 传递数据前，会有三次握手建立连接
  * 传递数据时，有确认、窗口、重传、拥塞控制
  * 传递数据后，会断开连接节省系统资源

**缺点：**

* 传输慢，效率低，占用系统资源高
  * 传递数据前，建立连接需要耗时
  * 传递数据时，确认、重传、拥塞等会消耗大量时间以及CPU和内存等硬件资源
* 易被攻击
  * 因为有确认机制，三次握手等机制，容易被人利用，实现DOS 、DDOS攻击

**如何保证接收的顺序性：**

* TCP协议使用SEQ和ACK机制保证了顺序性
* TCP的每个报文都是有序号的。确认应答信号ACK=收到的SEQ+1

## UDP协议

* User Data Protocol，用户数据包协议
* 面向无连接的协议
* UDP报头只有8字节

**简介：**

* 传输数据之前源端和终端不建立连接
* 在发送端，UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制
* 在接收端，UDP把每个消息段放在队列中，应用程序每次从队列中读一个消息段
* 由于传输数据不建立连接，因此也就不需要维护连接状态，包括收发状态等，因此一台服务机可同时向多个客户机传输相同的消息
* UDP信息包的标题很短，只有8个字节，相对于TCP的20个字节信息包的额外开销很小
* 吞吐量不受拥挤控制算法的调节，只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制
* UDP使用尽最大努力交付，即不保证可靠交付，因此主机不需要维持复杂的链接状态表。
* UDP是面向报文的。

> 使用“ping”命令来测试两台主机之间TCP/IP通信是否正常，其实“ping”命令的原理就是向对方主机发送UDP数据包，然后对方主机确认收到数据包，如果数据包是否到达的消息及时反馈回来，那么网络就是通的。

**优点：**

* 传输速率快
  * 传输数据前，不需要像TCP一样建立连接
  * 传输数据时，没有确认、窗口、重传、拥塞控制等机制
* 较安全
  * 由于没有了TCP的一些机制，被攻击者利用的漏洞就少了

**缺点：**

* 不可靠，不稳定
  * 由于没有了TCP的机制，在数据传输时如果网络不好，很可能丢包

**用UDP协议通讯时怎样得知目标机是否获得了数据包** 仿造TCP的做法，每发一个UDP包，都在里面加一个SEQ序号，接收方收到包后，将SEQ序号回复给发送方。如果发送方在指定时间以内没有收到回应，说明丢包了。

## TCP与UDP的区别

| TCP           | UDP           |
| ------------- | ------------- |
| TCP面向有链接的通信服务 | TCP面向无链接的通信服务 |
| TCP提供可靠的通信传输  | UDP不可靠,会丢包    |
| TCP保证数据顺序     | UDP不保证        |
| TCP数据无边界      | UDP有边界        |
| TCP速度慢        | UDP速度快        |
| TCP面向字节流      | UDP面向报文       |
| TCP一对一        | UDP可以一对一，一对多  |
| TCP报头至少20字节   | UDP报头8字节      |
| TCP有流量控制，拥塞控制 | UDP没有         |

## **为什么UDP比TCP快**

1. TCP需要三次握手
2. TCP有拥塞控制，控制流量等机制

## **为什么TCP比UDP可靠**

1. TCP是面向有连接的，建立连接之后才发送数据；而UDP则不管对方存不存在都会发送数据。
2. TCP有确认机制，接收端每收到一个正确包都会回应给发送端。超时或者数据包不完整的话发送端会重传。UDP没有。因此可能丢包。

## **什么时候使用TCP**

当对网络通讯质量有要求的时候：

* 比如：整个数据要准确无误的传递给对方，这往往用于一些要求可靠的应用，
* 比如HTTP、HTTPS、FTP等传输文件的协议，POP、SMTP等邮件传输的协议。

在日常生活中，常见使用TCP协议的应用如下：

* 浏览器，用的HTTP
* FlashFXP，用的FTP
* Outlook，用的POP、SMTP
* QQ文件传输

**什么时候应该使用UDP：**

* 当对网络通讯质量要求不高的时候，要求网络通讯速度能尽量的快，这时就可以使用UDP。
* 比如，日常生活中，常见使用UDP协议的应用如下：
  * QQ语音
  * QQ视频
  * TFTP

## **TCP无边界，UDP有边界**

**TCP无边界**

* 客户端分多次发送数据给服务器，若服务器的缓冲区够大，那么服务器端会在客户端发送完之后一次性接收过来，所以是无边界的；

**UDP有边界**

* 客户端每发送一次，服务器端就会接收一次，也就是说发送多少次就会接收多少次，因此是有边界的。


---

# 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://joyous-x.gitbook.io/mbook/part-ii-network/introduce_tcp_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.
