2026-11-02·por 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 响应就是对请求的确认,快递签收单是同一形状的纸版。它不免费(一个往返,外加发送端留状态),所以丢得起的地方故意不用:直播帧(补发回来也已过期)、心跳(下一拍盖掉上一拍,且缺席本身就是信号)、常规指标。为确认付钱,只在"不知道的代价"贵过一个往返时。

sobre esta entrada

Una de las entradas de wiki de sijie. La IA en este sitio está anclada en el mismo corpus y responde en la voz de sijie, con citas que vuelven a entradas como esta — responder le cuesta dinero a sijie, así que espera detrás de un código: ingrese código de acceso →

how-tcp-works — Sijie Wang