跳转至

01 - 网络基础: OSI 模型与 TCP/IP 协议栈

本章核心: 理解网络通信的分层模型,掌握 TCP/IP 协议栈基础


📖 章节导航

前序章节: 无(本章为基础) 后续章节: 02-域名与 DNS.md03-服务器与 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 层,从下到上依次是:

Text Only
┌─────────────────────────────────────────┐
│  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 )提供。

数据在各层的变化(封装与解封装)

当数据从发送方传输到接收方时,会经历封装解封装过程:

Text Only
发送方(封装过程):
┌─────────────────────────────────────────────────────────────┐
│ 应用数据 (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请求                                                    │
└─────────────────────────────────────────────────────────────┘

📦 生活化类比:寄快递

想象你要给朋友寄一封信:

Text Only
📝 应用层:你写信的内容("你好,最近怎么样?")
📦 会话层:决定什么时候寄、怎么确认对方收到
📋 表示层:把信翻译成朋友能理解的语言,或者加密
📮 传输层:选择快递公司(顺丰 vs 圆通),决定是否需要保价(可靠传输)
🗺️ 网络层:填写地址(北京市朝阳区xxx路xxx号),规划路线
🚚 数据链路层:快递员把信装进快递袋,贴上条形码
🛣️ 物理层:货车、飞机、自行车等实际运输工具

🚀 TCP/IP 四层模型

TCP/IP 模型是实际互联网使用的模型,它将 OSI 的 7 层简化为 4 层:

Text Only
┌─────────────────────────────────────────┐
│  应用层 (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 地址是网络设备的唯一标识,就像家庭地址:

Text Only
IPv4格式:192.168.1.1(4个字节,32位)
IPv6格式:2001:0db8:85a3:0000:0000:8a2e:0370:7334(16字节,128位)

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 地址的网络部分决定数据包的转发方向:

Text Only
假设你的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 建立连接需要三次握手,确保双方都准备好通信:

Text Only
客户端                              服务器
  │                                   │
  │  ─── SYN=1, seq=x ──────────────> │  第一次握手:客户端请求连接
  │                                   │
  │  <── SYN=1, ACK=1, seq=y, ack=x+1 │  第二次握手:服务器确认并请求连接
  │                                   │
  │  ─── ACK=1, seq=x+1, ack=y+1 ──> │  第三次握手:客户端确认连接
  │                                   │
  │         ✅ 连接建立成功              │

为什么需要三次握手?

想象打电话: - 📞 第一次握手:你问"你能听到吗?"(建立连接请求) - 📞 第二次握手:对方回答"我能听到,你能听到我吗?"(确认+反向请求) - 📞 第三次握手:你回答"我也能听到"(确认)

如果只有两次握手: - 你发送的连接请求延迟了,服务器误以为你要建立新连接 - 服务器准备好资源,但你其实已经关闭了连接 - 造成资源浪费

实际代码示例

Python
import socket

# 客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8080))  # 这里会执行三次握手
client.send(b'Hello Server')

四次挥手(断开连接)

TCP 断开连接需要四次挥手,确保双方数据都传输完毕:

Text Only
客户端                              服务器
  │                                   │
  │  ─── 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 通过以下机制保证可靠性:

  1. 序列号( Sequence Number ):每个字节都有编号,保证按序到达
  2. 确认应答( ACK ):收到数据后发送确认,超时未收到则重传
  3. 流量控制(滑动窗口):根据接收方能力调整发送速度
  4. 拥塞控制:网络拥塞时降低发送速率

TCP 拥塞控制状态机

TCP 拥塞控制包含四个核心算法,通过 cwnd(拥塞窗口)和 ssthresh(慢启动阈值)两个变量控制发送速率:

Text Only
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 对网络状态的响应更精确。

Text Only
滑动窗口示例:
发送方:[已发送][已确认][窗口内可发送][不可发送]
         ↑        ↑        ↑
       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 数据包格式

Text Only
┌─────────┬─────────┬─────────────────────┐
│ 源端口  │ 目的端口│    长度   │  校验和  │
│  2字节  │  2字节  │   2字节   │  2字节  │
└─────────┴─────────┴─────────────────────┘
        应用数据

实际应用场景

🎮 在线游戏: - 实时性要求高,丢几帧没关系 - 使用 UDP ,延迟低(<50ms ) - 例如:王者荣耀、绝地求生

📺 视频直播: - 偶尔花屏可以接受,但卡顿不行 - 使用 UDP ,保证流畅 - 例如:抖音直播、 B 站直播

🔍 DNS 查询: - 查询包很小,重传成本低 - 使用 UDP ,响应快 - 例如:nslookup www.baidu.com

代码示例

Python
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 请求流程

Text Only
客户端                              服务器
  │                                   │
  │  ─── DNS解析域名 ───────────────> │  www.baidu.com → 110.242.68.66
  │                                   │
  │  ─── TCP三次握手 ──────────────> │  建立连接
  │                                   │
  │  ─── HTTP GET请求 ─────────────> │  GET / HTTP/1.1
  │                                   │
  │  <── HTTP响应 ────────────────── │  HTTP/1.1 200 OK
  │                                   │
  │  ─── TCP四次挥手 ──────────────> │  关闭连接
  │                                   │

HTTP 请求示例

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 基础上增加了加密层,保证数据传输安全:

Text Only
HTTP流程:
应用数据 → TCP → IP → 物理层

HTTPS流程:
应用数据 → SSL/TLS加密 → TCP → IP → 物理层

HTTPS 建立连接: 1. TCP 三次握手 2. SSL/TLS 握手(交换证书、协商加密算法) 3. 加密传输数据

实际场景: - 🔐 网上银行:必须使用 HTTPS ,保护账户安全 - 🛒 电商支付:支付宝、微信支付使用 HTTPS - 🔑 登录接口:防止密码被窃取


🔌 端口的概念

什么是端口

端口是传输层的概念,用于区分同一台主机上的不同进程

类比: - IP 地址 = 大楼地址(找到哪栋楼) - 端口 = 房间号(找到哪个房间)

Text Only
IP地址 + 端口 = 进程的唯一标识
例如:192.168.1.100:8080
      ↑              ↑
    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 服务器 开发环境

端口范围

Text Only
0 - 1023:    知名端口(Well-known Ports),需要管理员权限
1024 - 49151: 注册端口(Registered Ports)
49152 - 65535:动态端口(Dynamic Ports),临时使用

端口与进程的关系

一个进程可以监听多个端口,但一个端口同一时间只能被一个进程占用。

查看端口占用

Bash
# Windows
netstat -ano | findstr :8080

# Linux/Mac
netstat -tulnp | grep :8080
# 或
ss -tulnp | grep :8080

实际场景

Python
# 启动一个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 协议,测试主机是否可达。

Bash
# 基本用法
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 ),越小越好

实用技巧

Bash
# 只发送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)显示数据包经过的路由路径。

Bash
# 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显示网络连接、路由表、接口统计等。

Bash
# 查看所有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 和名称(需要管理员权限)

常用命令

Bash
# 查看所有监听端口
netstat -tuln

# 查看特定端口
netstat -tuln | grep :8080  # |管道:将前一命令的输出作为后一命令的输入

# 查看所有已建立的连接
netstat -tn | grep ESTABLISHED  # grep文本搜索:按模式匹配行

# 查看进程占用的端口
netstat -tulnp | grep python

ss 命令(更快,推荐使用):

Bash
# 功能类似netstat,但性能更好
ss -tuln

# 查看所有TCP连接
ss -tn

# 查看进程信息
ss -tulnp

4️⃣ 抓包工具 Wireshark 入门

Wireshark是强大的网络协议分析工具,可以捕获和分析网络数据包。

安装 Wireshark

Bash
# Ubuntu/Debian
sudo apt-get install wireshark

# macOS
brew install --cask wireshark

# Windows
# 从官网下载安装包:https://www.wireshark.org/download.html

基本使用

  1. 选择网卡
  2. 启动 Wireshark ,选择要监听的网络接口(如 eth0 、 Wi-Fi )

  3. 开始抓包

  4. 点击"Start capturing packets"按钮(蓝色鲨鱼鳍图标)

  5. 应用过滤器

Text Only
   # 只显示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 语音通话:延迟比可靠性更重要 - 📊 物联网传感器:数据量大,允许部分丢失

代码选择

Text Only
# 需要可靠传输 → 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 组成

Text Only
总MTU = IP头部 + TCP/UDP头部 + 应用数据
1500 = 20 + 20 + 1460(TCP)
1500 = 20 + 8 + 1472(UDP)

MTU 过大的问题: - 数据包超过 MTU 会被分片( Fragmentation ) - 分片会增加延迟,降低性能 - 任何一片丢失,整个数据包都要重传

MTU 过小的问题: - 数据包数量增加,头部开销增大 - 降低网络利用率

实际场景

Bash
# 查看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 可以提升性能


📝 总结

核心知识点回顾

  1. OSI 七层模型:理论参考模型,理解网络分层思想
  2. TCP/IP 四层模型:实际互联网使用的模型
  3. 关键协议
  4. IP :寻址和路由
  5. TCP :可靠传输(三次握手、四次挥手)
  6. UDP :快速传输(不可靠)
  7. HTTP/HTTPS :应用层协议
  8. 端口:区分同一主机上的不同进程
  9. 实战工具: 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