TCP — 传输控制协议

面向连接、可靠、基于字节流的传输层协议 / 传输层 / IP 协议号 6 / RFC 9293

1. 协议定位

项目信息
所属层传输层
英文全称Transmission Control Protocol
主要 RFCRFC 9293(2022,整合历史文档);拥塞控制 RFC 5681;SACK RFC 2018
端口端口号 标识会话(无独立协议端口,IP 协议号 6)
封装于IP(协议号 6)
典型应用HTTP/HTTPS、SSH、数据库、邮件等需可靠有序的通信

2. 一句话理解

TCP 是"带确认、能纠错、会限速的可靠字节流管道":先三次握手建连,通信中每字节编号、确认、重传,用滑动窗口做流量控制、用拥塞窗口做拥塞控制,结束再四次挥手拆连。与之相对,UDP 只管发不管到。

生活化类比

TCP 像一次打电话:先"喂,能听见吗?"—“能听见,你呢?"—“我也能”,双方确认接通了才开始说正事;说完还要"那就这样啊”—“好”—“再见”—“再见"地互相道别才挂断。

通话过程中,你每说一段对方都会"嗯、对、听到了"地回应一声;对方没吭声你就重复一遍;对方说"你慢点我记不过来”,你就放慢语速;线路杂音大听不清,你也会主动降速重讲。这一整套"确认 + 重讲 + 控速",就是 TCP 的全部工作。

3. 它解决什么问题

为什么没有它,网络就"缺了一块":

  1. 可靠交付:丢包重传、按序重组、去重,应用层拿到的是完整无误的字节流。
  2. 流量控制:接收方用窗口通告(rwnd)抑制发送方,防止压垮自己。
  3. 拥塞控制:感知网络拥塞时主动降速,保护共享网络。
  4. 连接语义:面向连接,提供全双工、点对点、一对一通信。

4. 核心特征

  • 【面向连接】面向连接:通信前三次握手,结束后四次挥手。
  • 【无边界】字节流、无消息边界:不保留应用层"一次 write"的边界(与 UDP 的"数据报边界"相反),需应用自己分帧。
  • 【可靠】可靠机制:序列号 + 确认(ACK)+ 校验和 + 重传(超时 RTO / 快速重传收 3 个重复 ACK)。
  • 【双窗口限速】双窗口:rwnd(流量控制)+ cwnd(拥塞控制),实际发送受 min(rwnd, cwnd) 限制。
  • 【状态驱动】状态机:11 状态(CLOSED→SYN_SENT→ESTABLISHED→…→TIME_WAIT),TIME_WAIT 持续 2MSL(Linux 默认 60s)。

5. 与其他协议的关系

相关协议关系
UDP同层替代:无连接、不可靠、保留消息边界,低延迟场景
IPTCP 的承载(协议号 6);TCP 不保证网络层可达,只保证"尽力后的可靠"
TLS在 TCP 之上提供加密,HTTPS = HTTP over TLS over TCP
QUIC基于 UDP 实现类 TCP 可靠+拥塞控制,并解决队头阻塞/连接迁移

6. 本目录学习路线

  1. 01-原理与报文 — 三次握手/四次挥手时序、TCP 头字段、滑动窗口与重传、拥塞控制四阶段、知识框架。
  2. 02-实战与排错 — Wireshark tcp 抓包、ss/netstat 状态查看、TIME_WAIT 堆积/重传高/连接建不起排查、与 UDP 对比与面试速查。

初学者最常踩的坑:拿"粘包"去怪 TCP。TCP 本来就是字节流、无消息边界,它从不承诺保留你"一次 write"的边界——分帧是应用层自己的活(加长度前缀或分隔符)。第二个常见坑是看到一堆 TIME_WAIT 就以为出故障了,其实那是主动关闭方按设计等待 2MSL 的正常状态。