# 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有边界**

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