📖 TCP 可靠传输的实现
🎯 课程摘要:TCP 基于以字节为单位的滑动窗口 (sliding window) 实现可靠传输,通过序号、累积确认、超时重传机制保证数据可靠到达。发送方用三个指针 P1/P2/P3 描述发送窗口状态,接收方对按序收到的最高序号给出确认并暂存未按序到达的数据。TCP 还要求累积确认与捎带确认机制以减小开销。
📝 详细笔记
1. TCP 与选择重传协议中 ACK 的区别
- ⚠️ 重点/考点:ACK N 的含义在两种协议中不同:
协议 ACK N 的含义 选择重传协议 序号到 N 为止的数据已正确接收,期望收到 N+1 TCP 协议 序号到 N-1 为止的数据已正确接收,期望收到 N
2. 发送窗口的构造与移动
- 窗口构造:发送方收到接收方确认报文段后,根据其首部中确认号 ACK 字段和窗口 字段的值构造自己的发送窗口。
- 例:ACK=31 表示序号到 30 已全部正确接收,期望 31;窗口=20 表示接收方 RWND=20,发送方据此设 SWND=20。
- 发送窗口的结构:
- 后沿后面:已发送并已收到确认的数据(可从发送缓存删除);
- 窗口内:已发送未确认 + 允许发送未发送;
- 前沿前面:当前不允许发送的数据。
- 后沿移动:只有两种可能——不动(未收到新确认)或前移(收到新确认);不可能后移(不能撤销已收到的确认)。
- 前沿移动:有三种可能——
- 前移(通常情况);
- 不动:①未收到新确认且窗口大小未变;②收到新确认前移但接收方通知窗口缩小,前移与回缩抵消;
- 向后收缩:接收方通知窗口变小。TCP 标准强烈不赞成此做法,因为发送方可能在收到通知前已发送数据。
- ⚠️ 重点/考点:凡已发送未收到确认的数据必须暂时保留,以便超时重传使用。
3. 发送窗口状态的三个指针
- 概念定义:编程实现滑动窗口机制时,用三个指针 P1、P2、P3 描述发送窗口状态:
- 指针含义:
指针 指向 P1 发送窗口内已发送但未收到确认的第一个数据序号 P2 发送窗口内还未发送的第一个数据序号 P3 发送窗口前沿外的第一个数据序号 - ⚠️ 重点/考点:指针运算关系:
- P3 − P1 = 发送窗口尺寸(SWND)
- P2 − P1 = 已发送但未收到确认的字节数
- P3 − P2 = 允许发送但未发送的字节数(可用窗口/有效窗口)
4. 接收窗口与累积确认
- 接收窗口工作过程:以接收窗口=20 为例:
- 序号到 30 为止的数据已确认并交付应用进程,可删除;
- 接收窗口内 31~50 号为允许接收的数据;
- 收到 32、33 号(未按序到达,因 31 号未到)→ 接受并存入接收缓存;
- 接收方只能对按序收到的数据中的最高序号给出确认,故确认号 ACK 仍为 31(重复确认);
- 31 号到达后,可将 31~33 一起交付应用进程,接收窗口前移 3 个序号,发送确认 ACK=34。
- 累积确认:确认号 ACK=N 表示序号到 N-1 为止的全部数据已正确接收。
- ⚠️ 重点/考点:未按序到达的数据先暂存接收窗口,待缺少的字节收到后再按序交付上层应用进程。
5. 补充说明
- 发送窗口与接收窗口不一定同步:同一时刻发送窗口并不总是等于接收窗口,因为网络传送窗口值有滞后且时间不确定;发送方还可能因网络拥塞适当减小发送窗口。
- 不按序到达数据的处理:TCP 无明确规定;若一律丢弃则窗口管理简单但浪费网络资源(发送方重复传送较多数据);TCP 通常先暂存接收窗口,待缺少字节收到后按序交付。
- 累积确认与捎带确认:
- 接收方可在合适时候发送确认,也可在自己有数据发送时捎带确认信息;
- 确认推迟时间不应超过 0.5 秒;
- 若收到一连串具有最大长度的报文段,必须每隔一个报文段发送一个确认;
- 捎带确认实际不常发生,因大多数应用很少同时在两个方向发送数据。
- 全双工通信:TCP 通信双方都既发送又接收,每方都有自己的发送窗口和接收窗口,须弄清楚是哪一方的窗口。
💡 核心总结
- TCP 滑动窗口以字节为单位,通过序号、累积确认、超时重传实现可靠传输。
- 三个指针 P1/P2/P3 完整描述发送窗口状态:P3−P1=窗口大小,P3−P2=可用窗口。
- 接收方对按序到达的最高序号给确认,未按序数据先暂存。
- 后沿只能前移不能后移;前沿通常前移,TCP 强烈不赞成向后收缩。
- 累积确认 + 捎带确认减小开销,确认推迟不超过 0.5 秒。
❓ 课后思考 / 经典考题
- TCP 中的 ACK N 与选择重传协议中的 ACK N 有何区别?
- 用 P1、P2、P3 三个指针描述发送窗口,如何计算已发送未确认字节数和可用窗口大小?
- 为什么 TCP 标准强烈不赞成发送窗口前沿向后收缩?
- 接收方收到未按序到达的数据应如何处理?确认号如何取值?
- 累积确认和捎带确认的作用是什么?确认推迟时间上限是多少?