TCP/IP 体系结构(协议栈)入门
我们平时说“上网”“发请求”,背后其实是一整套分层协作的网络协议在工作。TCP/IP 体系结构(也常被叫作 TCP/IP 协议栈)就是这套协议在工程实践中最常用的分层模型。
学习它的目标不是背名词,而是能回答这些更实际的问题:
- 为什么同样是“网络问题”,有时要改 DNS,有时要看路由,有时要抓包看 TCP?
- 为什么 HTTP 明明是“应用层”,却经常要你理解 TCP 三次握手、TLS 握手?
- 一次请求从浏览器到服务器,数据到底是怎么被“打包”并传过去的?
1. 分层思想:把复杂系统拆开协作
网络通信很复杂:要考虑应用语义(比如 HTTP)、可靠传输(比如丢包重传)、跨网络寻址与路由(IP)、以及在一段物理链路上把比特送过去(以太网/Wi‑Fi)。
TCP/IP 用“分层”把问题拆开:
- 每一层只关心自己的职责,向上提供服务、向下使用能力
- 层与层之间通过“封装”协作:上层数据会被下层加上自己的头部(Header),再继续往下交付
- 这样做的好处是:应用(HTTP)不需要知道你是走 Wi‑Fi 还是网线;网卡也不需要理解 HTTP 的语义
你可以把它类比成寄快递:
- 你写“信”(应用层数据)
- 快递公司给你装箱、贴面单、分拣、运输(传输层/网际层/链路层)
- 收件人按顺序拆箱、看信(解封装)
2. TCP/IP 四层模型(最常见版本)
不同教材对层次命名会有差异(比如“网络接口层/链路层”“网际层/网络层”),但职责基本一致。
| 层次(自上而下) | 主要职责 | 常见协议/技术 | 你在前端最常遇到的现象 |
|---|---|---|---|
| 应用层 | 定义“应用如何交流” | HTTP(S)、DNS、WebSocket、TLS(常被视为位于应用与传输之间) | 请求/响应、跨域、缓存、证书 |
| 传输层 | 端到端传输;可靠性/顺序/拥塞控制 | TCP、UDP、QUIC(基于 UDP) | 连接复用、丢包导致卡顿、端口 |
| 网际层(Internet) | 跨网络寻址与路由 | IP、ICMP | 路由、TTL、ping/traceroute |
| 网络接口层(链路) | 在一段链路上传输;MAC 寻址 | Ethernet、Wi‑Fi、ARP、VLAN | 同网段通信、ARP 问题、抓包看到帧 |
用一张图把“四层”放在一起更直观:
3. TCP/IP 与 OSI 七层:怎么对应?
OSI 七层更多是“教学模型”,TCP/IP 更像“工程模型”。实际排障/抓包时,TCP/IP 的四层划分更常用。
一个常见的对照关系是:
| OSI 七层 | TCP/IP 四层 | 说明 |
|---|---|---|
| 应用层/表示层/会话层 | 应用层 | TCP/IP 往往把这三层合并理解 |
| 传输层 | 传输层 | TCP/UDP 所在位置一致 |
| 网络层 | 网际层(Internet) | IP 路由与寻址 |
| 数据链路层/物理层 | 网络接口层(链路) | 以太网/Wi‑Fi 与物理介质 |
4. 数据是怎么“封装”出去的?
从浏览器发出一个 HTTP 请求,最终会变成一串比特在网线上/无线电里传输。关键过程是 封装(Encapsulation):
- 应用层产生数据(比如 HTTP 报文)
- 传输层加上 TCP/UDP 头(端口、序号等)
- 网际层加上 IP 头(源/目的 IP、TTL 等)
- 链路层加上以太网/Wi‑Fi 头(源/目的 MAC 等)
对应的“包名”通常是:
- 应用层:消息/报文(message)
- 传输层:TCP 段(segment)/UDP 数据报(datagram)
- 网际层:IP 包(packet)
- 链路层:帧(frame)
4.1 三种“地址”分别解决什么问题?
同一个请求里会同时出现多种“地址”,各管一层:
| 概念 | 例子 | 作用范围 | 解决的问题 |
|---|---|---|---|
| MAC 地址 | 3c:22:fb:... | 同一段链路(同网段) | “这一跳要交给哪块网卡?” |
| IP 地址 | 203.0.113.10 | 跨网络 | “目标在互联网的哪个网络?” |
| 端口号 | 443、80 | 主机内部的进程 | “这台机器上交给哪个应用?” |
你在代码里常用的 fetch("https://example.com"),背后对应到传输层,其实是在建立/使用一个 Socket,可以用“四元组”唯一标识:
源 IP:源端口 + 目的 IP:目的端口
5. 从 TCP/IP 角度看:访问一个 HTTPS 网站发生了什么?
以浏览器访问 https://example.com 为例(省略很多细节,只抓“分层主线”):
想把其中某一段学深,可以配合这些文章一起看:
- TCP 建连/断连:TCP 三次握手与四次挥手
- HTTPS 与 TLS:SSL/TLS 与 HTTPS
6. 一些重要但容易混的机制(速查)
6.1 ARP:IP 怎么找到 MAC?
在同一局域网里,真正“交付到下一跳网卡”靠的是 MAC 地址。但应用层通常只知道 IP(或者域名)。ARP 用来把“目标 IP”解析成“目标 MAC”(通常是下一跳路由器的 MAC)。
你会在抓包里看到“Who has 192.168.1.1? Tell 192.168.1.100”这类 ARP 请求。
6.2 ICMP、ping、traceroute
- ICMP 是 IP 层的“控制/诊断消息”
ping本质是在收发 ICMP Echo 请求/应答traceroute常利用 TTL 逐跳递减触发 ICMP 超时消息,从而推断路径
6.3 MTU、MSS 与分片
- MTU:链路层一帧能承载的最大 IP 包大小(以太网常见 1500)
- MSS:TCP 层“单个 TCP 段里可放的应用数据上限”,通常约等于
MTU - IP 头 - TCP 头 - IP 分片:当 IP 包大于路径上的某段 MTU 时,可能被分片(分片更容易丢、也更影响性能)
前端常见的现象是:某些网络环境下大包更容易出问题(比如丢包、重传、首包慢)。理解 MTU/MSS 能帮助你解释“为什么同一接口在不同网络下表现差异很大”。
7. 实战:用命令把“分层”看见
下面这些命令不要求你都熟练,但建议至少知道它们分别对应哪一层。
7.1 应用层:看 DNS、看 HTTP
# 看 DNS 解析结果
nslookup example.com
# 观察一次 HTTPS 请求的握手与响应头(更偏应用层视角)
curl -v https://example.com
7.2 网际层:看连通性与路由路径
# 是否能到达(ICMP)
ping -c 4 1.1.1.1
# 路由路径(不同系统参数略有差异)
traceroute example.com
7.3 传输层:看 TCP 状态与端口
# 查看 TCP 连接与状态(Linux 常用 ss;macOS 可用 netstat)
ss -tn
如果你看到大量
SYN-SENT、TIME-WAIT、CLOSE-WAIT,通常意味着传输层正在发生你需要关注的事情。
8. 常见误区
-
“TCP/IP = TCP + IP”
TCP/IP 更准确是“协议族 + 分层模型”,TCP/UDP、IP、ICMP、DNS、HTTP…都在这个体系里。 -
“HTTP 是传输层协议”
HTTP 是应用层协议;它依赖传输层(TCP/QUIC)提供端到端传输能力。 -
“有 IP 就一定能访问网站”
你还需要 DNS、路由、端口放通、TLS 证书、应用服务可用等,任何一层出问题都会“看起来像网络坏了”。
9. 总结
- TCP/IP 体系结构用分层降低复杂度:应用层、传输层、网际层、网络接口层
- 请求发出去的过程本质是不断“封装”,收回来是“解封装”
- MAC、IP、端口分别解决“这一跳”“跨网络”“进程定位”的问题
- 会用分层视角定位问题:DNS/HTTP 看应用层、握手/重传看传输层、TTL/路径看网际层、ARP/同网段看链路层
面试高频问答
Q1:TCP/IP 四层分别是什么?每层做什么?
- 应用层:应用协议与数据格式(HTTP、DNS…)
- 传输层:端到端传输与可靠性(TCP/UDP/QUIC)
- 网际层:IP 寻址与路由(IP、ICMP)
- 网络接口层:单链路传输与 MAC 寻址(以太网、Wi‑Fi、ARP)
Q2:OSI 七层和 TCP/IP 四层有什么关系?哪个更重要?
OSI 七层偏教学与抽象;TCP/IP 四层偏工程与实践。面试中会问 OSI,但真实排障与抓包更常用 TCP/IP 的分层视角。
Q3:IP 为什么“不可靠”?可靠性是谁来保证的?
IP 只负责“尽力而为”地把包送到目的地(可能丢包、乱序、重复)。可靠性通常由传输层的 TCP 来提供(序号、确认、重传、拥塞控制)。
Q4:端口号的意义是什么?
IP 只能把包送到“某台主机”,端口用来把数据交给“这台主机上的某个进程/服务”。比如 HTTPS 默认 443,HTTP 默认 80。
Q5:Socket 是什么?“四元组”是什么?
Socket 可以理解为应用访问传输层服务的抽象。一个 TCP 连接通常可被四元组唯一标识:源 IP:源端口 + 目的 IP:目的端口。
Q6:ARP 在哪一层?解决什么问题?
ARP 通常归入网络接口层(链路相关)。它解决“已知目标 IP(或下一跳 IP),如何得到对应 MAC 地址”的问题。
Q7:ping 和 traceroute 分别基于什么原理?
- ping:ICMP Echo 请求/应答,验证“IP 层可达性”
- traceroute:利用 TTL 逐跳递减触发 ICMP 超时消息,推断路径上的每一跳
Q8:MTU、MSS、分片是什么关系?为什么分片不好?
MTU 是链路层限制,MSS 是 TCP 为避免 IP 分片而给出的“每段应用数据上限”。分片会带来更高丢包风险与重组开销,影响性能与稳定性。
Q9:TCP 和 UDP 的区别?前端更常遇到哪个?
- TCP:面向连接、可靠、有序(HTTP/1.1、HTTP/2、TLS 常跑在 TCP 上)
- UDP:无连接、尽力而为、开销小(DNS 常用 UDP;HTTP/3 的 QUIC 跑在 UDP 上)
前端日常更多遇到 TCP(以及基于 TCP 的 TLS/HTTP),但随着 HTTP/3 普及,理解 UDP/QUIC 也越来越重要。
Q10:为什么访问 HTTPS 必须先 TCP 再 TLS?
TLS 需要一个可用的传输通道来交换握手消息;经典 HTTPS 是 “HTTP + TLS + TCP + IP”。(HTTP/3 则是 “HTTP + QUIC + UDP + IP”,结构不同。)
Q11:为什么有时候“能 ping 通但打不开网页”?
ping 只验证 ICMP 的可达性;打不开网页可能是 DNS 解析失败、443/80 端口被拦、TLS 证书/握手失败、应用服务异常、代理配置错误等(更上层的问题)。
Q12:如何用分层思维快速排查“请求失败”?
一个实用顺序:
- 应用层:域名能否解析?
curl -v返回什么?是否被代理/证书影响? - 传输层:是否建立连接?握手是否超时?是否大量重传?
- 网际层:路由是否可达?是否某一跳丢包严重?
- 链路层:同网段是否正常?是否 ARP 异常?Wi‑Fi 是否频繁断连?