🔌 第二章 用电信号传输TCP/IP数据
📄 一句话概括

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 秒实验

  1. Wireshark 抓下载,观察 ACK 号单调递增。
  2. 拔网线制造丢包,看重复 ACK 出现。
  3. 算算 ACK 5461(起始 1000)代表收到了多少字节。

常见误区

  1. 以为 ACK 是【逐块回执】——累计确认。
  2. 以为丢包要整条重发——只补缺口。
自测三问(点开对答案) 1. ACK 号的含义是什么? —— 下次该从第几字节开始。 2. 累计确认是什么意思? —— 一次确认之前所有连续字节。 3. 发现缺口怎么补? —— 重复确认/超时后重发缺口块。

相关笔记