这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战
一、建立连接 - 通信前
1. 主要问题
- 三次握手:包含通信双方的一问一答的过程;
- 作用:初始化连接信息,如确认双方通信的初始序列号,确保后续通信内容有序;
- 为什么不“两次握手”:无法避免历史错误连接的初始化,在超时前浪费服务端的资源;
- 为什么不“四次握手”:没必要,TCP设计中支持同时发送ACK和SYN(详情见CTL)。
2.报文字段值变化
1. CTL(Control)
- CTL = SYN:表示客户端发起请求;
- CTL = ACK,SYN:服务端确认并反问;
- CTL = ACK:客户端确认;
2. SEQ & ACK
- NEW_SEQ = ACK
- NEW_ACK = SEQ + 1
二、数据传输 - 通信中
1. 拥塞控制
网络资源有限,服务端处理能力有限。
- 作用:防止客户端发送过多,网络拥塞奔溃 或 服务端来不及接收;
- 策略:(1)窗口大小 < 慢启动阈值 => 慢启动(2)窗口大小 > 慢启动阈值 => 拥塞避免(3)窗口大小 = 慢启动阈值 => 上述两种的其中一种;
- 拥塞避免:(1)每经过 1个 RTT 窗口大小 +1(2)发生丢包时,设置 慢启动阈值 = 窗口小大 / 2(即动态调整“慢启动阈值”);
2. 超时重传
- 超时则重传指定数据段;
- 重传队列收到 ACK 时才移出对应数据段;
- 快速重传:服务端发送重复 ACK 通知客户端,自己 是否/已 无序接收哪些数据段,并期望收到哪些数据段;
- 快速恢复:收到重复 ACK 后,客户端会重新传输看起来像是丢失的段,而无需等待计时器超时。
三、关闭连接 - 通信结束
1. 四次挥手
确保通信双方不再发送数据给对方;
2. MSL
最大数据段生命周期。若超过此值,则在网络中被认为已被丢弃失效。
3. TIME_WAIT
- 实现:等待 2 * MSL 时间。
- 作用:(1)防止延迟从服务端来的数据被其他“同名”客户端接收(2)保证远程连接被正确关闭,即等待被关闭的一方收到 FIN_ACK;