TCP IP 四层模型
TCP IP 四层模型
什么是 TCP/IP
TCP/IP 不是某一个协议,是一族协议——TCP、IP、UDP、ICMP、ARP、HTTP、DNS 都算。这族协议最初是 1970 年代为 ARPANET 设计的,1983 年成为军用网络标准,后来军用转民用,演变成今天整个互联网的底座。
"TCP/IP" 这个名字常被误读成 "TCP + IP" 两个协议。其实它指的是 "TCP/IP 协议族"(TCP/IP Protocol Suite),是一整套协议的设计哲学和实现。哲学的核心是"端到端原则":网络的中间节点(路由器)尽量不做复杂处理,复杂的事情(可靠传输、安全加密、应用逻辑)放在两端的终端上。
这个原则和电话网("智能网络 + 笨终端")完全相反。电话网的核心在交换机,终端就是个话筒。互联网的核心在服务器和客户端,路由器只管把包转走。
四层结构
TCP/IP 把网络功能分成四层,每层只关心自己。
网络接口层(Network Interface Layer)
负责"在一个局部网络里怎么把数据传出去"。具体包括:
- 把 IP 数据报封装成帧(以太网帧、Wi-Fi 帧、光纤帧)
- 处理 MAC 地址、ARP 请求、碰撞检测
- 这一层没有"协议"标准,只定义了"接口"。以太网协议、Wi-Fi 协议、PPP 协议都是它的实现。
网际层(Internet Layer)
负责"在多个网络之间怎么把数据送到目的 IP"。具体包括:
- IP 协议:定义 IP 地址格式和数据报结构
- ICMP 协议:传错误报告和控制消息(ping 用 ICMP)
- ARP 协议:把 IP 地址翻译成 MAC 地址
- 路由器在这一层工作,根据目的 IP 查路由表决定下一跳
传输层(Transport Layer)
负责"端到端怎么传、怎么保证可靠/速度"。具体包括:
- TCP:面向连接、可靠、有序、流控、拥塞控制
- UDP:无连接、不保证送达、最小开销
- 端口号在这一层起作用,区分同一台机器上的不同应用
应用层(Application Layer)
负责"应用怎么用网络"。具体包括:
- HTTP、HTTPS:网页
- DNS:域名解析
- SMTP、POP3、IMAP:邮件
- SSH:远程登录
- FTP:文件传输
- TLS:加密
TCP/IP 报文封装
假设你用 curl 给 www.example.com 发一个 HTTP 请求。数据在四层的封装过程:
[应用层] HTTP 请求: GET / HTTP/1.1
Host: www.example.com
[传输层] TCP 头 + HTTP 请求
源端口: 54321 目的端口: 80
序列号: 1000 确认号: 0
标志位: SYN (建立连接第一步)
[网际层] IP 头 + TCP 头 + HTTP 请求
源 IP: 192.168.1.100 目的 IP: 93.184.216.34
协议: 6 (TCP) 生存时间: 64
[网络接口层] 以太网帧
目的 MAC: aa:bb:cc:dd:ee:ff 源 MAC: 11:22:33:44:55:66
以太网类型: 0x0800 (IP)
[IP 头 + TCP 头 + HTTP 请求]
帧校验序列 (CRC32)注意每一层都加了一个头部,到了对端再逐层剥掉。这叫"封装/解封装"。每一层只看得懂自己这一层的头部,对其他层透明。
为什么 TCP/IP 赢了 OSI
OSI 是 ISO 1970 年代开始设计、1984 年正式发布的标准。OSI 设计得更优雅、层次更清晰、理论上更完美。但 TCP/IP 1990 年代已经把互联网跑起来了。OSI 没赢,原因有三:
第一,OSI 模型太复杂,协议栈实现成本高。 完整的 OSI 协议栈需要实现 7 层所有协议,工作量巨大。TCP/IP 协议族从一开始就是"用得着的先实现",CRUD 极简。1990 年代学者们争论"OSI 和 TCP/IP 谁是未来"时,TCP/IP 已经把全球网络跑顺了。
第二,OSI 协议栈脱离实际部署。 ISO 是政府/学术机构,协议要经过多年讨论才发布。IETF 是工程师社区,提案有问题就改版本。1990 年 ISO 推 OSI 协议栈时,TCP/IP 已经被几十万台机器实际运行。
第三,OSI 失败案例的根因是"复杂性反噬"。 一个复杂系统要占领市场,需要用户能轻松上手。OSI 协议栈互相之间的依赖关系复杂,配置繁琐。TCP/IP 协议可以逐步部署、互不依赖。
历史教训:完美的标准不如可用的标准。今天所有新协议(QUIC、HTTP/3、gRPC、IPFS)都跑在 TCP/IP 协议族之上,OSI 成了教学工具。
一个 TCP/IP 视角的故障排查
公司里有个常见问题:服务 A 调服务 B 失败,错误是"connection refused"。按 TCP/IP 四层逐层排查:
第 1 步:应用层。 服务 B 真的在监听那个端口吗?登录服务 B 机器,运行 netstat -tlnp | grep 8080,看 8080 是不是 LISTEN 状态。如果没监听,肯定 connection refused。
第 2 步:传输层。 防火墙(iptables、安全组)是不是把 8080 拦了?用 iptables -L -n 看规则。安全组在云控制台看。
第 3 步:网际层。 服务 A 能 ping 通服务 B 的 IP 吗?ping 不通就是 IP 层路由不到。traceroute 看在哪一跳断了。
第 4 步:网络接口层。 网卡是不是 down 了?ip link 看状态。网线松了、网卡驱动挂了都会出这层的问题。
四层逐层排查的好处是不会遗漏。现实里 90% 的 connection refused 是第 1 步没监听或第 2 步防火墙挡了。
TCP/IP 模型在中国互联网的特殊性
中国的网络结构有几个"中国特色",理解它们能帮你看懂很多现象:
NAT 渗透率极高。 由于 IPv4 地址不够,中国家庭宽带 100% 是 NAT 出口。运营商给家庭用户分配的是 100.64.0.0/10 私网地址,多个用户共享一个公网 IP。这导致 P2P、视频通话、SSH 反向连接都难搞。
跨网互联的延迟差异。 中国电信、移动、联通三大运营商内部骨干网延迟低(10-20ms),跨网延迟高(30-80ms)。有些跨网 HTTP 请求会触发运营商 NAT 网关的"端口限制"——同一个公网 IP 上的不同用户因端口冲突连接失败。游戏公司为了让全国玩家低延迟,要"三网互联"或部署 BGP 机房。
CDN 与 ICP 备案。 中国的网站如果要公开访问,必须在工信部备案(ICP 备案),否则域名会被 DNS 污染指向错误的 IP(127.0.0.1 或黑名单 IP)。CDN 节点也必须用备案过的域名。
思考题
- "端到端原则"把智能放到终端,让中间网络简单。这个原则在 IPv4 时代很好用,但在 IPv6 时代为什么可能会变化?(提示:防火墙、QoS、IPv6 扩展头的中间盒需求)
- TCP/IP 协议族里"应用层"包含 HTTP、DNS、TLS 等 100+ 协议。这些协议都"直接跑在 TCP 或 UDP 之上"吗?有没有协议在它们之间加了层?(提示:TLS 1.3 之前是 record protocol 包 TCP,HTTP/2 跑在 TLS 之上,gRPC 跑在 HTTP/2 之上)
- 假设你设计一个物联网协议,要求电池供电设备能用 1 年以上。这个协议应该跑在 TCP 还是 UDP 之上?为什么?(提示:TCP 状态机耗电、3 次握手增加延迟、UDP 更适合)
延伸阅读
- 《深入浅出计算机网络》(高军)第 1 章
- 《计算机网络:自顶向下方法》(Kurose)第 1 章
- RFC 793: TCP 协议原始规范
- 动手实验:在 Linux 上
cat /etc/services,看 TCP 和 UDP 上跑的协议有多少