Files
test-repo/docs/zh-cn/appendix/computer-networks.md
T

618 lines
15 KiB
Markdown
Raw Normal View History

2026-01-15 20:10:19 +08:00
# 计算机网络
> 💡 **学习指南**:计算机网络是现代技术的基础设施。本章节通过可视化演示和实战案例,带你从五层模型到实际应用,全面理解网络通信原理、协议分析和故障排查。
## 0. 五层模型总览
现代计算机网络采用五层分层模型,每层负责不同的功能:
<NetworkLayers />
**为什么需要分层?**
- 🎯 **模块化**:每层独立设计和实现
- 🔧 **易维护**:修改一层不影响其他层
- 📚 **标准化**:统一的接口和协议
- 🔄 **可扩展**:新技术可以替换某一层
## 1. 物理层 (Physical Layer)
### 1.1 基本概念
物理层负责在物理介质上传输原始的比特流(0 和 1)。
**关键任务**
- 定义物理设备标准(RJ45、光纤接口等)
- 规定传输介质(双绞线、光纤、无线电波)
- 确定电气特性(电压、频率、编码方式)
### 1.2 传输介质
**有线介质**
- 双绞线(Twisted Pair):Cat5、Cat6,用于以太网
- 光纤(Fiber Optic):长距离、高带宽
- 同轴电缆(Coaxial):早期以太网、有线电视
**无线介质**
- 无线电波(Wi-Fi、蓝牙、4G/5G
- 微波(卫星通信)
- 红外线(短距离通信)
### 1.3 常见设备
- **中继器 (Repeater)**:放大信号,延长传输距离
- **集线器 (Hub)**:多端口中继器(已被交换机取代)
## 2. 数据链路层 (Data Link Layer)
### 2.1 基本概念
数据链路层负责在直连的两个节点间传输数据帧。
**核心功能**
- 物理地址寻址(MAC 地址)
- 帧的封装和解封装
- 错误检测(CRC 校验)
- 介质访问控制(MAC
### 2.2 MAC 地址
**MAC 地址格式**`00:1A:2B:3C:4D:5E`
- 前 24 位:厂商标识(OUI
- 后 24 位:设备序列号
- 全球唯一,烧录在网卡上
**查看 MAC 地址**
```bash
# Windows
ipconfig /all
# macOS/Linux
ifconfig
```
### 2.3 以太网帧结构
```
+------------+----------+---------+-----+----------+
| 目标 MAC | 源 MAC | 类型 | 数据 | FCS |
| (6 bytes) | (6 bytes)| (2 bytes)| | (4 bytes)|
+------------+----------+---------+-----+----------+
```
**常见以太网类型**
- `0x0800`IPv4
- `0x0806`ARP
- `0x86DD`IPv6
### 2.4 交换机原理
**交换机工作方式**
1. **学习 MAC 地址**:记录端口与 MAC 的对应关系
2. **转发帧**:根据目标 MAC 地址选择端口
3. **过滤广播**:不会转发到所有端口(集线器会)
**查看交换机 MAC 表**
```bash
show mac address-table # 思科设备
```
## 3. 网络层 (Network Layer)
### 3.1 IP 地址
**IPv4 地址格式**`192.168.1.1`
- 32 位,通常用点分十进制表示
- 分为网络部分和主机部分
**IP 地址分类**
| 类别 | 范围 | 网络数 | 主机数 | 用途 |
|------|------|--------|--------|------|
| A 类 | 1.0.0.0 - 126.255.255.255 | 126 | 16M | 大型网络 |
| B 类 | 128.0.0.0 - 191.255.255.255 | 16K | 65K | 中型网络 |
| C 类 | 192.0.0.0 - 223.255.255.255 | 2M | 254 | 小型网络 |
**私有 IP 地址**
- A 类:`10.0.0.0 - 10.255.255.255`
- B 类:`172.16.0.0 - 172.31.255.255`
- C 类:`192.168.0.0 - 192.168.255.255`
### 3.2 子网划分
<SubnetCalculator />
**子网掩码的作用**
- 区分 IP 地址的网络部分和主机部分
- 确定两个 IP 是否在同一网段
- 计算网络地址和广播地址
**CIDR 表示法**`192.168.1.0/24`
- `/24` 表示前 24 位是网络位
- 剩余 8 位是主机位
**子网划分示例**
```
原网络:192.168.1.0/24
可用主机:192.168.1.1 - 192.168.1.254 (254 台)
划分为 /26 子网:
- 子网 1192.168.1.0/26 (192.168.1.1 - 192.168.1.6262 台)
- 子网 2192.168.1.64/26 (192.168.1.65 - 192.168.1.12662 台)
- 子网 3192.168.1.128/26 (192.168.1.129 - 192.168.1.19062 台)
- 子网 4192.168.1.192/26 (192.168.1.193 - 192.168.1.25462 台)
```
### 3.3 路由原理
**路由器工作流程**
1. 接收数据包
2. 检查目标 IP 地址
3. 查询路由表
4. 选择最佳路径
5. 转发到下一跳
**路由表示例**
```
目标网络 子网掩码 网关 接口
192.168.1.0 255.255.255.0 0.0.0.0 eth0
192.168.2.0 255.255.255.0 192.168.1.2 eth0
0.0.0.0 0.0.0.0 192.168.1.1 eth0 (默认网关)
```
**查看路由表**
```bash
# Windows
route print
# macOS/Linux
netstat -rn
```
### 3.4 ICMP 协议
**ICMP (Internet Control Message Protocol)** 用于网络诊断。
**常见 ICMP 类型**
- Echo Request (Type 8)ping 请求
- Echo Reply (Type 0)ping 响应
- Destination Unreachable (Type 3):目标不可达
**Ping 命令**
```bash
ping google.com
# 输出示例
PING google.com (142.250.185.238): 56 data bytes
64 bytes from 142.250.185.238: icmp_seq=0 ttl=117 time=12.4 ms
64 bytes from 142.250.185.238: icmp_seq=1 ttl=117 time=11.8 ms
```
## 4. 传输层 (Transport Layer)
### 4.1 端口
**端口号范围**
- **0-1023**:系统端口(需要管理员权限)
- **1024-49151**:注册端口
- **49152-65535**:动态端口
**常见端口**
- `21`FTP
- `22`SSH
- `80`HTTP
- `443`HTTPS
- `3306`MySQL
- `5432`PostgreSQL
- `27017`MongoDB
**查看端口占用**
```bash
# macOS/Linux
lsof -i :8080
# Windows
netstat -ano | findstr :8080
```
### 4.2 TCP vs UDP
<TcpUdpComparison />
**选择建议**
- 📧 **邮件、文件传输**:用 TCP(不能丢数据)
- 📺 **视频、直播**:用 UDP(实时性优先)
- 🌐 **网页浏览**:用 TCP(可靠性重要)
- 🎮 **在线游戏**:用 UDP(速度优先)
### 4.3 TCP 三次握手
```
客户端 服务器
| |
| -------- SYN (seq=x) -----------> |
| (同步请求,x 是随机数) |
| |
| <------- SYN-ACK (seq=y, ack=x+1) -|
| (同步确认,y 是随机数,确认号=x+1)|
| |
| -------- ACK (ack=y+1) ----------> |
| (确认,确认号=y+1) |
| |
| 连接建立成功 |
```
**为什么需要三次?**
- 防止已失效的连接请求报文段突然又传送到了服务端
- 确认双方的发送和接收能力都正常
- 同步双方的初始序列号
### 4.4 TCP 四次挥手
```
客户端 服务器
| |
| -------- FIN (seq=u) -----------> |
| (请求关闭连接) |
| |
| <------- ACK (ack=u+1) ----------- |
| (确认收到关闭请求) |
| |
| <------- FIN (seq=w) --------------|
| (服务器也可以关闭连接) |
| |
| -------- ACK (ack=w+1) ----------> |
| (确认服务器关闭) |
| |
| 连接完全关闭 |
```
**为什么需要四次?**
- TCP 是全双工协议,双方都可以发送数据
- 当一方关闭连接时,另一方可能还有数据要发送
- 需要双方分别确认关闭各自方向的连接
## 5. 应用层 (Application Layer)
### 5.1 HTTP/HTTPS
**HTTP (HyperText Transfer Protocol)** 超文本传输协议。
**HTTP 请求方法**
| 方法 | 描述 | 示例 |
|------|------|------|
| GET | 获取资源 | 查看网页 |
| POST | 提交数据 | 表单提交 |
| PUT | 更新资源 | 更新用户信息 |
| DELETE | 删除资源 | 删除文章 |
| PATCH | 部分更新 | 修改状态 |
**HTTP 状态码**
```
2xx 成功
- 200 OK:请求成功
- 201 Created:资源创建成功
3xx 重定向
- 301 Moved Permanently:永久重定向
- 302 Found:临时重定向
4xx 客户端错误
- 400 Bad Request:请求错误
- 401 Unauthorized:未授权
- 403 Forbidden:禁止访问
- 404 Not Found:资源不存在
5xx 服务器错误
- 500 Internal Server Error:服务器内部错误
- 502 Bad Gateway:网关错误
- 503 Service Unavailable:服务不可用
```
**HTTPS vs HTTP**
| 特性 | HTTP | HTTPS |
|------|------|-------|
| 加密 | 否 | 是(TLS/SSL |
| 端口 | 80 | 443 |
| 安全性 | 低(明文传输) | 高(加密传输) |
| 性能 | 略快 | 略慢(握手开销) |
| SEO | 不友好 | 友好 |
**HTTPS 工作流程**
```
客户端 服务器
| |
| -------- Client Hello ---------> |
| (支持的加密算法、随机数) |
| |
| <------- Server Header --------- |
| (服务器证书、随机数、选择的加密方法) |
| |
| 验证证书 |
| 生成会话密钥 |
| |
| -------- 用公钥加密会话密钥 ------> |
| |
| <------- 加密通信开始 ------------ |
| (用会话密钥加密所有数据) |
```
### 5.2 DNS
**DNS (Domain Name System)** 域名系统,将域名转换为 IP 地址。
**DNS 查询过程**
```
用户查询 google.com
浏览器缓存(最近查询)
↓ 未命中
系统缓存(/etc/hosts
↓ 未命中
路由器缓存
↓ 未命中
ISP DNS 服务器
↓ 未命中
根域名服务器(.
↓ 指向 .com 服务器
顶级域名服务器(.com
↓ 指向 google.com 服务器
权威 DNS 服务器
↓ 返回 IP 地址
```
**DNS 记录类型**
| 类型 | 用途 | 示例 |
|------|------|------|
| A | IPv4 地址 | `www.example.com → 93.184.216.34` |
| AAAA | IPv6 地址 | `www.example.com → 2606:2800:220:1:248:1893:25c8:1946` |
| CNAME | 别名 | `www.example.com → example.com` |
| MX | 邮件服务器 | `mail.example.com` |
| TXT | 文本记录 | SPF、DKIM 验证 |
**查看 DNS 记录**
```bash
nslookup google.com
dig google.com ANY
```
### 5.3 常见应用协议
**FTP (File Transfer Protocol)**:文件传输
- 端口:21(控制)、20(数据)
- 主动模式 vs 被动模式
**SSH (Secure Shell)**:远程登录
- 端口:22
- 加密通信
**SMTP (Simple Mail Transfer Protocol)**:发送邮件
- 端口:25
- 端口:465SSL)、587TLS
**POP3/IMAP**:接收邮件
- POP3:端口 110,下载到本地
- IMAP:端口 143,服务器同步
## 6. 浏览器请求全过程
### 6.1 完整流程
```
1. URL 解析
- 解析协议、域名、端口、路径
- 编码特殊字符
2. DNS 查询
- 查找域名对应的 IP 地址
3. TCP 连接
- 三次握手建立连接
4. TLS 握手(HTTPS
- 协商加密参数
5. 发送 HTTP 请求
GET /page HTTP/1.1
Host: www.example.com
6. 服务器处理
- 路由匹配
- 业务逻辑
- 生成响应
7. 接收 HTTP 响应
HTTP/1.1 200 OK
Content-Type: text/html
8. 解析 HTML
- 构建 DOM 树
9. 下载资源
- CSS、JS、图片等
10. 渲染页面
- 构建渲染树
- 布局、绘制
```
### 6.2 抓包实战
**使用浏览器 DevTools**
1. 打开开发者工具(F12
2. 切换到 Network 标签
3. 刷新页面或发起请求
4. 查看请求详情
**关键信息**
- **Request Headers**:请求头信息
- **Response Headers**:响应头信息
- **Status**:状态码
- **Size**:资源大小
- **Time**:请求耗时
- **Waterfall**:瀑布图,显示时间线
**使用 Wireshark**
1. 下载安装 Wireshark
2. 选择网络接口
3. 开始抓包
4. 过滤器:`http && ip.addr == 93.184.216.34`
5. 分析 HTTP 报文
**常用过滤器**
```
http # 只显示 HTTP 协议
ip.addr == 8.8.8.8 # 只显示与 8.8.8.8 的通信
tcp.port == 80 # 只显示 80 端口的流量
dns # 只显示 DNS 查询
```
## 7. 网络故障排查
<NetworkTroubleshooting />
### 7.1 诊断命令
**基础命令**
```bash
# 测试连通性
ping google.com
# 追踪路由
traceroute google.com
# 查看网络配置
ifconfig
ip addr show
# 查看 DNS 配置
cat /etc/resolv.conf
# 查看路由表
netstat -rn
```
**高级命令**
```bash
# 查看端口占用
lsof -i :8080
# 查看网络连接
netstat -an
# 抓包分析
tcpdump -i eth0 -w capture.pcap
# 测试带宽
speedtest-cli
```
### 7.2 常见问题
**问题 1:无法上网**
1. `ping 8.8.8.8` 测试基本连通性
2. `ping google.com` 测试 DNS 解析
3. 检查网关配置
4. 清除 DNS 缓存
**问题 2:网速慢**
1. `speedtest-cli` 测试实际带宽
2. 检查后台下载应用
3. 重启路由器
4. 更换 DNS 服务器
**问题 3:延迟高**
1. `ping -c 100` 统计平均延迟
2. `traceroute` 找出高延迟路由
3. 检查本地网络负载
4. 使用有线连接测试
**问题 4:端口无法访问**
1. `netstat -tuln | grep :80` 检查服务监听
2. 检查防火墙规则
3. `iptables -L` 查看防火墙
4. 测试本地访问:`curl http://localhost`
## 8. 网络安全基础
### 8.1 常见攻击
**DDoS 攻击**
- 分布式拒绝服务
- 大量请求耗尽服务器资源
- 防御:CDN、流量清洗
**中间人攻击**
- 拦截通信数据
- 防御:使用 HTTPS、验证证书
**SQL 注入**
- 通过输入框注入恶意 SQL
- 防御:参数化查询、输入验证
**XSS 攻击**
- 跨站脚本攻击
- 防御:输出编码、CSP 策略
### 8.2 安全实践
**HTTPS 强制**
```
# Nginx 配置
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}
```
**防火墙配置**
```bash
# 允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 拒绝其他连接
iptables -A INPUT -j DROP
```
## 9. 总结
计算机网络核心要点:
- 📚 **分层模型**:理解五层模型,每层职责清晰
- 🌐 **IP 地址**:掌握子网划分、路由原理
- 🔄 **TCP/UDP**:理解可靠传输 vs 快速传输
- 🔐 **HTTP/HTTPS**Web 应用的基础协议
- 🛠️ **故障排查**:从物理层到应用层逐层排查
**学习建议**
- ✅ 多动手实践:使用 ping、traceroute、wireshark
- ✅ 理解协议细节:阅读 RFC 文档
- ✅ 抓包分析:用 Wireshark 观察实际流量
- ✅ 排查问题:系统化地诊断网络故障
- ✅ 关注安全:了解常见攻击和防御方法
掌握计算机网络,你就能理解互联网的运作原理,写出更高效的网络应用!