TCP — 传输控制协议
面向连接、可靠、基于字节流的传输层协议 / 传输层 / IP 协议号 6 / RFC 9293
Table of Contents
1. 协议定位
| 项目 | 信息 |
|---|---|
| 所属层 | 传输层 |
| 英文全称 | Transmission Control Protocol |
| 主要 RFC | RFC 9293(2022,整合历史文档);拥塞控制 RFC 5681;SACK RFC 2018 |
| 端口 | 用 端口号 标识会话(无独立协议端口,IP 协议号 6) |
| 封装于 | IP(协议号 6) |
| 典型应用 | HTTP/HTTPS、SSH、数据库、邮件等需可靠有序的通信 |
2. 一句话理解
TCP 是"带确认、能纠错、会限速的可靠字节流管道":先三次握手建连,通信中每字节编号、确认、重传,用滑动窗口做流量控制、用拥塞窗口做拥塞控制,结束再四次挥手拆连。与之相对,UDP 只管发不管到。
生活化类比
TCP 像一次打电话:先"喂,能听见吗?"—“能听见,你呢?"—“我也能”,双方确认接通了才开始说正事;说完还要"那就这样啊”—“好”—“再见”—“再见"地互相道别才挂断。
通话过程中,你每说一段对方都会"嗯、对、听到了"地回应一声;对方没吭声你就重复一遍;对方说"你慢点我记不过来”,你就放慢语速;线路杂音大听不清,你也会主动降速重讲。这一整套"确认 + 重讲 + 控速",就是 TCP 的全部工作。
3. 它解决什么问题
为什么没有它,网络就"缺了一块":
- 可靠交付:丢包重传、按序重组、去重,应用层拿到的是完整无误的字节流。
- 流量控制:接收方用窗口通告(rwnd)抑制发送方,防止压垮自己。
- 拥塞控制:感知网络拥塞时主动降速,保护共享网络。
- 连接语义:面向连接,提供全双工、点对点、一对一通信。
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 | 同层替代:无连接、不可靠、保留消息边界,低延迟场景 |
| IP | TCP 的承载(协议号 6);TCP 不保证网络层可达,只保证"尽力后的可靠" |
| TLS | 在 TCP 之上提供加密,HTTPS = HTTP over TLS over TCP |
| QUIC | 基于 UDP 实现类 TCP 可靠+拥塞控制,并解决队头阻塞/连接迁移 |
6. 本目录学习路线
- 01-原理与报文 — 三次握手/四次挥手时序、TCP 头字段、滑动窗口与重传、拥塞控制四阶段、知识框架。
- 02-实战与排错 — Wireshark
tcp抓包、ss/netstat 状态查看、TIME_WAIT 堆积/重传高/连接建不起排查、与 UDP 对比与面试速查。
初学者最常踩的坑:拿"粘包"去怪 TCP。TCP 本来就是字节流、无消息边界,它从不承诺保留你"一次 write"的边界——分帧是应用层自己的活(加长度前缀或分隔符)。第二个常见坑是看到一堆
TIME_WAIT就以为出故障了,其实那是主动关闭方按设计等待 2MSL 的正常状态。