# 计算机网络 传输层
## TCP 和 UDP 的区别是什么?
### 简要回答
1. TCP 和 UDP的概念
:
- **TCP**(传输控制协议):**面向连接**的**可靠**传输协议,保证数据完整有序到达。
- **UDP**(用户数据报协议):**无连接**的**不可靠**传输协议,注重传输速度和简单性。
2. TCP 和 UDP的区别
:
- 如下表所示:
| **对比维度** | **TCP** | **UDP** |
| ------------ | -------------------------- | ------------------------ |
| **连接方式** | 面向连接(三次握手) | 无连接 |
| **可靠性** | 可靠(确认、重传、校验) | 不可靠(可能丢包、乱序) |
| **传输顺序** | 数据按序到达 | 不保证顺序 |
| **传输速度** | 较慢(建立连接、重传开销) | 极快(无额外控制) |
| **头部开销** | 20字节(较大) | 8字节(极小) |
| **流量控制** | 支持(滑动窗口) | 不支持 |
| **拥塞控制** | 支持(慢启动、拥塞避免) | 不支持 |
| **应用场景** | 网页、邮件、文件传输 | 视频流、游戏、DNS查询 |
------
### 详细回答
1. TCP和UDP的概念
:
- **TCP**:通过三次握手**建立连接**,提供**端到端的可靠传输**,确保数据无差错、不丢失、按序到达。
- **UDP**:直接发送数据包,**不建立连接**,**不保证传输质量**,但延迟极低,适用于**实时性要求高**的场景。
2. TCP和UDP的区别
:
- **连接方式**: **TCP**:TCP需先通过**三次握手建立连接**(SYN、SYN-ACK、ACK),数据传输完成后,再通过**四次挥手释放连接**(FIN、ACK、FIN-ACK、ACK)。 **UDP**:UDP直接发送数据包,**无需握手和挥手**。
- **可靠性**: **TCP**:TCP通过确认应答(ACK)、超时重传、数据校验(校验和)**确保数据可靠**。 **UDP**:UDP无重传机制,发送即丢弃,**可靠性由应用层处理**(如视频丢帧不影响整体)。
- **传输顺序**: **TCP**:TCP通过序列号(Sequence Number)保证接收端**按序**重组数据。 **UDP**:UDP不维护数据顺序,接收端**可能乱序接收**(如VoIP通话中语音包顺序错乱)。
- **传输速度**: **TCP**:TCP因连接管理、流量控制、重传等机制,**传输延迟较高**。 **UDP**:UDP无控制开销,**传输速度极快**,适合实时应用(如在线游戏、直播)。
- **头部开销**: **TCP**:TCP**头部最小20字节**(含选项字段可扩展),包含序列号、确认号、窗口大小等字段。 **UDP**:UDP**头部固定8字节**(仅源/目标端口、长度、校验和)。
- **流量控制**: **TCP**:TCP通过**滑动窗口**动态调整发送速率,避免接收方缓冲区溢出。 **UDP**:UDP**无流量控制**,可能因接收方处理不及时导致丢包。
- **拥塞控制**: **TCP**:TCP通过**慢启动、拥塞避免、快重传**等算法避免网络拥堵。 **UDP**:UDP**无拥塞控制**,可能加剧拥塞(如P2P下载中的UDP Flood攻击)。
- **应用场景**: **TCP**:HTTP/HTTPS、SMTP(邮件)、FTP(文件传输)。 **UDP**:DNS查询、视频会议(Zoom)、在线游戏(UDP+应用层可靠性增强)。
------
### 知识拓展
1. **TCP 和 UDP 的连接机制对比**,如下图所示:

2. **TCP 和 UDP 通信机制对比**,如下图所示:

3. **TCP 和 UDP 应用层报文处理对比**,如下图所示:

------
## TCP 连接如何确保可靠性?
TCP通过差错控制(序列号、确认应答、数据校验)、超时重传、流量控制、拥塞控制等,确保数据传输的可靠性和效率。
1. **序列号**:每个数据包都有一个唯一的序列号,确保数据能够按正确的顺序组装。接收方根据序列号将数据组装成正确的顺序,即使数据包的接收顺序与发送顺序不同。
2. **数据校验**:每个 TCP 数据包都附带一个校验和,用于检查数据在传输过程中的完整性。如果校验和不匹配,接收方会丢弃该数据包并请求重传。
3. **确认应答**:接收方对每个收到的数据包发送确认应答。
4. **超时重传**:发送方在发送数据时会设置一个定时器,如果在定时器超时之前没有收到接收方的确认应答,就会重新发送该数据包。
5. **流量控制**:TCP通过滑动窗口机制进行流量控制,确保接收方能够处理处理发送方的数据。
6. **拥塞控制**:TCP通过拥塞控制机制来控制数据发送速率,避免网络拥塞。
## UDP 怎么实现可靠传输?
UDP本身是无连接的传输层协议,不能保证数据的可靠传输,但是可以通过在应用层的设计来模拟TCP的可靠性机制。
1.**提供确认序列号**,为每个数据报附加唯一序列号,接收端反馈ACK确认,确保有序性和完整性。
2.**提供超时重传**,未收到ACK时重传数据,动态计算RTO(重传的超时时间)适应网络波动。
3.**滑动窗口机制**:允许连续发送多个数据报,通过累计ACK减少通信次数。
**本端**:首先在UDP数据报定义一个首部,首部包含确认序列号和时间戳,时间戳是用来计算RTT,计算出合适的RTO(重传得的超时时间)。然后以等-停的方式发送数据报,即收到对端的确认后才发送下一个数据报。当时间超时时,本端重传数据报,同时把TRO扩大为原来的两倍,重新开始计时。 **对端**:接受到一个数据报之后取下该数据报首部的时间戳和确认序列号,并添加本端的确认数据报首部之后发送给对端。根据此序列号对已收到的数据报进行排序并丢弃重复的数据报。
## TCP 流量控制是怎么实现的?
#### 主要采用的是滑动窗口的方法
#### 接收方维护一个接收窗口
这个接收窗口的大小不超过接收缓存区的大小,并在每次返回的ACK确认里告知发送方
#### 发送方维护一个发送窗口
发送窗口的大小不超过接收窗口的大小,也不超过发送缓存区的大小
里面既有发送了还没确认的消息,也有还没发送的消息

## 能说说拥塞控制是怎么实现的嘛?
TCP拥塞控制是指在网络发生拥塞时能够动态调整数据传输速率,以避免网络过载。其实现机制包括以下几个部分:
- 慢启动(Slow Start):初始阶段,TCP发送方以较小的发送窗口传输数据,随着每次成功收到确认数据,指数级增大发送窗口大小。确保在网络发送初期谨慎地逐步增加发送窗口大小,以免引起网络拥塞。
- 拥塞避免(Congestion Avoidance):达到阈值(一般指慢启动阈值),进入拥塞避免阶段。发送窗口大小不再是指数级增长,而是线性增长。避免引起网络拥塞。
- 快重传(Fast Retransmit):发送方连续收到相同的确认,会认为出现了数据包丢失,会迅速重新传输未确认的数据包,不用等待超时。这有助于更快地恢复拥塞引起的数据包丢失。
- 快恢复(Fast Recovery):快重传之后,进入快恢复阶段。发送方不会回到慢启动阶段,而是将慢启动阈值设置为当前窗口大小的一半,同时将拥塞窗口大小设置为慢启动阈值加上已确认但未被快速重传的数据块的数量。这有助于更快从拥塞中恢复。
## 三次握手的过程是怎样的?为什么是三次而不是两次或四次?
#### 三次握手的过程
客户端向服务器发送SYN
服务器收到之后向客户端发送SYN-ACK
客户端收到之后又向服务器发送ACK进入连接状态
#### 为什么不是四次
因为在三次握手的过程中,客户端和服务器都进行了接收和发送消息,并确认对方具备收发的能力,没有必要进行第四次握手
#### 为什么不是两次
因为如果是两次握手可能出现很久之前客户端发送的一次SYN因为网络延迟到达服务器,实际客户端已经不需要连接,此时服务器就无需建立连接

## 四次挥手的过程是怎样的?为什么是四次而不是三次或五次?
TCP 连接是全双工的,关闭时需要分别关闭两个方向的数据流,因此需要四个步骤:
1. 客户端发送 **FIN**,请求关闭发送通道。
2. 服务器响应 **ACK**,确认客户端的关闭请求。
3. 服务器发送 **FIN**,关闭自己的发送通道。
4. 客户端响应 **ACK**,确认服务器的关闭请求。
## TCP 的 Keepalive 和 HTTP 的 Keep-Alive 是一个东西吗?它们之间有什么区别?
HTTP的keep-alive
- 指HTTP的长连接,使浏览器能在一个TCP连接中发送多个请求和响应,避免了多次建立和关闭连接的开销
- 通过请求头中的字段connection:keep-alive来实现的,并且是在应用层实现的
TCP的keep-alive
- 它是TCP的保活机制,用于在TCP连接上检测空闲时的连接状态的机制
- 当TCP建立连接后,如果一段时间内都没有数据传输,该机制就会发送探测包测试连接状态仍否有效
## TCP 滑动窗口机制是如何工作的?它在流量控制中有什么作用?
TCP 滑动窗口机制是一种用于 **流量控制** 的技术,旨在确保数据的发送方不会超出接收方的处理能力。滑动窗口通过动态调整数据发送量,使数据传输更加高效,同时避免网络拥堵。
#### 滑动窗口的工作原理
随着接收方对已收到数据的确认,发送方的窗口范围会向前滑动,允许发送新的数据,通过接收方动态调整窗口大小,发送方根据接收方的接收能力调节数据发送速率。
## TCP 拥塞控制中的慢启动、拥塞避免、快重传和快恢复阶段分别是什么?它们的作用是什么?
### 1. 慢启动(Slow Start)
- 慢启动是 TCP 在新连接建立或超时后,开始数据传输时的初始阶段。
- 目的是逐步探测网络的可用带宽,防止过快发送数据导致拥塞。
- 防止发送方在开始时发送过多数据,造成网络拥塞。
### 2. 拥塞避免(Congestion Avoidance)
- 当 `cwnd` 达到慢启动阈值后,为避免发送速率增长过快进入拥塞,TCP 改为线性增长的模式。
- 拥塞避免阶段通过更加谨慎的方式探测网络的最大可用带宽。
- 避免过快增加发送速率导致网络拥塞,确保发送速率逐步接近网络的最大容量。
### **3. 快重传(Fast Retransmit)**
- 快重传是 TCP 的一种优化机制,用于在检测到丢包后快速重传丢失的数据包,而无需等待超时。
- 判断依据是接收到 **3 个重复的 ACK**。
- 快速恢复丢包导致的中断,减少等待时间,提高传输效率。
### **4. 快恢复(Fast Recovery)**
- 快恢复是结合快重传的一个阶段,用于避免重传丢包后重新进入慢启动。
- 通过调整 `cwnd` 和 `ssthresh`,快速恢复到拥塞避免状态。
- 减少丢包对发送速率的影响,保持较高的传输效率。
### **TCP 拥塞控制的作用**
1. **提高网络利用率**:- 在保证数据可靠传输的同时,充分利用网络带宽。
2. **减少网络拥塞**:- 通过调整发送速率,避免发送方过度占用网络资源。
3. **提升传输效率**:- 快重传和快恢复减少了丢包后等待时间,提高了数据传输的连续性。
| **阶段** | **特点** | **作用** |
| :----------: | :------------------------------------: | :--------------------------------------------------: |
| **慢启动** | 拥塞窗口指数增长 | 快速探测网络容量,避免刚开始时发送过多数据引发拥塞。 |
| **拥塞避免** | 拥塞窗口线性增长 | 稳步探测网络容量,防止网络拥塞。 |
| **快重传** | 通过重复 ACK 快速检测丢包并重传 | 减少超时等待,提高数据传输效率。 |
| **快恢复** | 调整窗口大小,避免重传后重新进入慢启动 | 减少丢包对传输速率的影响,快速恢复到拥塞避免状态。 |
## 什么是网络拥塞?TCP 是如何应对网络拥塞的?
**网络拥塞** 是指在网络中传输的数据量超过了可用带宽或中间设备(如路由器、交换机)的处理能力时,导致网络性能下降的现象。
**TCP 拥塞控制机制**通过慢启动、拥塞避免、快重传和快恢复四个阶段,动态调整发送速率,保证网络的稳定性和高效性。