跳到主要内容

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)

  1. 应用层产生数据(比如 HTTP 报文)
  2. 传输层加上 TCP/UDP 头(端口、序号等)
  3. 网际层加上 IP 头(源/目的 IP、TTL 等)
  4. 链路层加上以太网/Wi‑Fi 头(源/目的 MAC 等)

对应的“包名”通常是:

  • 应用层:消息/报文(message)
  • 传输层:TCP 段(segment)/UDP 数据报(datagram)
  • 网际层:IP 包(packet)
  • 链路层:帧(frame)

4.1 三种“地址”分别解决什么问题?

同一个请求里会同时出现多种“地址”,各管一层:

概念例子作用范围解决的问题
MAC 地址3c:22:fb:...同一段链路(同网段)“这一跳要交给哪块网卡?”
IP 地址203.0.113.10跨网络“目标在互联网的哪个网络?”
端口号44380主机内部的进程“这台机器上交给哪个应用?”

你在代码里常用的 fetch("https://example.com"),背后对应到传输层,其实是在建立/使用一个 Socket,可以用“四元组”唯一标识:

源 IP:源端口 + 目的 IP:目的端口


5. 从 TCP/IP 角度看:访问一个 HTTPS 网站发生了什么?

以浏览器访问 https://example.com 为例(省略很多细节,只抓“分层主线”):

想把其中某一段学深,可以配合这些文章一起看:


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-SENTTIME-WAITCLOSE-WAIT,通常意味着传输层正在发生你需要关注的事情。


8. 常见误区

  1. “TCP/IP = TCP + IP”
    TCP/IP 更准确是“协议族 + 分层模型”,TCP/UDP、IP、ICMP、DNS、HTTP…都在这个体系里。

  2. “HTTP 是传输层协议”
    HTTP 是应用层协议;它依赖传输层(TCP/QUIC)提供端到端传输能力。

  3. “有 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:如何用分层思维快速排查“请求失败”?

一个实用顺序:

  1. 应用层:域名能否解析?curl -v 返回什么?是否被代理/证书影响?
  2. 传输层:是否建立连接?握手是否超时?是否大量重传?
  3. 网际层:路由是否可达?是否某一跳丢包严重?
  4. 链路层:同网段是否正常?是否 ARP 异常?Wi‑Fi 是否频繁断连?