4886 字
24 分钟
计算机网络中的数据是如何传输的

一、从一个问题开始:打开网页时发生了什么?#

当你在浏览器里输入:

https://www.example.com

然后按下回车,表面上只是“打开一个网页”,但从网络角度看,这是一次完整的数据传输过程。

浏览器需要把一个请求发送到远方的服务器,服务器再把网页数据返回给浏览器。这个过程并不是某一个协议独立完成的,而是多个协议分工协作的结果。

可以先用一句话概括:

HTTP 决定“传什么”,TLS 决定“怎么加密”,TCP 决定“如何可靠传输”,IP 决定“往哪里传”,以太网或 Wi-Fi 决定“下一跳怎么发出去”。

一次网页访问,大致可以分成几个阶段:

输入网址
↓
解析域名,找到服务器 IP
↓
建立 TCP 连接
↓
建立 HTTPS 加密通道
↓
发送 HTTP 请求
↓
数据经过 TCP/IP 协议栈传输
↓
服务器处理请求并返回响应
↓
浏览器接收、解密、解析并渲染网页
↓
连接关闭

这条线索,就是理解计算机网络的主线。


二、发送之前:浏览器要先知道数据发给谁#

在网络中,数据不能只靠域名传输。人类习惯记住域名,例如:

www.example.com
github.com
baidu.com

但计算机真正通信时,需要的是 IP 地址。

所以浏览器首先要解决的问题是:

这个域名对应哪台服务器?

1. URL 里包含哪些信息?#

以这个地址为例:

https://www.example.com/index.html

它可以拆成几部分:

https 协议
www.example.com 域名
/index.html 资源路径

如果没有显式写端口,浏览器会根据协议自动选择默认端口:

HTTP 默认端口 80
HTTPS 默认端口 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.34

DNS 查询通常会经历缓存和递归查询过程。简化来看:

浏览器缓存
↓
操作系统缓存
↓
本地 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-Fi

HTTP 关心的是“请求什么资源、返回什么内容”。

TCP 关心的是:

数据有没有到达
数据有没有丢失
数据顺序是否正确
接收方是否来得及处理
网络是否拥塞

换句话说,TCP 不理解网页内容,但它负责把上层交给它的数据可靠地送到对方进程。

2. 三次握手:连接是怎么建立的#

TCP 建立连接的过程叫三次握手。

可以先用生活化语言理解:

客户端:我想和你建立连接。
服务器:我收到了,我也同意建立连接。
客户端:好的,我也收到了,我们开始通信。

对应到 TCP 报文,就是:

客户端 服务器
| -------- SYN ----------> |
| <----- SYN + ACK -------- |
| -------- ACK ----------> |
| |
| TCP 连接建立 |

其中:

SYN:请求建立连接
ACK:确认收到

三次握手的目的不是“走形式”,而是确认双方都具备正常的发送和接收能力。

客户端需要确认:

我能发出去
我能收到服务器回复

服务器也需要确认:

我能收到客户端请求
客户端能收到我的回复

同时,双方还会同步初始序列号,为后续可靠传输做准备。

3. TCP 如何做到可靠?#

TCP 的可靠性主要依靠几个机制。

序列号#

TCP 会给数据编号。

如果一段 HTTP 数据被拆成多个 TCP 报文段,接收方可以根据序列号重新排序。

TCP 段 1
TCP 段 2
TCP 段 3
TCP 段 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.1
Host: www.example.com

经过 TLS 后,中间网络设备看到的不是明文请求,而是一段加密数据。


五、真正传输:数据如何穿过 TCP/IP 协议栈#

现在浏览器已经准备好 HTTP 请求,并且 HTTPS 加密通道也建立完成。接下来,数据要真正从你的电脑发送出去。

这个过程的核心是:

数据从应用层开始,一层层向下封装;到达对方后,再一层层向上解封装。

1. 封装:数据从上往下加“包装”#

以 HTTPS 请求为例,数据在发送时会经历这样的过程:

HTTP 请求
↓
TLS 加密
↓
TCP 封装
↓
IP 封装
↓
以太网 / Wi-Fi 封装
↓
通过网卡发送出去

可以更形象地理解:

HTTP 数据:我要访问 /index.html
TLS:把内容加密
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.34

IP 层不关心端口,也不关心 HTTP 内容。它只关心:

这个数据包应该送到哪台主机。

如果目标 IP 不在本地局域网,电脑就会把数据交给默认网关,也就是路由器。

4. 链路层:确定下一跳怎么走#

IP 地址负责最终目的地,但数据每次只能发给“下一跳”。

在局域网中,真正用来投递数据帧的是 MAC 地址。

这里有一个重要区别:

目标 IP:最终要到达的服务器
目标 MAC:当前这一跳要交给的设备

比如你的电脑访问远程服务器时:

目标 IP:远程服务器 IP
目标 MAC:家用路由器的 MAC 地址

也就是说,你的电脑并不会直接把数据帧发到远程服务器的 MAC 地址,而是先发给路由器。

之后每经过一个路由器,链路层地址都会变化,但 IP 层的目标地址通常保持指向最终服务器。

5. 路由:数据包一跳一跳前进#

你的电脑通常只知道一件事:

如果目标不在本地网络,就交给默认网关。

然后路由器继续根据路由表判断下一跳。

整个过程类似:

你的电脑
↓
家用路由器
↓
运营商网络
↓
骨干网络
↓
服务器所在机房网络
↓
目标服务器

每经过一个路由器,就叫一跳。

你使用下面的命令看到的路径,就是这些中间跳点:

Terminal window
traceroute example.com

或者:

Terminal window
mtr example.com

六、服务器收到数据后:解封装与响应返回#

数据到达服务器后,过程会反过来。

发送时是层层封装,接收时就是层层解封装。

1. 服务器如何拆开数据?#

服务器网卡收到数据帧后,会按照协议栈逐层处理:

以太网 / Wi-Fi 帧
↓
取出 IP 数据包
↓
取出 TCP 报文段
↓
交给对应端口的服务
↓
TLS 解密
↓
得到 HTTP 请求

最终,Web 服务器看到的是类似这样的 HTTP 请求:

GET /index.html HTTP/1.1
Host: www.example.com

然后服务器根据请求路径、请求方法、请求头等信息进行处理。

2. HTTP 响应是什么样的?#

服务器处理完成后,会返回 HTTP 响应。

例如:

HTTP/1.1 200 OK
Content-Type: text/html
Content-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
↓
IP

UDP 本身不保证可靠,但 QUIC 在 UDP 之上实现了类似 TCP 的可靠传输、拥塞控制、连接管理和加密能力。

所以,HTTP/3 使用 UDP,并不意味着它“不可靠”,而是把很多原来由 TCP 和 TLS 完成的事情,放到了 QUIC 里重新实现。


十、总结:从“数据怎么走”理解网络协议#

计算机网络不是一堆孤立概念,而是一条完整的数据传输链路。

当你访问一个 HTTPS 网站时,背后发生的是:

DNS 先帮你找到服务器 IP
TCP 帮你建立可靠连接
TLS 帮你建立加密通道
HTTP 表达你要请求什么资源
IP 帮数据包找到目标主机
链路层负责把数据发给下一跳
路由器让数据一跳一跳穿过互联网
服务器处理请求后再按相反方向返回
最后 TCP 通过四次挥手关闭连接

理解这条链路后,很多网络概念就会自然归位:

IP 不是负责可靠传输的,它负责寻址。
TCP 不是负责网页内容的,它负责可靠传输。
HTTP 不是负责加密的,它负责请求和响应。
HTTPS 的安全性来自 TLS。
DNS 不是传网页的,它只是帮你找到服务器地址。
MAC 地址不是公网寻址用的,它主要用于局域网内下一跳传输。

所以,学习计算机网络最重要的不是死记协议名称,而是始终围绕一个问题:

数据从哪里来,要到哪里去,中间经过哪些层,每一层解决什么问题?

抓住这条主线,HTTP/HTTPS、TCP/IP 四层模型、三次握手、四次挥手、DNS、路由、NAT、防火墙等知识,就会从零散术语变成一个有条理的整体。

计算机网络中的数据是如何传输的
https://karx.cn/posts/network-introduction/
作者
karx
发布于
2026-06-05
许可协议
CC BY-NC-SA 4.0