TCP
TCP(Transmission Control Protocol)是一种面向连接、可靠的字节流传输层协议,HTTP、SSH、邮件等大量应用都构建在它之上。
三次握手
TCP 通过三次握手建立连接,目的是同步双方初始序号并交换窗口信息:
- 客户端发送
SYN,携带初始序号seq=x。 - 服务器回复
SYN+ACK,携带seq=y, ack=x+1。 - 客户端发送
ACK,seq=x+1, ack=y+1。
握手完成后双方进入 ESTABLISHED 状态。三次握手中第二次报文可以捎带响应,节省一次交互。
四次挥手
TCP 连接是全双工的,关闭时需要分别关闭两个方向的数据流,因此是四次挥手:
- 主动方发送
FIN。 - 被动方回复
ACK(此时被动方仍可发送数据)。 - 被动方数据发送完毕,再发送
FIN。 - 主动方回复
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)。