跳到主要内容

TCP

TCP(Transmission Control Protocol)是一种面向连接、可靠的字节流传输层协议,HTTP、SSH、邮件等大量应用都构建在它之上。

三次握手

TCP 通过三次握手建立连接,目的是同步双方初始序号并交换窗口信息:

  1. 客户端发送 SYN,携带初始序号 seq=x
  2. 服务器回复 SYN+ACK,携带 seq=y, ack=x+1
  3. 客户端发送 ACK,seq=x+1, ack=y+1

握手完成后双方进入 ESTABLISHED 状态。三次握手中第二次报文可以捎带响应,节省一次交互。

四次挥手

TCP 连接是全双工的,关闭时需要分别关闭两个方向的数据流,因此是四次挥手:

  1. 主动方发送 FIN
  2. 被动方回复 ACK(此时被动方仍可发送数据)。
  3. 被动方数据发送完毕,再发送 FIN
  4. 主动方回复 ACK,进入 TIME_WAIT 状态,等待 2MSL 以确保对方收到最后 ACK。

可靠传输

TCP 通过以下机制保证数据可靠到达:

  • 序号(seq):为每个字节编号,接收方按序号重组。
  • 确认号(ack):表示已收到的下一个期望字节。
  • ACK 累积确认:一次 ACK 可确认之前所有字节。
  • 超时重传:发送方在 RTO 时间内未收到 ACK 则重传。
  • 校验和:检测首部和数据在传输中的比特错误。

滑动窗口

滑动窗口是 TCP 流量控制与可靠传输的核心:

  • 接收方通过窗口字段告知发送方可发送的字节数。
  • 发送方维护发送窗口,左边界为已确认字节,右边界为未发送字节。
  • 窗口滑动由 ACK 推动,发送方无需等待每个段被确认。

拥塞控制

TCP 拥塞控制保护网络不过载,核心是 cwnd(拥塞窗口):

  • 慢启动:cwnd 从 1 MSS 开始,每收到一个 ACK 翻倍,指数增长。
  • 拥塞避免:cwnd 达到慢启动阈值(ssthresh)后,每 RTT 增加 1 MSS,线性增长。
  • 快重传:收到 3 个重复 ACK 立即重传,不等超时。
  • 快恢复:将 ssthresh 设为 cwnd/2,cwnd 直接进入拥塞避免,避免重回慢启动。

经典算法包括 Tahoe(无快恢复)、Reno(标准快恢复)与 BBR(基于带宽延迟积)。

流量控制

流量控制由 接收窗口(rwnd) 字段实现,防止发送方淹没接收方。接收方在 ACK 中通告当前可用缓冲区大小,发送方据此调整发送节奏,与拥塞控制共同决定实际发送窗口 min(cwnd, rwnd)