📄 一句话概括
ACK 号=【下次该从第几字节开始发】——收方每收一块就报累计确认;漏一块对账就停在缺口前,发送方补发那一块。
📝 本节和前面几节的关系
拆了块就要对账;本篇是 TCP 可靠性的核心机制。
一、对账的语言
每块带序号出门;收方回 ACK 号=已连续收到的字节数+起始号。 ACK 3000 意思是【前 3000 字节都在,请从第 3000 字节继续】。
二、丢了怎么办
第 2 块丢了:收方反复回同一个 ACK(停在缺口); 发送方发现重复确认或超时,补发缺口那块—— 这就是【可靠】的达成方式:不靠线路不丢,靠补发。
三、动手 Demo:ACK 对账
一块一块对过去:
base = 1000; mss = 1460
for i in range(1, 4):
print('发第%d块 序号%d..%d' % (i, base, base+mss-1))
print(' 服务器 ACK', base+mss)
base += mss
实跑输出:
--------------------------------------------------------------------
ACK 对账
--------------------------------------------------------------------
序号与 ACK 号像寄快递的对账本:
客户端: 发第 1 块(序号 b, 1460 字节)
服务器: ACK b+1460 (前 1460 字节全收到)
客户端: 发第 2 块(序号 b+1460)
服务器: ACK b+2920
ACK 号 =【下次该从第几字节开始】——
漏一块,对账就停在缺口前,发送方重发那一块。
TCP 的确认是累计的——ACK 一次确认之前所有字节, 中间丢了才单独补。
30 秒实验
- Wireshark 抓下载,观察 ACK 号单调递增。
- 拔网线制造丢包,看重复 ACK 出现。
- 算算 ACK 5461(起始 1000)代表收到了多少字节。
常见误区
- 以为 ACK 是【逐块回执】——累计确认。
- 以为丢包要整条重发——只补缺口。
自测三问(点开对答案)
1. ACK 号的含义是什么? —— 下次该从第几字节开始。 2. 累计确认是什么意思? —— 一次确认之前所有连续字节。 3. 发现缺口怎么补? —— 重复确认/超时后重发缺口块。- ☐ 下一节(2.3.4 根据网络包平均往返时间调整ACK号等待时间)
相关笔记
- 根据网络包平均往返时间调整ACK号等待时间 —— 没等到 ACK 怎么办
- 使用窗口有效管理ACK号 —— 干等太慢,见下节
- 🔌 网络是怎样连接的 · 索引