618 lines
15 KiB
Markdown
618 lines
15 KiB
Markdown
# 计算机网络
|
||
|
||
> 💡 **学习指南**:计算机网络是现代技术的基础设施。本章节通过可视化演示和实战案例,带你从五层模型到实际应用,全面理解网络通信原理、协议分析和故障排查。
|
||
|
||
## 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 子网:
|
||
- 子网 1:192.168.1.0/26 (192.168.1.1 - 192.168.1.62,62 台)
|
||
- 子网 2:192.168.1.64/26 (192.168.1.65 - 192.168.1.126,62 台)
|
||
- 子网 3:192.168.1.128/26 (192.168.1.129 - 192.168.1.190,62 台)
|
||
- 子网 4:192.168.1.192/26 (192.168.1.193 - 192.168.1.254,62 台)
|
||
```
|
||
|
||
### 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
|
||
- 端口:465(SSL)、587(TLS)
|
||
|
||
**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 观察实际流量
|
||
- ✅ 排查问题:系统化地诊断网络故障
|
||
- ✅ 关注安全:了解常见攻击和防御方法
|
||
|
||
掌握计算机网络,你就能理解互联网的运作原理,写出更高效的网络应用!
|