01 - 网络基础: OSI 模型与 TCP/IP 协议栈¶
本章核心: 理解网络通信的分层模型,掌握 TCP/IP 协议栈基础
📖 章节导航¶
前序章节: 无(本章为基础) 后续章节: 02-域名与 DNS.md → 03-服务器与 SSH.md 快速参考: 13-网络工具箱.md 第 1 章 故障排查: 11-故障排查手册.md 第 3 章
📚 引言:为什么需要理解网络分层模型¶
作为程序员,你可能每天都在使用网络:访问 API 、调用数据库、发送 HTTP 请求。但你是否想过:
- 为什么输入
www.google.com就能访问到网站? - 为什么有时候网络请求会超时?
- TCP 和 UDP 有什么区别?什么时候用哪个?
理解网络分层模型就像理解汽车引擎的构造一样,虽然开车不需要知道引擎原理,但作为工程师,理解底层机制能让你:
✅ 快速定位问题:网络连接失败时,知道从哪一层开始排查 ✅ 优化性能:理解 TCP 三次握手,就知道为什么连接池能提升性能 ✅ 安全防护:知道数据在哪一层加密,才能正确配置 HTTPS ✅ 架构设计:选择合适的协议( TCP vs UDP )来满足业务需求
🏗️ OSI 七层模型¶
OSI ( Open Systems Interconnection )模型是国际标准化组织提出的网络通信参考模型,它将网络通信分为 7 层,从下到上依次是:
┌─────────────────────────────────────────┐
│ 7. 应用层 (Application Layer) │ ← 用户直接交互的层(HTTP、FTP、SSH)
├─────────────────────────────────────────┤
│ 6. 表示层 (Presentation Layer) │ ← 数据格式化、加密解密
├─────────────────────────────────────────┤
│ 5. 会话层 (Session Layer) │ ← 建立、管理、终止会话
├─────────────────────────────────────────┤
│ 4. 传输层 (Transport Layer) │ ← 端到端通信(TCP、UDP)
├─────────────────────────────────────────┤
│ 3. 网络层 (Network Layer) │ ← 路由选择、IP地址
├─────────────────────────────────────────┤
│ 2. 数据链路层 (Data Link Layer) │ ← MAC地址、帧传输
├─────────────────────────────────────────┤
│ 1. 物理层 (Physical Layer) │ ← 传输介质(光纤、网线、无线电波)
└─────────────────────────────────────────┘
每层的详细功能¶
| 层级 | 名称 | 主要功能 | 常见协议 |
|---|---|---|---|
| 7 | 应用层 | 为应用程序提供网络服务接口 | HTTP 、 FTP 、 SMTP 、 DNS 、 SSH |
| 6 | 表示层 | 数据格式化、加密压缩、字符编码 | SSL/TLS 、 JPEG 、 MPEG |
| 5 | 会话层 | 建立、管理、终止会话连接 | RPC 、 NetBIOS |
| 4 | 传输层 | 端到端的数据传输、可靠性保证 | TCP 、 UDP |
| 3 | 网络层 | 路由选择、逻辑地址寻址 | IP 、 ICMP 、 IGMP |
| 2 | 数据链路层 | 帧同步、差错控制、 MAC 地址 | Ethernet 、 Wi-Fi 、 ARP ( IPv4 地址解析) |
| 1 | 物理层 | 比特流传输、物理接口规范 | RJ45 、光纤、无线电 |
补充: ARP 用于在同一二层网络内把 IPv4 地址解析为链路层地址,报文直接封装在链路层帧中,通常不被三层路由转发,因此常被视为数据链路层或“2.5 层”协议; IPv6 中对应功能由 NDP ( Neighbor Discovery Protocol )提供。
数据在各层的变化(封装与解封装)¶
当数据从发送方传输到接收方时,会经历封装和解封装过程:
发送方(封装过程):
┌─────────────────────────────────────────────────────────────┐
│ 应用数据 (HTTP请求) │
│ ↓ 添加TCP头部(端口号) │
│ TCP段 (TCP Header + Data) │
│ ↓ 添加IP头部(源IP、目的IP) │
│ IP数据报 (IP Header + TCP Header + Data) │
│ ↓ 添加以太网帧头(MAC地址) │
│ 以太网帧 (Ethernet Header + IP Header + TCP Header + Data) │
│ ↓ 转换为比特流 │
│ 010101010101... (物理层传输) │
└─────────────────────────────────────────────────────────────┘
接收方(解封装过程):
┌─────────────────────────────────────────────────────────────┐
│ 010101010101... (物理层接收) │
│ ↓ 解析以太网帧 │
│ 以太网帧 → 提取IP数据报 │
│ ↓ 解析IP头部 │
│ IP数据报 → 提取TCP段 │
│ ↓ 解析TCP头部 │
│ TCP段 → 提取应用数据 │
│ ↓ 交给应用程序 │
│ HTTP请求 │
└─────────────────────────────────────────────────────────────┘
📦 生活化类比:寄快递¶
想象你要给朋友寄一封信:
📝 应用层:你写信的内容("你好,最近怎么样?")
↓
📦 会话层:决定什么时候寄、怎么确认对方收到
↓
📋 表示层:把信翻译成朋友能理解的语言,或者加密
↓
📮 传输层:选择快递公司(顺丰 vs 圆通),决定是否需要保价(可靠传输)
↓
🗺️ 网络层:填写地址(北京市朝阳区xxx路xxx号),规划路线
↓
🚚 数据链路层:快递员把信装进快递袋,贴上条形码
↓
🛣️ 物理层:货车、飞机、自行车等实际运输工具
🚀 TCP/IP 四层模型¶
TCP/IP 模型是实际互联网使用的模型,它将 OSI 的 7 层简化为 4 层:
┌─────────────────────────────────────────┐
│ 应用层 (Application Layer) │ ← 对应OSI的应用层、表示层、会话层
├─────────────────────────────────────────┤
│ 传输层 (Transport Layer) │ ← 对应OSI的传输层
├─────────────────────────────────────────┤
│ 网络层 (Internet Layer) │ ← 对应OSI的网络层
├─────────────────────────────────────────┤
│ 网络接口层 (Network Interface Layer) │ ← 对应OSI的数据链路层、物理层
└─────────────────────────────────────────┘
OSI 与 TCP/IP 的对应关系¶
| TCP/IP 四层 | 对应的 OSI 层级 | 核心协议 |
|---|---|---|
| 应用层 | 7 、 6 、 5 层 | HTTP 、 HTTPS 、 FTP 、 SMTP 、 DNS 、 SSH |
| 传输层 | 4 层 | TCP 、 UDP |
| 网络层 | 3 层 | IP 、 ICMP 、 IGMP |
| 网络接口层 | 2 、 1 层 | Ethernet 、 Wi-Fi 、 PPP 、 ARP ( IPv4 地址解析) |
为什么 TCP/IP 更实用¶
🔹 简化设计:将功能相近的层合并,减少复杂性 🔹 实际应用:互联网就是基于 TCP/IP 构建的 🔹 灵活性强:应用层可以随时添加新协议(如 HTTP/2 、 HTTP/3 )
🔑 关键协议详解¶
1️⃣ IP 协议( Internet Protocol )¶
IP 协议是网络层的核心协议,负责数据包的路由和寻址。
IP 地址¶
IP 地址是网络设备的唯一标识,就像家庭地址:
IP 地址分类: - 公网 IP:全球唯一,可直接访问(如: 8.8.8.8 ) - 私网 IP:局域网内使用,不能直接访问 - 10.0.0.0 - 10.255.255.255 - 172.16.0.0 - 172.31.255.255 - 192.168.0.0 - 192.168.255.255
路由原理¶
路由器根据 IP 地址的网络部分决定数据包的转发方向:
假设你的IP是:192.168.1.100/24
↑
网络部分(前24位)
路由表示例:
目的地 网关 接口
192.168.1.0/24 - eth0 ← 直连网络
0.0.0.0/0 192.168.1.1 eth0 ← 默认网关(互联网)
实际场景: - 你访问 www.baidu.com, DNS 解析出 IP : 110.242.68.66 - 你的电脑发现 110.242.68.66 不在 192.168.1.0/24 网段 - 数据包发送给默认网关(路由器) - 路由器根据路由表逐跳转发,最终到达百度服务器
2️⃣ TCP 协议( Transmission Control Protocol )¶
TCP 是面向连接的、可靠的传输层协议,保证数据不丢失、不重复、按序到达。
三次握手(建立连接)¶
TCP 建立连接需要三次握手,确保双方都准备好通信:
客户端 服务器
│ │
│ ─── SYN=1, seq=x ──────────────> │ 第一次握手:客户端请求连接
│ │
│ <── SYN=1, ACK=1, seq=y, ack=x+1 │ 第二次握手:服务器确认并请求连接
│ │
│ ─── ACK=1, seq=x+1, ack=y+1 ──> │ 第三次握手:客户端确认连接
│ │
│ ✅ 连接建立成功 │
为什么需要三次握手?
想象打电话: - 📞 第一次握手:你问"你能听到吗?"(建立连接请求) - 📞 第二次握手:对方回答"我能听到,你能听到我吗?"(确认+反向请求) - 📞 第三次握手:你回答"我也能听到"(确认)
如果只有两次握手: - 你发送的连接请求延迟了,服务器误以为你要建立新连接 - 服务器准备好资源,但你其实已经关闭了连接 - 造成资源浪费
实际代码示例:
import socket
# 客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080)) # 这里会执行三次握手
client.send(b'Hello Server')
四次挥手(断开连接)¶
TCP 断开连接需要四次挥手,确保双方数据都传输完毕:
客户端 服务器
│ │
│ ─── FIN=1, seq=u ──────────────> │ 第一次挥手:客户端请求关闭
│ │
│ <── ACK=1, seq=v, ack=u+1 ───── │ 第二次挥手:服务器确认
│ │ (服务器可能还有数据要发送)
│ <── FIN=1, ACK=1, seq=w, ack=u+1 │ 第三次挥手:服务器请求关闭
│ │
│ ─── ACK=1, seq=u+1, ack=w+1 ──> │ 第四次挥手:客户端确认
│ │
│ ✅ 连接关闭成功 │
为什么四次挥手?
因为 TCP 是全双工的(双向通信): - 客户端说"我不发数据了",但可能还要接收数据 - 服务器确认后,可能还有数据要发送给客户端 - 服务器发送完数据后,才说"我也不发了" - 客户端最后确认,连接完全关闭
TCP 的可靠传输机制¶
TCP 通过以下机制保证可靠性:
- 序列号( Sequence Number ):每个字节都有编号,保证按序到达
- 确认应答( ACK ):收到数据后发送确认,超时未收到则重传
- 流量控制(滑动窗口):根据接收方能力调整发送速度
- 拥塞控制:网络拥塞时降低发送速率
TCP 拥塞控制状态机¶
TCP 拥塞控制包含四个核心算法,通过 cwnd(拥塞窗口)和 ssthresh(慢启动阈值)两个变量控制发送速率:
TCP拥塞控制状态机:
┌──────────────┐ cwnd < ssthresh ┌──────────────────┐
│ 慢启动 │ ───────────────→ │ 慢启动 │
│ Slow Start │ 每收到1个ACK │ cwnd指数增长 │
│ │ cwnd += 1 MSS │ (每RTT翻倍) │
└──────┬───────┘ └──────┬───────────┘
│ cwnd >= ssthresh │ 超时丢包
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ 拥塞避免 │ 超时丢包 │ ssthresh=cwnd/2 │
│ Congestion │ ──────────→ │ cwnd = 1 MSS │
│ Avoidance │ │ 回到慢启动 │
│ 每RTT: cwnd += 1 │ └──────────────────┘
│ (线性增长) │
└──────┬───────────┘
│ 收到3个重复ACK
▼
┌──────────────────┐ ┌──────────────────┐
│ 快重传 │ ──→ │ 快恢复 │
│ Fast Retransmit │ │ Fast Recovery │
│ 立即重传丢失段 │ │ ssthresh=cwnd/2 │
│ 不等超时定时器 │ │ cwnd=ssthresh+3 │
└──────────────────┘ │ 收到重复ACK: │
│ cwnd += 1 │
│ 收到新ACK: │
│ cwnd=ssthresh │
│ 进入拥塞避免 │
└──────────────────┘
四个阶段详解: - 慢启动:连接初始 cwnd=1 MSS ,每收到一个 ACK cwnd += 1 MSS ,由于一个 RTT 内收到 cwnd 个 ACK ,因此每 RTT cwnd 翻倍(指数增长),直到达到 ssthresh - 拥塞避免: cwnd >= ssthresh 后改为线性增长(每 RTT 加 1 MSS ),探测网络容量上限 - 快重传:收到 3 个重复 ACK 时立即重传(不等超时),判定为轻度丢包 - 快恢复( Reno 算法):快重传后 ssthresh = cwnd/2 , cwnd = ssthresh + 3 ,跳过慢启动直接进入拥塞避免
💡 超时丢包 vs 3 次重复 ACK:超时表示严重拥塞( cwnd 重置为 1 ), 3 次重复 ACK 表示轻度拥塞( cwnd 减半),这种区分使 TCP 对网络状态的响应更精确。
滑动窗口示例:
发送方:[已发送][已确认][窗口内可发送][不可发送]
↑ ↑ ↑
seq=0 seq=100 seq=200
接收方窗口大小:100字节
发送方一次性发送100字节,等待ACK
收到ACK=200后,窗口滑动,继续发送
实际应用场景: - 📧 邮件传输:使用 SMTP (基于 TCP ),保证邮件不丢失 - 🌐 网页浏览: HTTP/1.1 使用 TCP ,确保 HTML 、 CSS 、 JS 完整传输 - 📁 文件下载: FTP 使用 TCP ,大文件分块传输,断点续传
3️⃣ UDP 协议( User Datagram Protocol )¶
UDP 是无连接的、不可靠的传输层协议,不保证数据到达,但速度快。
UDP vs TCP¶
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(重传、确认) | 不可靠(可能丢包) |
| 顺序 | 保证按序到达 | 不保证顺序 |
| 速度 | 较慢(头部 20 字节+开销) | 快(头部仅 8 字节) |
| 流量控制 | 有(滑动窗口) | 无 |
| 应用场景 | 文件传输、邮件、网页 | 直播、游戏、 DNS |
UDP 数据包格式¶
┌─────────┬─────────┬─────────────────────┐
│ 源端口 │ 目的端口│ 长度 │ 校验和 │
│ 2字节 │ 2字节 │ 2字节 │ 2字节 │
└─────────┴─────────┴─────────────────────┘
↓
应用数据
实际应用场景:
🎮 在线游戏: - 实时性要求高,丢几帧没关系 - 使用 UDP ,延迟低(<50ms ) - 例如:王者荣耀、绝地求生
📺 视频直播: - 偶尔花屏可以接受,但卡顿不行 - 使用 UDP ,保证流畅 - 例如:抖音直播、 B 站直播
🔍 DNS 查询: - 查询包很小,重传成本低 - 使用 UDP ,响应快 - 例如:nslookup www.baidu.com
代码示例:
import socket
# UDP客户端
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.sendto(b'Hello', ('127.0.0.1', 53)) # 不需要connect
data, addr = client.recvfrom(1024)
4️⃣ HTTP/HTTPS 协议¶
HTTP 是应用层协议,用于在客户端和服务器之间传输超文本数据。
HTTP 请求流程¶
客户端 服务器
│ │
│ ─── DNS解析域名 ───────────────> │ www.baidu.com → 110.242.68.66
│ │
│ ─── TCP三次握手 ──────────────> │ 建立连接
│ │
│ ─── HTTP GET请求 ─────────────> │ GET / HTTP/1.1
│ │
│ <── HTTP响应 ────────────────── │ HTTP/1.1 200 OK
│ │
│ ─── TCP四次挥手 ──────────────> │ 关闭连接
│ │
HTTP 请求示例¶
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
Connection: keep-alive
HTTPS ( HTTP + SSL/TLS )¶
HTTPS 在 HTTP 基础上增加了加密层,保证数据传输安全:
HTTPS 建立连接: 1. TCP 三次握手 2. SSL/TLS 握手(交换证书、协商加密算法) 3. 加密传输数据
实际场景: - 🔐 网上银行:必须使用 HTTPS ,保护账户安全 - 🛒 电商支付:支付宝、微信支付使用 HTTPS - 🔑 登录接口:防止密码被窃取
🔌 端口的概念¶
什么是端口¶
端口是传输层的概念,用于区分同一台主机上的不同进程。
类比: - IP 地址 = 大楼地址(找到哪栋楼) - 端口 = 房间号(找到哪个房间)
常用端口号¶
| 端口号 | 协议 | 用途 | 实际场景 |
|---|---|---|---|
| 20/21 | FTP | 文件传输 | 上传下载文件 |
| 22 | SSH | 远程登录 | 服务器管理 |
| 23 | Telnet | 远程登录(不安全) | 旧设备管理 |
| 25 | SMTP | 发送邮件 | 邮件服务器 |
| 53 | DNS | 域名解析 | 将域名转为 IP |
| 80 | HTTP | 网页浏览 | 访问网站 |
| 110 | POP3 | 接收邮件 | 邮件客户端 |
| 143 | IMAP | 接收邮件 | 邮件客户端 |
| 443 | HTTPS | 加密网页浏览 | 安全网站 |
| 3306 | MySQL | 数据库 | MySQL 服务 |
| 5432 | PostgreSQL | 数据库 | PostgreSQL 服务 |
| 6379 | Redis | 缓存数据库 | Redis 服务 |
| 8080 | HTTP 备用 | Web 服务器 | 开发环境 |
端口范围¶
0 - 1023: 知名端口(Well-known Ports),需要管理员权限
1024 - 49151: 注册端口(Registered Ports)
49152 - 65535:动态端口(Dynamic Ports),临时使用
端口与进程的关系¶
一个进程可以监听多个端口,但一个端口同一时间只能被一个进程占用。
查看端口占用:
# Windows
netstat -ano | findstr :8080
# Linux/Mac
netstat -tulnp | grep :8080
# 或
ss -tulnp | grep :8080
实际场景:
# 启动一个Web服务器,监听8080端口
from http.server import HTTPServer, SimpleHTTPRequestHandler
server = HTTPServer(('0.0.0.0', 8080), SimpleHTTPRequestHandler)
print('Server running on port 8080...')
server.serve_forever()
# 访问:http://localhost:8080
🛠️ 实战练习¶
1️⃣ 使用 ping 命令测试网络连通性¶
ping命令使用 ICMP 协议,测试主机是否可达。
# 基本用法
ping www.baidu.com
# 输出示例:
# PING www.a.shifen.com (110.242.68.66): 56 data bytes
# 64 bytes from 110.242.68.66: icmp_seq=0 ttl=54 time=14.2 ms
# 64 bytes from 110.242.68.66: icmp_seq=1 ttl=54 time=13.8 ms
# 64 bytes from 110.242.68.66: icmp_seq=2 ttl=54 time=14.1 ms
# --- www.a.shifen.com ping statistics ---
# 3 packets transmitted, 3 packets received, 0.0% packet loss
# round-trip min/avg/max/stddev = 13.8/14.0/14.2/0.2 ms
参数说明: - icmp_seq:数据包序号 - ttl:生存时间( Time To Live ),每经过一个路由器减 1 ,防止无限循环 - time:往返时间( Round-Trip Time ),越小越好
实用技巧:
# 只发送4个包(Windows默认)
ping -n 4 www.baidu.com
# 指定包大小
ping -s 1024 www.baidu.com
# 持续ping(Linux)
ping www.baidu.com
# 按Ctrl+C停止
2️⃣ 使用 traceroute 追踪路由¶
traceroute( Windows 叫tracert)显示数据包经过的路由路径。
# Linux/Mac
traceroute www.baidu.com
# Windows
tracert www.baidu.com
# 输出示例:
# traceroute to www.baidu.com (110.242.68.66), 30 hops max, 60 byte packets
# 1 192.168.1.1 (192.168.1.1) 1.234 ms 0.987 ms 1.123 ms
# 2 10.0.0.1 (10.0.0.1) 5.432 ms 6.123 ms 5.876 ms
# 3 202.96.128.86 (202.96.128.86) 12.345 ms 11.234 ms 12.567 ms
# ...
# 10 110.242.68.66 (110.242.68.66) 14.123 ms 13.987 ms 14.234 ms
工作原理: 1. 发送 TTL=1 的数据包,第一个路由器返回超时 2. 发送 TTL=2 的数据包,第二个路由器返回超时 3. 依次增加 TTL ,直到到达目的地
实际应用: - 🔍 网络故障排查:发现哪个路由器出现问题 - 📊 性能分析:查看哪一跳延迟最高 - 🌍 了解网络拓扑:了解数据包的传输路径
3️⃣ 查看网络连接( netstat 、 ss )¶
netstat显示网络连接、路由表、接口统计等。
# 查看所有TCP连接
netstat -tuln
# 输出示例:
# Proto Recv-Q Send-Q Local Address Foreign Address State
# tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
# tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
# tcp 0 0 192.168.1.100:54321 110.242.68.66:443 ESTABLISHED
参数说明: - -t: TCP 连接 - -u: UDP 连接 - -l:监听状态的连接 - -n:显示数字地址(不解析域名) - -p:显示进程 ID 和名称(需要管理员权限)
常用命令:
# 查看所有监听端口
netstat -tuln
# 查看特定端口
netstat -tuln | grep :8080 # |管道:将前一命令的输出作为后一命令的输入
# 查看所有已建立的连接
netstat -tn | grep ESTABLISHED # grep文本搜索:按模式匹配行
# 查看进程占用的端口
netstat -tulnp | grep python
ss 命令(更快,推荐使用):
4️⃣ 抓包工具 Wireshark 入门¶
Wireshark是强大的网络协议分析工具,可以捕获和分析网络数据包。
安装 Wireshark¶
# Ubuntu/Debian
sudo apt-get install wireshark
# macOS
brew install --cask wireshark
# Windows
# 从官网下载安装包:https://www.wireshark.org/download.html
基本使用¶
- 选择网卡:
-
启动 Wireshark ,选择要监听的网络接口(如 eth0 、 Wi-Fi )
-
开始抓包:
-
点击"Start capturing packets"按钮(蓝色鲨鱼鳍图标)
-
应用过滤器:
# 只显示HTTP流量
http
# 只显示特定IP的流量
ip.addr == 192.168.1.100
# 只显示TCP流量
tcp
# 组合过滤
tcp.port == 8080 and ip.addr == 192.168.1.100
```
4. **分析数据包**:
- 点击任意数据包,查看详细信息
- 可以看到每一层的数据(以太网帧、 IP 包、 TCP 段、 HTTP 请求)
#### 实战:抓取 HTTP 请求
1. 启动 Wireshark ,选择网卡
2. 设置过滤器:`http`
3. 在浏览器访问:`http://www.baidu.com`
4. 在 Wireshark 中查看捕获的 HTTP 请求
**数据包详情**:
```text
Frame 1: 686 bytes on wire
Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 11:22:33:44:55:66
Internet Protocol Version 4, Src: 192.168.1.100, Dst: 110.242.68.66
Transmission Control Protocol, Src Port: 54321, Dst Port: 80, Seq: 1, Ack: 1
Hypertext Transfer Protocol
GET / HTTP/1.1\r\n
Host: www.baidu.com\r\n
User-Agent: Mozilla/5.0 ...\r\n
\r\n
实际应用: - 🐛 调试网络问题:查看请求是否发送成功 - 🔍 分析协议:学习协议的工作原理 - 🔐 安全审计:发现异常流量 - 📊 性能优化:分析网络延迟
❓ 常见问题¶
Q1 :为什么需要三次握手?两次不行吗¶
答案:三次握手是为了防止失效的连接请求突然传到服务器。
场景: 1. 客户端发送连接请求 A ,但网络拥塞, A 延迟了 2. 客户端超时重发请求 B ,服务器收到 B ,建立连接 3. 连接完成后,断开连接 4. 此时,延迟的请求 A 到达服务器 5. 如果是两次握手,服务器误以为客户端要建立新连接 6. 服务器分配资源,但客户端已经关闭,造成资源浪费
三次握手的好处: - 服务器收到请求 A ,回复 SYN+ACK - 客户端发现这不是自己期望的连接,发送 RST (复位) - 连接未建立,资源未浪费
Q2 : TCP 和 UDP 的区别及使用场景¶
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(重传、确认) | 不可靠(可能丢包) |
| 顺序 | 保证按序到达 | 不保证顺序 |
| 速度 | 较慢 | 快 |
| 头部开销 | 20 字节 | 8 字节 |
| 流量控制 | 有(滑动窗口) | 无 |
| 适用场景 | 文件传输、邮件、网页 | 直播、游戏、 DNS |
使用场景对比:
✅ 使用 TCP 的场景: - 📁 文件传输: FTP 、 SFTP (不能丢数据) - 📧 邮件: SMTP 、 POP3 、 IMAP (邮件不能丢) - 🌐 网页浏览: HTTP/HTTPS ( HTML 、 CSS 、 JS 必须完整) - 💾 数据库: MySQL 、 PostgreSQL (数据一致性) - 📡 SSH 远程登录:命令不能丢
✅ 使用 UDP 的场景: - 🎮 在线游戏:实时性要求高,丢几帧没关系 - 📺 视频直播:偶尔花屏可以接受,但卡顿不行 - 🔍 DNS 查询:查询包小,重传成本低 - 📡 VoIP 语音通话:延迟比可靠性更重要 - 📊 物联网传感器:数据量大,允许部分丢失
代码选择:
# 需要可靠传输 → TCP
socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 需要快速传输 → UDP
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Q3 :什么是 MTU ?为什么重要¶
MTU ( Maximum Transmission Unit )是最大传输单元,指数据链路层能传输的最大数据包大小。
常见 MTU 值: - 以太网: 1500 字节 - PPPoE : 1492 字节 - Wi-Fi :通常 1500 字节
MTU 组成:
MTU 过大的问题: - 数据包超过 MTU 会被分片( Fragmentation ) - 分片会增加延迟,降低性能 - 任何一片丢失,整个数据包都要重传
MTU 过小的问题: - 数据包数量增加,头部开销增大 - 降低网络利用率
实际场景:
# 查看MTU
ifconfig eth0
# 或
ip link show eth0
# 输出示例:
# eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT
# 修改MTU(需要管理员权限)
sudo ifconfig eth0 mtu 1400
# 或
sudo ip link set eth0 mtu 1400
MTU 与 TCP MSS 的关系: - MSS ( Maximum Segment Size )是 TCP 层的最大段大小 - MSS = MTU - IP 头部(20) - TCP 头部(20) = 1460
实际应用: - 🌐 VPN: VPN 会增加头部,需要降低 MTU - 📡 卫星网络:延迟高, MTU 通常较小 - 🔧 网络优化:调整 MTU 可以提升性能
📝 总结¶
核心知识点回顾¶
- OSI 七层模型:理论参考模型,理解网络分层思想
- TCP/IP 四层模型:实际互联网使用的模型
- 关键协议:
- IP :寻址和路由
- TCP :可靠传输(三次握手、四次挥手)
- UDP :快速传输(不可靠)
- HTTP/HTTPS :应用层协议
- 端口:区分同一主机上的不同进程
- 实战工具: ping 、 traceroute 、 netstat 、 Wireshark
学习建议¶
📚 循序渐进: 1. 先理解分层模型的思想 2. 掌握 TCP 和 UDP 的区别 3. 学会使用常用命令排查问题 4. 用 Wireshark 抓包,加深理解
🛠️ 动手实践: - 用 ping 测试网络连通性 - 用 traceroute 查看路由路径 - 用 netstat 查看端口占用 - 用 Wireshark 抓包分析 HTTP 请求
📖 进阶学习: - HTTP/2 、 HTTP/3 ( QUIC ) - WebSocket 协议 - 网络安全( SSL/TLS 、防火墙) - 网络编程( Socket 编程)
推荐资源¶
📖 书籍: - 《计算机网络:自顶向下方法》 - 《 TCP/IP 详解 卷 1 :协议》
🌐 在线资源: - Wireshark 官方教程 - MDN Web Docs - HTTP — Mozilla 网络协议参考
🎯 练习网站: - Packet Tracer:网络模拟器 - GNS3:网络仿真平台
记住:网络知识是程序员的重要基础能力,掌握基础能让你在排障、部署和系统协作中更从容。
⚠️ 核验说明(2026-04-03):本页已完成当前目录下的人工复核,重点检查了基础网络概念、示意图与命令示例的准确性,并统一更新了目录级时效性说明。若文中涉及外部模型、API、版本号、价格或第三方产品名称,请以官方文档和实际运行环境为准。
最后更新日期: 2026-04-03