一、从一个问题开始:打开网页时发生了什么?
当你在浏览器里输入:
https://www.example.com然后按下回车,表面上只是“打开一个网页”,但从网络角度看,这是一次完整的数据传输过程。
浏览器需要把一个请求发送到远方的服务器,服务器再把网页数据返回给浏览器。这个过程并不是某一个协议独立完成的,而是多个协议分工协作的结果。
可以先用一句话概括:
HTTP 决定“传什么”,TLS 决定“怎么加密”,TCP 决定“如何可靠传输”,IP 决定“往哪里传”,以太网或 Wi-Fi 决定“下一跳怎么发出去”。
一次网页访问,大致可以分成几个阶段:
输入网址↓解析域名,找到服务器 IP↓建立 TCP 连接↓建立 HTTPS 加密通道↓发送 HTTP 请求↓数据经过 TCP/IP 协议栈传输↓服务器处理请求并返回响应↓浏览器接收、解密、解析并渲染网页↓连接关闭这条线索,就是理解计算机网络的主线。
二、发送之前:浏览器要先知道数据发给谁
在网络中,数据不能只靠域名传输。人类习惯记住域名,例如:
www.example.comgithub.combaidu.com但计算机真正通信时,需要的是 IP 地址。
所以浏览器首先要解决的问题是:
这个域名对应哪台服务器?
1. URL 里包含哪些信息?
以这个地址为例:
https://www.example.com/index.html它可以拆成几部分:
https 协议www.example.com 域名/index.html 资源路径如果没有显式写端口,浏览器会根据协议自动选择默认端口:
HTTP 默认端口 80HTTPS 默认端口 443所以访问:
https://www.example.com本质上是准备访问:
www.example.com:443也就是访问这台服务器上的 HTTPS 服务。
2. DNS:把域名解析成 IP 地址
浏览器不能直接把数据发给 www.example.com,它需要先通过 DNS 查询得到 IP 地址。
DNS 的作用是:
域名 → IP 地址例如:
www.example.com → 93.184.216.34DNS 查询通常会经历缓存和递归查询过程。简化来看:
浏览器缓存↓操作系统缓存↓本地 DNS 服务器↓根域名服务器↓顶级域名服务器↓权威域名服务器↓返回 IP 地址实际访问时,不一定每次都会完整走完这个流程,因为浏览器、操作系统、本地 DNS 服务器都可能缓存解析结果。
3. IP 和端口共同确定通信目标
拿到 IP 后,浏览器真正要连接的是:
93.184.216.34:443这里有两个关键信息:
IP 地址:确定是哪台主机端口号:确定这台主机上的哪个服务一台服务器上可以同时运行很多服务,例如:
22 SSH 远程登录80 HTTP 网站服务443 HTTPS 网站服务3306 MySQL 数据库6379 Redis所以,网络通信并不是简单地“电脑找电脑”,而是:
一个进程通过 IP 和端口,找到另一台机器上的某个服务进程。
三、建立通道:TCP 如何保证数据可靠传输
浏览器知道服务器 IP 和端口之后,还不能马上发送 HTTP 请求。因为 HTTPS 通常运行在 TCP 之上,而 TCP 在正式传输数据之前,需要先建立连接。
1. TCP 在网络传输中的位置
在 TCP/IP 四层模型中,TCP 属于传输层。
应用层 HTTP、HTTPS、DNS、SSH传输层 TCP、UDP网络层 IP、ICMP网络接口层 以太网、Wi-FiHTTP 关心的是“请求什么资源、返回什么内容”。
TCP 关心的是:
数据有没有到达数据有没有丢失数据顺序是否正确接收方是否来得及处理网络是否拥塞换句话说,TCP 不理解网页内容,但它负责把上层交给它的数据可靠地送到对方进程。
2. 三次握手:连接是怎么建立的
TCP 建立连接的过程叫三次握手。
可以先用生活化语言理解:
客户端:我想和你建立连接。服务器:我收到了,我也同意建立连接。客户端:好的,我也收到了,我们开始通信。对应到 TCP 报文,就是:
客户端 服务器 | -------- SYN ----------> | | <----- SYN + ACK -------- | | -------- ACK ----------> | | | | TCP 连接建立 |其中:
SYN:请求建立连接ACK:确认收到三次握手的目的不是“走形式”,而是确认双方都具备正常的发送和接收能力。
客户端需要确认:
我能发出去我能收到服务器回复服务器也需要确认:
我能收到客户端请求客户端能收到我的回复同时,双方还会同步初始序列号,为后续可靠传输做准备。
3. TCP 如何做到可靠?
TCP 的可靠性主要依靠几个机制。
序列号
TCP 会给数据编号。
如果一段 HTTP 数据被拆成多个 TCP 报文段,接收方可以根据序列号重新排序。
TCP 段 1TCP 段 2TCP 段 3TCP 段 4即使它们到达顺序不完全一致,接收方也可以重新拼接。
确认应答
接收方收到数据后,会给发送方返回 ACK,表示已经收到。
如果发送方长时间没有收到确认,就会认为数据可能丢失,于是重传。
重传机制
网络中可能发生丢包。TCP 会通过超时重传、快速重传等机制重新发送丢失的数据。
这就是为什么 TCP 适合网页访问、文件下载、SSH 登录等场景。
流量控制与拥塞控制
TCP 还会考虑两个问题:
接收方处理得过来吗?网络当前拥堵吗?如果接收方处理能力有限,TCP 会降低发送速度。
如果网络出现拥塞,TCP 也会主动控制发送速率,避免进一步加剧拥堵。
四、加密之后再传:HTTPS 如何保护数据
如果访问的是 HTTP,TCP 连接建立后,浏览器就可以直接发送 HTTP 请求。
但现在大多数网站使用 HTTPS。
HTTPS 并不是完全替代 HTTP 的新协议,而可以理解为:
HTTPS = HTTP + TLS也就是说,HTTP 负责表达请求和响应,TLS 负责加密和安全。
1. HTTP 为什么不够安全?
HTTP 是明文传输。
如果你使用 HTTP 访问网站,中间链路上的某些节点理论上可能看到你传输的内容。
HTTP 面临的问题包括:
内容可能被窃听数据可能被篡改无法确认对方是不是假冒网站所以,单纯 HTTP 不适合传输密码、支付信息、个人资料等敏感内容。
2. TLS 解决什么问题?
TLS 主要解决三个问题:
加密:防止别人看懂传输内容认证:确认服务器身份完整性:防止数据被中途篡改访问 HTTPS 网站时,浏览器会检查服务器证书。
证书的作用是证明:
这个网站确实是它声称的那个网站如果证书过期、域名不匹配,或者证书来源不可信,浏览器就会发出安全警告。
3. HTTPS 的建立过程
一次 HTTPS 连接通常可以理解为两个阶段:
先建立 TCP 连接再进行 TLS 握手过程大致是:
TCP 三次握手↓TLS 握手↓验证服务器证书↓协商加密算法↓生成会话密钥↓开始加密传输 HTTP 数据所以,真正发送 HTTP 请求之前,浏览器已经做了很多准备工作。
对于 HTTPS 来说,请求内容在传输前会先被 TLS 加密。
原本的 HTTP 请求可能是:
GET /index.html HTTP/1.1Host: www.example.com经过 TLS 后,中间网络设备看到的不是明文请求,而是一段加密数据。
五、真正传输:数据如何穿过 TCP/IP 协议栈
现在浏览器已经准备好 HTTP 请求,并且 HTTPS 加密通道也建立完成。接下来,数据要真正从你的电脑发送出去。
这个过程的核心是:
数据从应用层开始,一层层向下封装;到达对方后,再一层层向上解封装。
1. 封装:数据从上往下加“包装”
以 HTTPS 请求为例,数据在发送时会经历这样的过程:
HTTP 请求↓TLS 加密↓TCP 封装↓IP 封装↓以太网 / Wi-Fi 封装↓通过网卡发送出去可以更形象地理解:
HTTP 数据:我要访问 /index.htmlTLS:把内容加密TCP:加上源端口、目标端口、序列号IP:加上源 IP、目标 IP链路层:加上源 MAC、目标 MAC最终在网络中传输的不是单纯的 HTTP 请求,而是经过多层封装后的数据帧。
2. TCP 层:确定进程到进程
TCP 头部里最重要的信息之一是端口号。
例如:
源端口:51523目标端口:443源端口通常是客户端临时分配的高位端口。
目标端口是服务器服务端口。
这意味着:
客户端某个临时端口 → 服务器 443 端口服务器返回数据时,也会反过来:
服务器 443 端口 → 客户端临时端口因此,TCP 解决的是:
哪个进程和哪个进程通信。
3. IP 层:确定主机到主机
IP 头部里最重要的是:
源 IP 地址目标 IP 地址例如:
源 IP:192.168.1.100目标 IP:93.184.216.34IP 层不关心端口,也不关心 HTTP 内容。它只关心:
这个数据包应该送到哪台主机。
如果目标 IP 不在本地局域网,电脑就会把数据交给默认网关,也就是路由器。
4. 链路层:确定下一跳怎么走
IP 地址负责最终目的地,但数据每次只能发给“下一跳”。
在局域网中,真正用来投递数据帧的是 MAC 地址。
这里有一个重要区别:
目标 IP:最终要到达的服务器目标 MAC:当前这一跳要交给的设备比如你的电脑访问远程服务器时:
目标 IP:远程服务器 IP目标 MAC:家用路由器的 MAC 地址也就是说,你的电脑并不会直接把数据帧发到远程服务器的 MAC 地址,而是先发给路由器。
之后每经过一个路由器,链路层地址都会变化,但 IP 层的目标地址通常保持指向最终服务器。
5. 路由:数据包一跳一跳前进
你的电脑通常只知道一件事:
如果目标不在本地网络,就交给默认网关。然后路由器继续根据路由表判断下一跳。
整个过程类似:
你的电脑↓家用路由器↓运营商网络↓骨干网络↓服务器所在机房网络↓目标服务器每经过一个路由器,就叫一跳。
你使用下面的命令看到的路径,就是这些中间跳点:
traceroute example.com或者:
mtr example.com六、服务器收到数据后:解封装与响应返回
数据到达服务器后,过程会反过来。
发送时是层层封装,接收时就是层层解封装。
1. 服务器如何拆开数据?
服务器网卡收到数据帧后,会按照协议栈逐层处理:
以太网 / Wi-Fi 帧↓取出 IP 数据包↓取出 TCP 报文段↓交给对应端口的服务↓TLS 解密↓得到 HTTP 请求最终,Web 服务器看到的是类似这样的 HTTP 请求:
GET /index.html HTTP/1.1Host: www.example.com然后服务器根据请求路径、请求方法、请求头等信息进行处理。
2. HTTP 响应是什么样的?
服务器处理完成后,会返回 HTTP 响应。
例如:
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 1256
<html> <body>Hello World</body></html>这里面包含三部分:
状态行:HTTP/1.1 200 OK响应头:Content-Type、Content-Length 等响应体:真正的网页内容常见状态码包括:
200:请求成功301 / 302:重定向403:禁止访问404:资源不存在500:服务器内部错误3. 响应数据如何回到浏览器?
服务器返回数据时,会走类似的封装流程:
HTTP 响应↓TLS 加密↓TCP 分段↓IP 封装↓链路层封装↓经过网络返回客户端客户端收到后再解封装:
网卡接收数据↓IP 层确认目标是本机↓TCP 根据端口交给浏览器进程↓TCP 重组数据↓TLS 解密↓浏览器解析 HTTP 响应↓渲染网页最终,你看到网页内容。
七、传输结束:TCP 如何关闭连接
数据传完之后,TCP 连接需要关闭。
TCP 是双向通信。客户端可以向服务器发送数据,服务器也可以向客户端发送数据。因此,关闭连接也需要双方分别确认。
这就是四次挥手。
1. 四次挥手的过程
可以先用自然语言理解:
客户端:我这边没有数据要发了。服务器:我知道了。服务器:我这边也没有数据要发了。客户端:我知道了,连接关闭。对应到 TCP 报文:
客户端 服务器 | -------- FIN ----------> | | <-------- ACK ---------- | | <-------- FIN ---------- | | -------- ACK ----------> | | | | TCP 连接关闭 |其中:
FIN:表示一方准备关闭发送方向ACK:表示确认收到2. 为什么建立连接是三次,关闭连接是四次?
建立连接时,服务器可以把两个动作合并:
确认客户端请求自己也同意建立连接所以第二步可以是:
SYN + ACK但关闭连接时不一样。
客户端说“我没有数据要发了”,不代表服务器也马上没有数据要发。服务器可能还要继续返回剩余数据。
因此关闭连接通常需要分成两组动作:
客户端关闭自己的发送方向服务器确认
服务器关闭自己的发送方向客户端确认这就是四次挥手的原因。
八、把整条链路合起来看
现在可以把一次 HTTPS 访问完整串起来。
1. 完整流程
1. 浏览器解析 URL 确定协议、域名、端口、路径
2. DNS 解析 把域名转换成 IP 地址
3. 建立 TCP 连接 通过三次握手确认双方收发能力
4. 建立 TLS 加密通道 验证证书,协商密钥,加密通信
5. 浏览器生成 HTTP 请求 请求某个网页资源
6. 数据层层封装 HTTP → TLS → TCP → IP → 链路层
7. 数据经过网络转发 从本机到路由器,再经过运营商和骨干网络
8. 服务器收到并解封装 链路层 → IP → TCP → TLS → HTTP
9. 服务器生成 HTTP 响应 返回网页、图片、脚本等内容
10. 响应数据返回浏览器 浏览器解密、解析、渲染页面
11. TCP 连接关闭 通过四次挥手释放连接2. 协议之间的分工
| 协议 / 机制 | 主要作用 | 解决的问题 |
|---|---|---|
| DNS | 域名解析 | 服务器 IP 是什么 |
| HTTP | 请求和响应 | 要什么资源,返回什么内容 |
| TLS / HTTPS | 加密和认证 | 数据是否安全,对方是否可信 |
| TCP | 可靠传输 | 数据是否完整、有序、可重传 |
| IP | 网络寻址 | 数据要送到哪台主机 |
| 以太网 / Wi-Fi | 局域网传输 | 下一跳怎么发出去 |
| ARP | 地址解析 | 局域网中 IP 对应哪个 MAC |
| NAT | 地址转换 | 内网设备如何共用公网出口 |
| 防火墙 | 流量控制 | 哪些连接允许通过 |
3. 用一句话记住协议栈
可以这样记:
HTTP 负责内容TLS 负责安全TCP 负责可靠IP 负责寻址链路层负责相邻设备之间的实际传输九、再进一步:HTTP/1.1、HTTP/2 和 HTTP/3 的差异
前面讲的是典型 HTTPS 访问流程。现代 Web 还涉及不同版本的 HTTP。
1. HTTP/1.1:一个经典的 TCP 上层协议
HTTP/1.1 通常运行在 TCP 之上。
它支持长连接,也就是说,一个 TCP 连接可以复用来发送多个 HTTP 请求,而不是每请求一个资源就重新建立连接。
但 HTTP/1.1 的效率仍然有限。
如果多个请求排队处理,前面的响应慢,后面的响应也容易被影响。
这类问题通常被称为队头阻塞。
2. HTTP/2:在一个 TCP 连接里多路复用
HTTP/2 仍然主要运行在 TCP 之上,但它引入了多路复用。
也就是说,一个 TCP 连接里可以同时传输多个请求和响应。
一个 TCP 连接├── 请求 A / 响应 A├── 请求 B / 响应 B├── 请求 C / 响应 C└── 请求 D / 响应 D这比 HTTP/1.1 更高效,尤其适合现代网页同时加载大量资源的情况。
不过,HTTP/2 底层仍然依赖 TCP。如果 TCP 层出现丢包,整个连接的数据交付仍可能受到影响。
3. HTTP/3:基于 QUIC 和 UDP
HTTP/3 的变化更大。
它不再直接基于 TCP,而是运行在 QUIC 之上,而 QUIC 又基于 UDP。
结构可以表示为:
HTTP/3↓QUIC↓UDP↓IPUDP 本身不保证可靠,但 QUIC 在 UDP 之上实现了类似 TCP 的可靠传输、拥塞控制、连接管理和加密能力。
所以,HTTP/3 使用 UDP,并不意味着它“不可靠”,而是把很多原来由 TCP 和 TLS 完成的事情,放到了 QUIC 里重新实现。
十、总结:从“数据怎么走”理解网络协议
计算机网络不是一堆孤立概念,而是一条完整的数据传输链路。
当你访问一个 HTTPS 网站时,背后发生的是:
DNS 先帮你找到服务器 IPTCP 帮你建立可靠连接TLS 帮你建立加密通道HTTP 表达你要请求什么资源IP 帮数据包找到目标主机链路层负责把数据发给下一跳路由器让数据一跳一跳穿过互联网服务器处理请求后再按相反方向返回最后 TCP 通过四次挥手关闭连接理解这条链路后,很多网络概念就会自然归位:
IP 不是负责可靠传输的,它负责寻址。TCP 不是负责网页内容的,它负责可靠传输。HTTP 不是负责加密的,它负责请求和响应。HTTPS 的安全性来自 TLS。DNS 不是传网页的,它只是帮你找到服务器地址。MAC 地址不是公网寻址用的,它主要用于局域网内下一跳传输。所以,学习计算机网络最重要的不是死记协议名称,而是始终围绕一个问题:
数据从哪里来,要到哪里去,中间经过哪些层,每一层解决什么问题?
抓住这条主线,HTTP/HTTPS、TCP/IP 四层模型、三次握手、四次挥手、DNS、路由、NAT、防火墙等知识,就会从零散术语变成一个有条理的整体。
