# 计算机网络 > 💡 **学习指南**:计算机网络是现代技术的基础设施。本章节通过可视化演示和实战案例,带你从五层模型到实际应用,全面理解网络通信原理、协议分析和故障排查。 ## 0. 五层模型总览 现代计算机网络采用五层分层模型,每层负责不同的功能: **为什么需要分层?** - 🎯 **模块化**:每层独立设计和实现 - 🔧 **易维护**:修改一层不影响其他层 - 📚 **标准化**:统一的接口和协议 - 🔄 **可扩展**:新技术可以替换某一层 ## 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 子网划分 **子网掩码的作用**: - 区分 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 **选择建议**: - 📧 **邮件、文件传输**:用 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. 网络故障排查 ### 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 观察实际流量 - ✅ 排查问题:系统化地诊断网络故障 - ✅ 关注安全:了解常见攻击和防御方法 掌握计算机网络,你就能理解互联网的运作原理,写出更高效的网络应用!