计算机网络的本质,是让不同设备在遵守同一套规则的前提下交换数据。我们平时访问网页、刷视频、发送消息、远程登录服务器、调用接口,本质上都是数据在网络中被拆分、封装、传输、转发、重组和解析的过程。
这篇文章会从整体视角介绍计算机网络的核心知识,包括网络分层、IP、TCP、UDP、DNS、HTTP、HTTPS、常见网络设备以及排查思路。
1. 为什么需要计算机网络
如果两台计算机彼此独立,它们只能处理本地数据。网络的出现,使计算机之间可以共享资源、传递消息和协同工作。
常见场景包括:
- 浏览器访问网站
- 手机 App 调用后端接口
- 服务之间通过 RPC 或 HTTP 通信
- 数据库远程连接
- 文件上传下载
- 即时通信、视频会议、直播
- 云服务器、容器和微服务之间的通信
计算机网络解决的核心问题可以概括为:
- 如何找到目标机器
- 如何把数据发送过去
- 如何保证数据不乱、不丢、不重复
- 如何让不同程序识别彼此的数据格式
- 如何在不可信网络中保证安全
2. 网络分层模型
网络通信非常复杂,所以通常会采用"分层"的方式理解和设计。
经典模型有两个:
- OSI 七层模型
- TCP/IP 四层模型
2.1 OSI 七层模型
| 层级 | 名称 | 作用 | 常见协议或设备 |
|---|---|---|---|
| 第 7 层 | 应用层 | 面向应用程序,定义数据格式和交互规则 | HTTP、FTP、SMTP、DNS |
| 第 6 层 | 表示层 | 数据编码、压缩、加密 | TLS、JPEG、UTF-8 |
| 第 5 层 | 会话层 | 管理会话连接 | RPC 会话、登录状态 |
| 第 4 层 | 传输层 | 端到端传输,处理可靠性和端口 | TCP、UDP |
| 第 3 层 | 网络层 | IP 寻址和路由转发 | IP、ICMP、路由器 |
| 第 2 层 | 数据链路层 | 局域网内传输,MAC 地址寻址 | Ethernet、交换机 |
| 第 1 层 | 物理层 | 电信号、光信号、无线信号传输 | 网线、光纤、网卡 |
OSI 模型更偏理论,便于学习和定位问题。
2.2 TCP/IP 四层模型
实际工程中更常用 TCP/IP 模型。
| 层级 | 名称 | 对应 OSI | 常见协议 |
|---|---|---|---|
| 第 4 层 | 应用层 | 应用层、表示层、会话层 | HTTP、DNS、SMTP |
| 第 3 层 | 传输层 | 传输层 | TCP、UDP |
| 第 2 层 | 网络层 | 网络层 | IP、ICMP |
| 第 1 层 | 网络接口层 | 数据链路层、物理层 | Ethernet、Wi-Fi |
可以简单理解为:
- 应用层:数据要表达什么
- 传输层:数据如何送到对应进程
- 网络层:数据如何送到对应主机
- 网络接口层:数据如何在具体链路上传输
3. 数据是如何被发送出去的
假设你在浏览器访问:
text
https://example.com/index.html
大致过程如下:
- 浏览器解析 URL
- 通过 DNS 查询域名对应的 IP 地址
- 与目标服务器建立 TCP 连接
- 如果是 HTTPS,还要进行 TLS 握手
- 浏览器发送 HTTP 请求
- 服务器返回 HTTP 响应
- 浏览器解析 HTML、CSS、JavaScript 并渲染页面
- 连接复用或关闭
数据在发送时会被逐层封装:
text
应用层数据
↓ 加上 TCP 头
TCP 报文段
↓ 加上 IP 头
IP 数据包
↓ 加上以太网头和尾
以太网帧
↓ 转换成电信号、光信号或无线信号
物理传输
接收方则按相反方向逐层解封装。
4. IP 地址:网络中的主机标识
IP 地址用于标识网络中的一台主机。
常见的 IPv4 地址类似:
text
192.168.1.10
8.8.8.8
IPv4 地址由 32 位二进制组成,通常写成四段十进制数字。
4.1 公网 IP 和私网 IP
公网 IP 可以在互联网中直接路由,私网 IP 通常只在局域网内部使用。
常见私网地址范围:
| 私网地址段 | 示例 |
|---|---|
| 10.0.0.0/8 | 10.1.2.3 |
| 172.16.0.0/12 | 172.16.1.10 |
| 192.168.0.0/16 | 192.168.1.100 |
家用路由器、公司内网、容器网络中经常使用私网 IP。
4.2 子网掩码与网段
IP 地址通常会搭配子网掩码,用于判断两个地址是否在同一网段。
例如:
text
IP: 192.168.1.10
掩码: 255.255.255.0
CIDR: 192.168.1.10/24
/24 表示前 24 位是网络号,剩余 8 位是主机号。
同一网段中的机器可以直接通过二层网络通信;不同网段之间通信通常需要经过网关或路由器。
5. MAC 地址:局域网中的设备标识
IP 地址用于跨网络寻址,MAC 地址用于局域网内寻址。
MAC 地址通常长这样:
text
00:1A:2B:3C:4D:5E
当一台机器要在局域网内发送数据时,需要知道目标 IP 对应的 MAC 地址。这时会使用 ARP 协议。
5.1 ARP 的作用
ARP 用于根据 IP 地址查询 MAC 地址。
例如,主机 A 想找 192.168.1.20 的 MAC 地址,会在局域网广播:
text
谁是 192.168.1.20?请告诉 192.168.1.10
目标机器收到后回复自己的 MAC 地址。
6. TCP:可靠的传输协议
TCP 是面向连接、可靠、有序的传输协议。
它常用于:
- HTTP/HTTPS
- MySQL
- SSH
- SMTP
- FTP
TCP 主要解决:
- 数据是否送达
- 数据是否有序
- 数据是否重复
- 网络拥塞时如何控制发送速度
- 接收方处理不过来时如何进行流量控制
6.1 TCP 三次握手
TCP 通信前需要建立连接,这个过程叫三次握手。
服务端 客户端 服务端 客户端 #mermaid-svg-k1e1wEGYIJUsPSdw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-k1e1wEGYIJUsPSdw .error-icon{fill:#552222;}#mermaid-svg-k1e1wEGYIJUsPSdw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-k1e1wEGYIJUsPSdw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-k1e1wEGYIJUsPSdw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-k1e1wEGYIJUsPSdw .marker.cross{stroke:#333333;}#mermaid-svg-k1e1wEGYIJUsPSdw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-k1e1wEGYIJUsPSdw p{margin:0;}#mermaid-svg-k1e1wEGYIJUsPSdw .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-k1e1wEGYIJUsPSdw text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-k1e1wEGYIJUsPSdw .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-k1e1wEGYIJUsPSdw .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-k1e1wEGYIJUsPSdw #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-k1e1wEGYIJUsPSdw .sequenceNumber{fill:white;}#mermaid-svg-k1e1wEGYIJUsPSdw #sequencenumber{fill:#333;}#mermaid-svg-k1e1wEGYIJUsPSdw #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-k1e1wEGYIJUsPSdw .messageText{fill:#333;stroke:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-k1e1wEGYIJUsPSdw .labelText,#mermaid-svg-k1e1wEGYIJUsPSdw .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .loopText,#mermaid-svg-k1e1wEGYIJUsPSdw .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-k1e1wEGYIJUsPSdw .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-k1e1wEGYIJUsPSdw .noteText,#mermaid-svg-k1e1wEGYIJUsPSdw .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-k1e1wEGYIJUsPSdw .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-k1e1wEGYIJUsPSdw .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-k1e1wEGYIJUsPSdw .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-k1e1wEGYIJUsPSdw .actorPopupMenu{position:absolute;}#mermaid-svg-k1e1wEGYIJUsPSdw .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-k1e1wEGYIJUsPSdw .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-k1e1wEGYIJUsPSdw .actor-man circle,#mermaid-svg-k1e1wEGYIJUsPSdw line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-k1e1wEGYIJUsPSdw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SYNSYN + ACKACK
简单理解:
- 客户端:我想和你建立连接
- 服务端:可以,我也准备好了
- 客户端:确认,我们开始通信
三次握手的目的,是确认双方的发送和接收能力都正常。
6.2 TCP 四次挥手
连接关闭通常需要四次挥手。
服务端 客户端 服务端 客户端 #mermaid-svg-QVHFpsCLQFlp00eW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QVHFpsCLQFlp00eW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QVHFpsCLQFlp00eW .error-icon{fill:#552222;}#mermaid-svg-QVHFpsCLQFlp00eW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QVHFpsCLQFlp00eW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QVHFpsCLQFlp00eW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QVHFpsCLQFlp00eW .marker.cross{stroke:#333333;}#mermaid-svg-QVHFpsCLQFlp00eW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QVHFpsCLQFlp00eW p{margin:0;}#mermaid-svg-QVHFpsCLQFlp00eW .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-QVHFpsCLQFlp00eW text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-QVHFpsCLQFlp00eW .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-QVHFpsCLQFlp00eW .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-QVHFpsCLQFlp00eW .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-QVHFpsCLQFlp00eW .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-QVHFpsCLQFlp00eW #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-QVHFpsCLQFlp00eW .sequenceNumber{fill:white;}#mermaid-svg-QVHFpsCLQFlp00eW #sequencenumber{fill:#333;}#mermaid-svg-QVHFpsCLQFlp00eW #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-QVHFpsCLQFlp00eW .messageText{fill:#333;stroke:none;}#mermaid-svg-QVHFpsCLQFlp00eW .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-QVHFpsCLQFlp00eW .labelText,#mermaid-svg-QVHFpsCLQFlp00eW .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-QVHFpsCLQFlp00eW .loopText,#mermaid-svg-QVHFpsCLQFlp00eW .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-QVHFpsCLQFlp00eW .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-QVHFpsCLQFlp00eW .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-QVHFpsCLQFlp00eW .noteText,#mermaid-svg-QVHFpsCLQFlp00eW .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-QVHFpsCLQFlp00eW .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-QVHFpsCLQFlp00eW .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-QVHFpsCLQFlp00eW .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-QVHFpsCLQFlp00eW .actorPopupMenu{position:absolute;}#mermaid-svg-QVHFpsCLQFlp00eW .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-QVHFpsCLQFlp00eW .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-QVHFpsCLQFlp00eW .actor-man circle,#mermaid-svg-QVHFpsCLQFlp00eW line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-QVHFpsCLQFlp00eW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} FINACKFINACK
因为 TCP 是全双工通信,双方都可以独立发送和关闭自己的数据流,所以关闭连接通常比建立连接多一步。
6.3 TCP 为什么可靠
TCP 的可靠性主要来自这些机制:
- 序列号:标记数据顺序
- 确认应答:接收方告诉发送方哪些数据收到了
- 超时重传:超过时间未确认则重发
- 滑动窗口:提升传输效率
- 流量控制:避免接收方被压垮
- 拥塞控制:避免网络被打满
7. UDP:更轻量的传输协议
UDP 是无连接、不保证可靠、不保证顺序的传输协议。
它的特点是:
- 开销小
- 延迟低
- 不需要建立连接
- 不负责重传和排序
常见使用场景:
- DNS 查询
- 视频直播
- 语音通话
- 在线游戏
- QUIC/HTTP/3 底层传输
UDP 并不是"不好",而是把可靠性控制交给了应用层。对于实时音视频来说,偶尔丢一两个包可能比等待重传更可接受。
8. TCP 和 UDP 对比
| 对比项 | TCP | UDP |
|---|---|---|
| 是否连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不保证可靠 |
| 顺序 | 保证顺序 | 不保证顺序 |
| 速度 | 相对较慢 | 相对较快 |
| 开销 | 较大 | 较小 |
| 典型场景 | 网页、数据库、SSH | DNS、直播、游戏、语音 |
选择 TCP 还是 UDP,本质取决于业务更看重可靠性还是实时性。
9. DNS:把域名转换成 IP
人更容易记住域名,计算机通信需要 IP 地址,所以需要 DNS。
例如:
text
www.example.com -> 93.184.216.34
DNS 查询大致过程:
- 查浏览器缓存
- 查操作系统缓存
- 查本地 hosts 文件
- 请求本地 DNS 服务器
- 递归查询根域名服务器、顶级域名服务器、权威域名服务器
- 返回最终 IP 地址
DNS 常见记录类型:
| 类型 | 作用 |
|---|---|
| A | 域名指向 IPv4 地址 |
| AAAA | 域名指向 IPv6 地址 |
| CNAME | 域名别名 |
| MX | 邮件服务器 |
| TXT | 文本记录,常用于验证 |
| NS | 指定域名服务器 |
10. HTTP:应用层通信协议
HTTP 是浏览器和服务器之间最常见的应用层协议。
一个 HTTP 请求通常包含:
http
GET /index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
一个 HTTP 响应通常包含:
http
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
<html>
<body>Hello</body>
</html>
10.1 常见 HTTP 方法
| 方法 | 含义 |
|---|---|
| GET | 获取资源 |
| POST | 创建资源或提交数据 |
| PUT | 整体更新资源 |
| PATCH | 局部更新资源 |
| DELETE | 删除资源 |
| HEAD | 只获取响应头 |
| OPTIONS | 查询支持的方法或跨域预检 |
10.2 常见 HTTP 状态码
| 状态码 | 含义 |
|---|---|
| 200 | 请求成功 |
| 201 | 创建成功 |
| 301 | 永久重定向 |
| 302 | 临时重定向 |
| 400 | 请求参数错误 |
| 401 | 未认证 |
| 403 | 无权限 |
| 404 | 资源不存在 |
| 500 | 服务端内部错误 |
| 502 | 网关错误 |
| 503 | 服务不可用 |
| 504 | 网关超时 |
11. HTTPS:加密的 HTTP
HTTPS 可以理解为:
text
HTTPS = HTTP + TLS
HTTP 明文传输,容易被窃听、篡改或伪装。HTTPS 通过 TLS 提供:
- 加密:防止内容被窃听
- 完整性校验:防止内容被篡改
- 身份认证:确认访问的服务端是真的
HTTPS 握手中会涉及证书、非对称加密、对称加密和密钥协商。
简单理解:
- 浏览器连接服务器
- 服务器返回证书
- 浏览器验证证书是否合法
- 双方协商会话密钥
- 后续数据使用对称加密传输
12. 常见网络设备
12.1 交换机
交换机主要工作在数据链路层,用于连接同一局域网内的设备。
它根据 MAC 地址转发数据帧。
12.2 路由器
路由器主要工作在网络层,用于连接不同网络。
它根据 IP 地址和路由表决定数据包下一跳发往哪里。
12.3 网关
网关通常是当前网络访问其他网络的出口。
例如家用网络中,电脑的默认网关一般是路由器地址:
text
192.168.1.1
12.4 防火墙
防火墙用于控制流量是否允许通过。
它可以根据以下条件过滤流量:
- 源 IP
- 目标 IP
- 端口
- 协议
- 连接状态
- 应用层规则
12.5 负载均衡器
负载均衡器用于把请求分发到多台后端服务器。
常见作用:
- 提高系统吞吐
- 避免单点故障
- 做健康检查
- 支持灰度发布
- 终止 TLS
13. NAT:私网访问公网的关键
很多设备使用私网 IP,但私网 IP 不能直接在互联网中路由。NAT 用于把私网地址转换成公网地址。
家里多台设备访问互联网时,外部看到的通常是同一个公网 IP。路由器通过端口映射区分不同内部连接。
例如:
text
192.168.1.10:50001 -> 公网IP:30001
192.168.1.11:50002 -> 公网IP:30002
NAT 节省了 IPv4 地址,但也让外部主动访问内网设备变得更复杂。
14. 端口:定位具体进程
IP 地址定位主机,端口定位主机上的具体进程。
常见端口:
| 端口 | 协议 |
|---|---|
| 22 | SSH |
| 53 | DNS |
| 80 | HTTP |
| 443 | HTTPS |
| 3306 | MySQL |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 8080 | 常见 Web 服务端口 |
例如:
text
192.168.1.10:8080
表示访问 192.168.1.10 这台机器上的 8080 端口。
15. 一次网页访问的完整链路
下面用一次 HTTPS 网页访问串起来:
#mermaid-svg-4XMUGtEsKrXaZFVG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4XMUGtEsKrXaZFVG .error-icon{fill:#552222;}#mermaid-svg-4XMUGtEsKrXaZFVG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4XMUGtEsKrXaZFVG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4XMUGtEsKrXaZFVG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4XMUGtEsKrXaZFVG .marker.cross{stroke:#333333;}#mermaid-svg-4XMUGtEsKrXaZFVG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4XMUGtEsKrXaZFVG p{margin:0;}#mermaid-svg-4XMUGtEsKrXaZFVG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG .cluster-label text{fill:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG .cluster-label span{color:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG .cluster-label span p{background-color:transparent;}#mermaid-svg-4XMUGtEsKrXaZFVG .label text,#mermaid-svg-4XMUGtEsKrXaZFVG span{fill:#333;color:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG .node rect,#mermaid-svg-4XMUGtEsKrXaZFVG .node circle,#mermaid-svg-4XMUGtEsKrXaZFVG .node ellipse,#mermaid-svg-4XMUGtEsKrXaZFVG .node polygon,#mermaid-svg-4XMUGtEsKrXaZFVG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4XMUGtEsKrXaZFVG .rough-node .label text,#mermaid-svg-4XMUGtEsKrXaZFVG .node .label text,#mermaid-svg-4XMUGtEsKrXaZFVG .image-shape .label,#mermaid-svg-4XMUGtEsKrXaZFVG .icon-shape .label{text-anchor:middle;}#mermaid-svg-4XMUGtEsKrXaZFVG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4XMUGtEsKrXaZFVG .rough-node .label,#mermaid-svg-4XMUGtEsKrXaZFVG .node .label,#mermaid-svg-4XMUGtEsKrXaZFVG .image-shape .label,#mermaid-svg-4XMUGtEsKrXaZFVG .icon-shape .label{text-align:center;}#mermaid-svg-4XMUGtEsKrXaZFVG .node.clickable{cursor:pointer;}#mermaid-svg-4XMUGtEsKrXaZFVG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4XMUGtEsKrXaZFVG .arrowheadPath{fill:#333333;}#mermaid-svg-4XMUGtEsKrXaZFVG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4XMUGtEsKrXaZFVG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4XMUGtEsKrXaZFVG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4XMUGtEsKrXaZFVG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4XMUGtEsKrXaZFVG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4XMUGtEsKrXaZFVG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4XMUGtEsKrXaZFVG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4XMUGtEsKrXaZFVG .cluster text{fill:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG .cluster span{color:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4XMUGtEsKrXaZFVG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4XMUGtEsKrXaZFVG rect.text{fill:none;stroke-width:0;}#mermaid-svg-4XMUGtEsKrXaZFVG .icon-shape,#mermaid-svg-4XMUGtEsKrXaZFVG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4XMUGtEsKrXaZFVG .icon-shape p,#mermaid-svg-4XMUGtEsKrXaZFVG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4XMUGtEsKrXaZFVG .icon-shape .label rect,#mermaid-svg-4XMUGtEsKrXaZFVG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4XMUGtEsKrXaZFVG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4XMUGtEsKrXaZFVG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4XMUGtEsKrXaZFVG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入网址
DNS 解析域名
获得服务器 IP
建立 TCP 连接
TLS 握手
发送 HTTP 请求
服务器处理请求
返回 HTTP 响应
浏览器渲染页面
对应到底层网络,大致会经历:
- 浏览器生成 HTTP 请求
- TLS 对请求进行加密
- TCP 拆分数据并加上端口信息
- IP 层加上源 IP 和目标 IP
- 数据链路层加上 MAC 地址
- 数据通过网卡发出
- 中间经过交换机、路由器、防火墙、负载均衡器
- 服务端接收并逐层解析
- 服务端返回响应
- 客户端接收响应并展示页面
16. 常见网络问题与排查思路
网络问题通常可以从"分层"角度排查。
16.1 无法访问网站
可以按以下顺序检查:
- 本机网络是否正常
- DNS 是否解析成功
- 目标 IP 是否可达
- 目标端口是否开放
- 服务端程序是否正常
- 防火墙或安全组是否拦截
- HTTPS 证书是否异常
- 代理、VPN、网关是否影响链路
16.2 常见命令
查看本机 IP
Windows:
powershell
ipconfig
Linux/macOS:
bash
ifconfig
ip addr
测试连通性
bash
ping example.com
ping 使用 ICMP 协议,可以判断目标主机是否可达,但有些服务器会禁用 ICMP,所以 ping 不通不一定代表服务不可用。
查看路由路径
Windows:
powershell
tracert example.com
Linux/macOS:
bash
traceroute example.com
查询 DNS
bash
nslookup example.com
或:
bash
dig example.com
测试端口
Windows PowerShell:
powershell
Test-NetConnection example.com -Port 443
Linux/macOS:
bash
nc -vz example.com 443
查看 HTTP 响应
bash
curl -I https://example.com
17. 网络性能指标
常见网络性能指标包括:
| 指标 | 含义 |
|---|---|
| 带宽 | 单位时间内理论可传输的数据量 |
| 吞吐量 | 实际传输速度 |
| 延迟 | 数据从发送到接收所需时间 |
| 抖动 | 延迟的波动 |
| 丢包率 | 丢失数据包的比例 |
| 并发连接数 | 同时维持的连接数量 |
例如视频会议更关注低延迟和低抖动,文件下载更关注吞吐量,在线游戏更关注延迟和丢包。
18. HTTP/1.1、HTTP/2 与 HTTP/3
18.1 HTTP/1.1
HTTP/1.1 支持长连接,但多个请求之间仍然容易出现队头阻塞问题。
18.2 HTTP/2
HTTP/2 引入了多路复用、二进制帧、头部压缩等能力。
优势包括:
- 一个连接上并发多个请求
- 减少连接数量
- 降低头部开销
- 提升页面加载性能
18.3 HTTP/3
HTTP/3 基于 QUIC,而 QUIC 基于 UDP。
它的优势包括:
- 更快的连接建立
- 改善 TCP 层队头阻塞
- 更适合弱网和移动网络
- 连接迁移能力更好
19. 网络安全基础
网络安全不是单一技术,而是一套体系。
常见风险包括:
- 明文传输被窃听
- DNS 劫持
- 中间人攻击
- DDoS 攻击
- 端口暴露
- 弱口令
- 未授权访问
- API 参数篡改
常见防护手段:
- 使用 HTTPS
- 配置防火墙和安全组
- 最小化暴露端口
- 使用强密码和密钥认证
- 对接口做身份认证和权限控制
- 对请求参数做签名或校验
- 开启日志和监控
- 定期更新系统和依赖
20. 总结
计算机网络可以从四个核心层次理解:
- 应用层决定"传什么内容"
- 传输层决定"送到哪个进程,以及是否可靠"
- 网络层决定"送到哪台主机"
- 网络接口层决定"在具体链路上如何传输"
在实际工作中,理解网络分层非常重要。它不仅能帮助我们看懂 HTTP、TCP、DNS、NAT、HTTPS 等协议,也能帮助我们更快定位问题。
当遇到网络故障时,不要只看表面现象,可以按层排查:
text
应用是否正常
↓
端口是否可连
↓
DNS 是否正确
↓
IP 是否可达
↓
路由是否正常
↓
链路和设备是否正常
掌握计算机网络,不是为了背协议细节,而是为了理解数据从一个程序到另一个程序之间到底经历了什么。理解这条路径,很多看似复杂的问题都会变得清晰。