TCP/IP 协议详解
1. TCP 协议特点
1.1 基本特性
- 面向连接:通信前需要建立连接
- 可靠传输:确保数据完整性和顺序性
- 全双工通信:双方可以同时收发数据
- 面向字节流:把应用层数据看作字节流
1.2 可靠传输机制
- 序列号和确认号
- 超时重传
- 流量控制(滑动窗口)
- 拥塞控制(慢启动、拥塞避免)
2. TCP 三次握手
2.1 握手过程
Client Server
| SYN=1, seq=x | 第一次握手
|-------------------->|
| SYN=1, ACK=1 | 第二次握手
| seq=y, ack=x+1 |
|<--------------------|
| ACK=1 | 第三次握手
| ack=y+1 |
|-------------------->|
2.2 为什么是三次握手?
-
第一次握手:客户端发送 SYN
- 客户端:我想 要建立连接
- 服务端:知道客户端有发送能力
-
第二次握手:服务端回复 SYN+ACK
- 服务端:我收到了,我也想建立连接
- 客户端:知道服务端有收发能力
-
第三次握手:客户端发送 ACK
- 客户端:我收到了,连接建立完成
- 服务端:知道客户端有接收能力
必须三次的原因:
-
防止历史连接:
- 如果是两次握手,可能会出现历史连接请求突然到达服务器,导致错误连接
- 三次握手可以防止历史连接,因为第三次握手会确认双方的初始序列号
-
确认双方的收发能力:
- 第一次握手:确认客户端的发送能力
- 第二次握手:确认服务端的接收、发送能力
- 第三次握手:确认客户端的接收能力
3. TCP 四次挥手
3.1 挥手过程
Client Server
| FIN=1, seq=u | 第一次挥手
|-------------------->|
| ACK=1, ack=u+1 | 第二次挥手
|<--------------------|
| FIN=1, seq=w | 第三次挥手
|<--------------------|
| ACK=1, ack=w+1 | 第四次挥手
|-------------------->|
3.2 为什么是四次挥手?
-
第一次挥手:客户端发送 FIN
- 客户端:我的数据发完了,想要关闭连接
- 服务端:知道客户端想要关闭
-
第二次 挥手:服务端发送 ACK
- 服务端:我知道了,但我可能还有数据要发送
- 客户端:进入 FIN_WAIT_2 状态
-
第三次挥手:服务端发送 FIN
- 服务端:我的数据也发完了,可以关闭了
- 客户端:知道服务端要关闭
-
第四次挥手:客户端发送 ACK
- 客户端:好的,我知道了
- 服务端:收到确认,可以关闭
必须四次的原因:
-
TCP 是全双工通信:
- 两个方向的连接可以独立关闭
- 一方关闭连接后,另一方还可以继续发送数据
-
延迟确认机制:
- 第二次和第三次挥手不能合并
- 服务端收到 FIN 后,可能还有数据需要发送
- 必须等数据发送完才能发送 FIN
3.3 TIME_WAIT 状态
- 持续时间:2MSL(Maximum Segment Lifetime)
- 作用:
- 确保最后一个 ACK 能到达服务端
- 防止历史连接中的数据段被新连接接收
4. TCP 可靠传输机制
4.1 序列号和确认号
发送方 接收方
| seq=100, data |
|-------------------->|
| ack=101 |
|<--------------------|
4.2 超时重传
发送方 接收方
| seq=100, data |
| X | // 数据丢失
| 超时重传 |
| seq=100, data |
|-------------------->|
4.3 流量控制
- 滑动窗口机制
- 接收方通告窗口大小
- 防止发送方发送速度过快
4.4 拥塞控制
- 慢启动
- 拥塞避免
- 快重传
- 快恢复
2. UDP 协 议
特点
- 无连接
- 不可靠传输
- 快速传输
- 支持广播和多播
应用场景
- 实时音视频
- DNS查询
- 游戏数据包