TCP 简介与分层模型
本系列基于 RFC 9293(TCP 协议规范)编写,面向网络初学者,由浅入深讲解 TCP 协议的核心概念。
1. 什么是 TCP?
TCP(Transmission Control Protocol,传输控制协议) 是互联网中最核心的协议之一。它工作在传输层,为应用层提供可靠的、面向连接的、基于字节流的数据传输服务。
通俗地说:当你用浏览器打开网页、用微信发消息、用 FTP 传文件的时候,底层大概率跑着 TCP。TCP 的核心承诺是——"你给我的数据,我一定完整、有序、正确地交到对方手上"。
TCP 的核心特征
| 特征 | 说明 |
|---|---|
| 面向连接 | 通信前必须建立连接(三次握手),结束后释放(四次挥手) |
| 可靠传输 | 通过序列号、确认应答、重传机制保证数据不丢不错不重 |
| 全双工 | 双方可以同时收发数据 |
| 字节流 | 不保留消息边界,数据是连续的字节流 |
| 流量控制 | 防止发送方淹没接收方(滑动窗口) |
| 拥塞控制 | 防止过多数据注入导致网络拥堵 |
2. 分层模型:TCP 在哪里?
2.1 TCP/IP 四层模型
互联网实际使用的是 TCP/IP 协议族,分为四层:
┌─────────────────────────────┐
│ 应用层 (Application) │ HTTP, FTP, SMTP, DNS, SSH...
├─────────────────────────────┤
│ 传输层 (Transport) │ TCP, UDP
├─────────────────────────────┤
│ 网络层 (Internet) │ IP, ICMP, ARP
├─────────────────────────────┤
│ 网络接口层 (Network Access) │ 以太网, Wi-Fi, PPP...
└─────────────────────────────┘
TCP 位于传输层,承上启下:
- 向下:依赖 IP 层提供的主机到主机的数据报传输(但 IP 不可靠,可能丢包、乱序)
- 向上:为应用层提供可靠的数据流传输
2.2 OSI 七层参考模型
OSI 七层模型是理论参考模型,TCP 大致对应 第 4 层(传输层):
| OSI 层 | 名称 | TCP/IP 对应 |
|---|---|---|
| 第 7 层 | 应用层 | 应用层 |
| 第 6 层 | 表示层 | 应用层 |
| 第 5 层 | 会话层 | 应用层 |
| 第 4 层 | 传输层 | 传输层(TCP 在这里) |
| 第 3 层 | 网络层 | 网络层 |
| 第 2 层 | 数据链路层 | 网络接口层 |
| 第 1 层 | 物理层 | 网络接口层 |
3. TCP 的工作原理概览
3.1 连接标识:套接字对
一个 TCP 连接由四个要素唯一标识:
{源IP, 源端口, 目的IP, 目的端口}
例如你的浏览器(192.168.1.5:54321)连接百度服务器(110.242.68.66:443),这四元组在整个互联网中唯一定位了这个连接。
3.2 TCP 段的封装路径
应用数据在发送前经历多层封装:
应用数据
↓ TCP 头部(源端口/目的端口/序列号/确认号/标志位...)
TCP 段
↓ IP 头部(源IP/目的IP...)
IP 数据报
↓ 以太网头部 + 尾部
以太网帧
接收方逐层解封装,最终将原始数据交给应用。
3.3 数据编号与确认
TCP 为每个发送的字节分配一个序列号(0 到 2^32-1)。接收方通过确认号告知发送方"我已经收到前 N 个字节,请从第 N+1 个开始发"。
4. TCP 的应用场景
| 应用 | 协议 | 为什么用 TCP |
|---|---|---|
| Web 浏览 | HTTP/HTTPS | 页面内容必须完整无缺 |
| 电子邮件 | SMTP/POP3/IMAP | 邮件内容不能丢 |
| 文件传输 | FTP/SFTP | 文件必须完整 |
| 远程登录 | SSH | 命令不能丢不能乱 |
| 数据库 | MySQL/PostgreSQL | 查询结果必须可靠 |
5. 小结
TCP 是互联网传输层的基石。它通过序列号确认、窗口流量控制、拥塞控制算法,在不可靠的 IP 网络之上构建了一套可靠的传输服务。后续篇章将逐一深入每个核心机制。
本篇要点
- TCP 工作在 TCP/IP 四层模型的传输层,OSI 七层模型中对应第 4 层
- TCP 的核心特征:面向连接、可靠传输、全双工、面向字节流、流量控制、拥塞控制
- IP 负责主机到主机的不可靠数据报传输,TCP 在 IP 之上构建可靠的端到端传输
- 一个 TCP 连接由四元组唯一标识:{源IP, 源端口, 目的IP, 目的端口}
- TCP 面向字节流,不保留消息边界,应用层需自行处理粘包/拆包问题