IP 尽力转发数据报,但可能丢包、重复或乱序。TCP 在两台端系统之间提供可靠、有序的字节流;丢包恢复和顺序整理由通信端完成,而不是由每台中间路由器保存连接状态。

序号、确认与重传

TCP 给字节流中的数据编号。接收方用确认号(ACK)表示“下一个期望收到的字节序号”;这种累计确认也意味着此前的字节都已连续到达。发送方会缓存尚未确认的数据,并根据往返时间设置重传计时器,超时后重发。

若接收方发现中间有缺口,后续数据仍可先缓存。重复 ACK 让发送方知道仍缺少某段数据,达到条件时可以提前重传,而不必总等计时器超时。

下图用累计确认说明了这个过程:在示例中,确认号停在 2,发送方收到多个重复 ACK 后重传缺失的数据段。

累计确认和快速重传示例

窗口与速率限制

一次只发送一个数据段会让长距离链路闲置,所以 TCP 使用滑动窗口,在等待确认期间继续发送数据。窗口至少受两项限制:接收方通告窗口(避免压垮接收端)和拥塞窗口(避免给网络造成过多负载)。实际可发送的数据量受两者中较小者约束。

带宽时延积(BDP)可以估计“让链路保持忙碌”所需的在途数据量:

1
BDP = 链路带宽 × 往返时延

发送窗口太小会浪费链路容量;窗口超过网络能承受的范围,则容易造成排队和丢包。拥塞窗口如何调整,见拥塞控制笔记。

建立连接

TCP 三次握手让双方交换初始序号并确认双向通信可用:

1
2
3
客户端 -> 服务器:SYN,seq=x
服务器 -> 客户端:SYN-ACK,seq=y,ack=x+1
客户端 -> 服务器:ACK,ack=y+1

TCP 的交付单位是字节流,而不是保留应用消息边界的数据包;应用协议需要自行定义消息格式。TCP 也不负责加密,HTTPS 的保密性由 TLS 提供。