CS168:TCP 如何提供可靠传输
IP 尽力转发数据报,但可能丢包、重复或乱序。TCP 在两台端系统之间提供可靠、有序的字节流;丢包恢复和顺序整理由通信端完成,而不是由每台中间路由器保存连接状态。
序号、确认与重传
TCP 给字节流中的数据编号。接收方用确认号(ACK)表示“下一个期望收到的字节序号”;这种累计确认也意味着此前的字节都已连续到达。发送方会缓存尚未确认的数据,并根据往返时间设置重传计时器,超时后重发。
若接收方发现中间有缺口,后续数据仍可先缓存。重复 ACK 让发送方知道仍缺少某段数据,达到条件时可以提前重传,而不必总等计时器超时。
下图用累计确认说明了这个过程:在示例中,确认号停在 2,发送方收到多个重复 ACK 后重传缺失的数据段。

窗口与速率限制
一次只发送一个数据段会让长距离链路闲置,所以 TCP 使用滑动窗口,在等待确认期间继续发送数据。窗口至少受两项限制:接收方通告窗口(避免压垮接收端)和拥塞窗口(避免给网络造成过多负载)。实际可发送的数据量受两者中较小者约束。
带宽时延积(BDP)可以估计“让链路保持忙碌”所需的在途数据量:
1 | BDP = 链路带宽 × 往返时延 |
发送窗口太小会浪费链路容量;窗口超过网络能承受的范围,则容易造成排队和丢包。拥塞窗口如何调整,见拥塞控制笔记。
建立连接
TCP 三次握手让双方交换初始序号并确认双向通信可用:
1 | 客户端 -> 服务器:SYN,seq=x |
TCP 的交付单位是字节流,而不是保留应用消息边界的数据包;应用协议需要自行定义消息格式。TCP 也不负责加密,HTTPS 的保密性由 TLS 提供。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GHL's Blog!
