认识 TCP 协议与传输层定位
TCP 是什么
想象你给朋友寄一封挂号信:邮局会记录每一封信的编号,确认对方签收后才算送达;如果信丢了,邮局会自动重寄;如果顺序乱了,邮局会帮你按编号排好。TCP(Transmission Control Protocol,传输控制协议)干的就是这件事——在不可靠的 IP 网络上,提供可靠的、面向连接的、基于字节流的传输服务。
与 IP 的"尽力而为"不同,TCP 承诺:
- 可靠交付:数据不丢、不错、不乱序
- 面向连接:通信前先"打电话"确认双方在线
- 全双工:双方可以同时说话和听
- 字节流:不保留消息边界,像水管一样连续流动
TCP 在协议栈中的位置
TCP 位于传输层(OSI 第四层),承上启下:
- 向上:通过端口号区分不同应用进程(HTTP 走 80 端口,SSH 走 22 端口)
- 向下:把数据交给 IP 层,由 IP 负责寻址和路由
关键概念:五元组唯一标识一条 TCP 连接
{源IP, 源端口, 目的IP, 目的端口, 协议类型=TCP}
例如你访问百度:{192.168.1.10:54321, 110.242.68.3:443, TCP},这条连接在全球互联网中是唯一的。
TCP vs UDP:两种哲学
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(确认+重传) | 不可靠(尽力而为) |
| 顺序 | 保证按序交付 | 不保证 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有(cwnd/ssthresh) | 无 |
| 头部开销 | 20~60 字节 | 8 字节 |
| 传输效率 | 较低(控制开销大) | 极高 |
| 适用场景 | 文件传输、网页、邮件 | 视频直播、DNS、游戏 |
生活例子:
- TCP 像打电话:先拨号确认对方在,说一句等对方"嗯"一声确认,说乱了对方会提醒重说
- UDP 像发短信:发出去就不管了,对方收没收到、顺序对不对都不保证,但速度快
TCP 的核心设计思想
TCP 的设计可以概括为一句话:"在不可靠的网络上构建可靠的传输"。它通过四大机制实现:
- 连接管理:三次握手建立连接,四次挥手释放连接,维护连接状态机
- 可靠传输:序列号 + 累积确认 + 超时重传 + 快速重传
- 流量控制:滑动窗口,防止发送方淹没接收方
- 拥塞控制:慢启动 + 拥塞避免 + 快重传 + 快恢复,防止淹没网络
端口号:传输层的服务访问点
端口号是 16 位无符号整数(0~65535),分为三类:
| 范围 | 名称 | 说明 |
|---|---|---|
| 0~1023 | 熟知端口(Well-Known) | IANA 统一分配,如 80(HTTP)、443(HTTPS)、22(SSH) |
| 1024~49151 | 注册端口(Registered) | 需向 IANA 注册,如 3306(MySQL)、8080(代理) |
| 49152~65535 | 动态/私有端口(Dynamic) | 客户端临时使用,如浏览器访问网页时的源端口 |
生活例子:IP 地址是"小区地址",端口号是"门牌号"。快递送到小区(IP)后,还需要门牌号(端口)才能找到具体住户(应用进程)。
本篇小结
- TCP 提供可靠、面向连接、全双工的字节流服务
- 五元组
{源IP, 源端口, 目的IP, 目的端口, TCP}唯一标识连接 - TCP 四大机制:连接管理、可靠传输、流量控制、拥塞控制
- UDP 无连接、不可靠、低开销,适合实时场景
- 熟知端口 0~1023(80/443/22),动态端口 49152~65535
动手实践
查看本机 TCP 连接:
# Linux ss -tunlp netstat -tn # Windows netstat -an | findstr TCP观察浏览器访问网页时的五元组:
# 找到浏览器进程对应的连接 ss -tp | grep chrome思考:为什么 DNS 查询(通常很小)使用 UDP 而不是 TCP?什么情况下 DNS 会切换到 TCP?