2026-11-02·by Sijie Wang#fundamentals#networking#tcp

how-tcp-works

TCP 怎么工作:两条流与确认规则

信道的三种模式。 单工:信息只朝一个方向流,如广播。半双工:两个方向都能流,但同一时刻只能一个,如对讲机。全双工:两个方向同时流,如打电话。

一条 TCP 连接,是共用一个外壳的两条独立字节流——A→B 与 B→A。每条流有自己的序号(我发了多少字节,跟你发了多少毫无关系)、自己的流量控制窗口(接收缓冲满了,只掐这一个方向)。一个包经常身兼两职:装着一个方向的数据,捎着对另一个方向的确认(搭便车)。流是独立的,所以开启和关闭也是独立的——其余一切都由此推出。

握手为什么恰好三次。 一次消息只能确认一个方向的序号。Alice 报自己的序号(一)。Bob 回包里装着他自己的序号,并搭便车确认了 Alice 的(二)。此刻 Alice 知道双向都通——但 Bob 还不知道自己的包到没到。Alice 对 Bob 序号的确认(三)补上这一笔。两次则有一个方向悬空,四次则无新信息可确认。

挥手为什么是四次——二乘二。 关一个方向要两下:FIN("我这条流完了")加它的 ACK。另一个方向同样地关,按自己的时间表——对方收到 FIN 之后可能还有数据要发,必须让它发完(中间这个状态叫半关闭;"发完了、只等收响应"就是它的日常用法)。当第二个 FIN 恰好搭上第一个 ACK 的便车时,总数可以并成三下。之后,主动关闭方在 TIME_WAIT 停留 2 个 MSL:最后一个 ACK 可能丢了,对方会重发 FIN,得有人应答;端口也不能马上复用,要等这条连接的迟到包在网络里死透。

为什么什么都要 ACK。 脚下的网络不给回执:包会丢、会重复、会迟到、会乱序,发送方什么都听不到。确认是接收方唯一的回话通道。于是每个字节在发送方眼里只有两种状态:已确认、未确认。未确认的字节与没发出去无法区分(包丢了?ACK 丢了?还是只是慢?发送方分辨不了),所以它留着、重发,直到 ACK 出现。未确认即未送达:责任在 ACK 接手之前,一直在发送方身上。 ACK 还是整个协议的时钟:滑动窗口靠它推进,往返时间靠它量,拥塞控制读它的节奏。ACK 一停,全停。

推广开的原理。 确认是跨越不可靠通道交割责任的通用机制——消息队列里消费者 ack 之后 broker 才删消息,HTTP 响应就是对请求的确认,快递签收单是同一形状的纸版。它不免费(一个往返,外加发送端留状态),所以丢得起的地方故意不用:直播帧(补发回来也已过期)、心跳(下一拍盖掉上一拍,且缺席本身就是信号)、常规指标。为确认付钱,只在"不知道的代价"贵过一个往返时。

about this entry

One of sijie's wiki entries. The AI on this site is grounded in the same corpus and answers in sijie's voice, with citations back to entries like this one — answering costs sijie money, so it waits behind a code: enter an access code →

how-tcp-works — Sijie Wang