TCP与UDP
一、TCP
1、概述
🍉关键词:【面向连接的】【可靠的】【传输层协议】
1 |
|
2、TCP报文段
1 |
|
源端口、目的端口:应用程序的唯一标识
序列号:用于标记数据的顺序,标识当前发送的数据段中第一个字节的编号
确认号:用于确认已成功接收的数据,标识接收端期望收到的下一个字节的编号
SYN标志位:标识连接请求,表示这是一个连接请求或响应报文
ACK标志位:用于确认收到报文段
FIN标志位:表示已经完成数据发送,希望关闭连接
Window Size
(窗口大小):(接收方)当前最多还能接收多少个字节的数据
3、面向连接
面向连接是网络通信中的一种模式,指的就是在数据传输之前,通信双方需要先建立明确的连接,并且在传输的过程中,维护连接状态,传输完成后释放连接。最典型的例子就是TCP。
🍖三次握手
1 |
|
步骤 | 方向 | 标志位 | seq | ack |
---|---|---|---|---|
1 | Client→Server | SYN=1 |
x | 0 |
2 | Server→Client | SYN=1, ACK=1 |
y | x+1 |
3 | Client→Server | ACK=1 |
x+1 | y+1 |
为什么需要三次握手
1 |
|
🍖四次挥手
因为 TCP 是全双工通信(双方可以独立发送和接收数据),需要分别关闭两个方向的连接。
1 |
|
步骤 | 方向 | 标志位 | seq | ack |
---|---|---|---|---|
1 | Client→Server | FIN=1 |
u | - |
2 | Server→Client | ACK=1 |
- | u+1 |
3 | Server→Client | FIN=1 |
v | - |
4 | Client→Server | ACK=1 |
- | v+1 |
为什么不是三次
1 |
|
TIME_WAIT 是什么
1 |
|
4、可靠
🍔发送速率受两个窗口控制
实际能发送的数据量 = min(接收窗口, 拥塞窗口)
取接收方能力和网络状况的较小值
rwnd
:解决接收方缓冲区不足(流量控制)。- 例如:接收方处理慢 →
rwnd
变小 → 发送方降速。
- 例如:接收方处理慢 →
cwnd
:解决网络拥塞(拥塞控制)。- 例如:网络丢包 →
cwnd
减半 → 发送方降速。
- 例如:网络丢包 →
🍖 流量控制
1 |
|
为什么需要流量控制
1 |
|
实现方式:滑动窗口协议
1 |
|
接收窗口:
1 |
|
- 左边界:已发送且已确认的数据的末尾(不可再发送)。
- 右边界:左边界 + 窗口大小(超出右边界的数据暂不可发送)。
- 窗口内:左边界到右边界之间的字节,是【可发送但未确认】的数据范围。
滑动:
1 |
|
🍖 拥塞控制
1 |
|
为什么需要拥塞控制
1 |
|
拥塞窗口:
1 |
|
调控机制
1 |
|
🍖 序号与确认应答
保证数据 有序、无重复
序号:
1 |
|
确认应答ACK
1 |
|
🍖 超时重传
保证数据 不会永久丢失
1 |
|
🍖 校验和
保证数据 没有被篡改或损坏
1 |
|
5、应用场景
1 |
|
二、UDP
1、概述
🍉关键词:【无连接】【不可靠】【高效】【传输层协议】
1 |
|
2、UDP报文段
字段 | 说明 |
---|---|
源端口号 | 发起端口 |
目标端口号 | 目标端口 |
长度 | 整个 UDP 包长度 |
校验和 | 简单错误检测 |
3、应用场景
应用场景 | 原因说明 |
---|---|
视频直播、语音通话 | 容忍丢包,低延迟优先 |
DNS 查询 | 查询包小,丢了就重发 |
在线游戏 | 要求快速同步状态,宁可偶尔丢帧 |
QUIC 协议(HTTP/3) | 基于 UDP 实现自己的可靠机制,绕过 TCP 层限制 |
为什么 UDP 没有粘包问题?
1 |
|
三、TCP/UDP常考
TCP 和 UDP 有什么区别?
对比点 | TCP | UDP |
---|---|---|
是否连接 | 面向连接(三次握手) | 无连接(不建立连接) |
是否可靠 | 可靠传输(确认应答、重传、序号) | 不可靠(无确认、无重传) |
有序性 | 有序,按序号排列 | 无序,收到就处理 |
传输效率 | 相对较慢(连接、确认) | 高效,适合实时场景 |
头部开销 | 大(20字节以上) | 小(8字节) |
应用场景 | 网页、文件、邮件、SSH、数据库 | 视频、语音、直播、DNS、游戏 |
TCP 为什么比 UDP 更可靠?
1 |
|
UDP 是否可靠?能否通过上层协议实现可靠性?
1 |
|
什么场景适合用 TCP,什么场景用 UDP?为什么?
1 |
|
为什么视频通话使用 UDP 而不是 TCP?
1 |
|