一、网络通信的本质与OSI模型

目录

学习目标: 理解"两台电脑如何通信",建立网络分层思维

第一部分:课程导入

以下这些场景:

  • 🔧 "应用服务器和数据库服务器无法连接"
  • 🔧 "客户端访问Web应用超时"
  • 🔧 "能ping通但应用无法访问"

要解决这些问题,首先需要理解:数据是如何从一台设备传输到另一台设备的?

📦 核心概念:网络通信就像"寄快递"

想象您要从北京给上海的朋友寄一份文件,这个过程是怎么完成的?

现实世界的快递流程

复制代码
您(寄件人):
  1. 写好文件内容
  2. 装入信封
  3. 写上收件人地址
  4. 交给快递公司

快递公司:
  5. 分拣包裹
  6. 选择运输路线(飞机/火车/汽车)
  7. 中转站转发

朋友(收件人):
  8. 签收包裹
  9. 拆开信封
  10. 阅读文件

网络世界的数据传输

两台电脑通信和寄快递完全一样 !只不过网络世界把这个流程标准化成了7个层次 ,这就是OSI七层模型:

复制代码
┌─────────────────────────────────────────────┐
│  应用层 (Application)   - 您写好文件内容    │
│  表示层 (Presentation)   - 文件格式转换     │
│  会话层 (Session)       - 建立通信会话      │
├─────────────────────────────────────────────┤
│  传输层 (Transport)     - 快递单号(端口号)  │
├─────────────────────────────────────────────┤
│  网络层 (Network)       - 收件人地址(IP)    │
├─────────────────────────────────────────────┤
│  数据链路层 (Data Link) - 运输工具(MAC)     │
│  物理层 (Physical)      - 公路/光缆         │
└─────────────────────────────────────────────┘

🧩 数据封装:像俄罗斯套娃一样层层包装

当您访问一个网站(比如 www.example.com)时,数据会从上到下层层包装:

复制代码
应用层:   "GET /index.html HTTP/1.1"  (您要的文件)
           ↓ 加上
传输层:   源端口: 54321  目标端口: 80  (快递单号)
           ↓ 加上
网络层:   源IP: 192.168.1.100  目标IP: 93.184.216.34  (地址)
           ↓ 加上
数据链路层: 源MAC: aa:aa:aa:aa 目标MAC: bb:bb:bb:bb  (运输单)
           ↓ 变成
物理层:   01010101010101  (电信号/光信号)

到达目标电脑后,再从下到上层层拆开,就像拆快递一样!

💡 需要关注的4层

虽然OSI有7层,但对于我们的工作,重点关注这4层:

层次 作用 类比 您在工作中会接触
应用层 您的应用程序 文件内容 HTTP, MySQL协议, Redis协议
传输层 端口到端口传输 快递单号 TCP端口(3306, 6379, 8080)
网络层 IP地址路由 收件人地址 192.168.1.100(服务器IP)
数据链路层 MAC地址转发 运输工具 交换机基于MAC转发

🏢 实际工作场景举例

场景1:应用无法连接数据库

问题现象:

  • 应用服务器(192.168.1.10)无法连接数据库服务器(192.168.1.20)
  • 报错:Connection timeout

OSI分层排查思路:

复制代码
第1步 - 检查物理层:
  ✅ 网线插好了吗?端口灯亮吗?

第2步 - 检查数据链路层:
  ✅ 交换机配置正确吗?VLAN配置对吗?

第3步 - 检查网络层:
  ❓ IP地址配置正确吗?(这步最关键!)
  → ping 192.168.1.20

第4步 - 检查传输层:
  ❓ 端口开放了吗?(MySQL默认3306)
  → telnet 192.168.1.20 3306

第5步 - 检查应用层:
  ❓ 数据库用户名密码对吗?
  → 数据库客户端工具测试

场景2:能ping通但应用无法访问

现象:

复制代码
C:\> ping 192.168.1.20
来自 192.168.1.20 的回复: 时间=1ms
✅ ping通!

但应用连接失败:
❌ telnet 192.168.1.20 3306
连接失败

原因分析:

  • ✅ 物理层、数据链路层、网络层都正常(ping通证明IP可达)
  • ❌ 传输层有问题(端口未开放/被防火墙阻止)
  • → 这就是典型的**"能ping通但无法访问服务"**问题!

📝 TCP/IP四层模型(更实用的简化版)

实际工作中,我们用TCP/IP四层模型更常见(把OSI的7层简化合并):

复制代码
┌──────────────────────────────┐
│  应用层 (Application)         │ ← 对应OSI的上三层
│  HTTP, FTP, SMTP, MySQL      │
├──────────────────────────────┤
│  传输层 (Transport)          │ ← 对应OSI的传输层
│  TCP, UDP                    │
├──────────────────────────────┤
│  网络层 (Internet)           │ ← 对应OSI的网络层
│  IP, ICMP, ARP               │
├──────────────────────────────┤
│  网络接口层 (Network Access)  │ ← 对应OSI的底两层
│  以太网, Wi-Fi               │
└──────────────────────────────┘

记住这个四层就够了! 实际排错时用的就是这个。

✅ 关键要点

  1. 网络通信 = 寄快递:层层包装→运输→层层拆开
  2. 数据封装:从应用层到物理层,每层都加上自己的"标签"
  3. 数据解封装:从物理层到应用层,每层拆开自己的"标签"
  4. 分层排查:从物理层开始,逐层向上检查
  5. TCP/IP四层模型:比OSI七层更实用,重点掌握

第二部分:核心知识详解

📚 一、核心定义与原理

1.1 什么是网络通信?

定义:网络通信是指两台或多个设备之间交换数据信息的过程。

本质:网络通信就像**"寄快递"**的过程,需要经过层层包装、运输、拆包装。

1.2 OSI七层模型

OSI(Open System Interconnection)开放系统互联参考模型,是国际标准化组织(ISO)制定的网络通信标准框架。

复制代码
┌─────────────────────────────────────────────────┐
│  第7层 - 应用层 (Application)                   │
│  作用:为应用程序提供网络服务接口                │
│  协议:HTTP, FTP, SMTP, DNS, Telnet             │
├─────────────────────────────────────────────────┤
│  第6层 - 表示层 (Presentation)                   │
│  作用:数据格式转换、加密解密、压缩解压          │
│  协议:SSL/TLS, JPEG, MPEG                       │
├─────────────────────────────────────────────────┤
│  第5层 - 会话层 (Session)                        │
│  作用:建立、管理、终止会话连接                  │
│  协议:NetBIOS, RPC                              │
├─────────────────────────────────────────────────┤
│  第4层 - 传输层 (Transport)                     │
│  作用:提供端到端的可靠或不可靠传输              │
│  协议:TCP, UDP                                  │
├─────────────────────────────────────────────────┤
│  第3层 - 网络层 (Network)                        │
│  作用:路径选择、路由转发、逻辑地址(IP)          │
│  协议:IP, ICMP, ARP, OSPF, BGP                  │
├─────────────────────────────────────────────────┤
│  第2层 - 数据链路层 (Data Link)                 │
│  作用:MAC地址寻址、成帧、差错控制              │
│  协议:Ethernet, PPP, MAC, HDLC                  │
├─────────────────────────────────────────────────┤
│  第1层 - 物理层 (Physical)                       │
│  作用:比特流传输、电气规范、物理接口            │
│  协议:RJ45, 光纤, 802.3, V.35                   │
└─────────────────────────────────────────────────┘

1.3 TCP/IP四层模型(实战标准)

TCP/IP是互联网实际使用的协议栈,将OSI七层合并为四层:

复制代码
┌─────────────────────────────────────────────────┐
│  应用层 (Application)                           │
│  对应OSI:应用层、表示层、会话层                 │
│  协议:HTTP, FTP, DNS, SSH, MySQL, Redis        │
├─────────────────────────────────────────────────┤
│  传输层 (Transport)                             │
│  对应OSI:传输层                                 │
│  协议:TCP(可靠), UDP(不可靠)                    │
├─────────────────────────────────────────────────┤
│  网络层 (Internet)                              │
│  对应OSI:网络层                                 │
│  协议:IP, ICMP, ARP                            │
├─────────────────────────────────────────────────┤
│  网络接口层 (Network Interface)                 │
│  对应OSI:数据链路层、物理层                     │
│  协议:Ethernet, Wi-Fi, PPP                     │
└─────────────────────────────────────────────────┘

1.4 数据封装与解封装

数据封装 (发送端):数据从上层向下层传输时,每一层都加上自己的控制信息(头部/尾部)。
数据解封装(接收端):数据从下层向上层传输时,每一层都去掉自己的控制信息。

封装过程示例(访问网站)
复制代码
【应用层】数据:"GET /index.html HTTP/1.1"
    ↓ 加上TCP头
【传输层】TCP段:源端口54321 + 目标端口80 + 数据
    ↓ 加上IP头
【网络层】IP包:源IP 192.168.1.100 + 目标IP 93.184.216.34 + TCP段
    ↓ 加上以太网头
【数据链路层】以太网帧:源MAC + 目标MAC + IP包
    ↓ 转换成比特流
【物理层】比特流:010101010101...

每一层添加的信息叫"协议头"(Header),就像快递的每一层包装都贴上新的标签。

📖 二、关键术语解释

术语 解释 类比
协议 网络设备之间通信的规则和约定 快递公司的运营规范
封装 数据层层添加协议头的过程 装快递时层层加包装
解封装 数据层层去掉协议头的过程 拆快递时层层打开包装
PDU(协议数据单元) 每一层数据单元的称呼 不同环节的快递称呼不同
比特流 物理层传输的二进制0和1 快递卡车在公路上行驶
数据链路层的数据单位 快递包裹
网络层的数据单位 快邮
传输层的数据单位 信件
端到端 从源主机到目的主机的通信 从发货人到收货人
点到点 相邻节点之间的通信 快递从一个站点到下一个站点

不同层的PDU名称

复制代码
应用层:     数据
传输层:     段 (Segment)
网络层:     包 (Packet)
数据链路层:  帧 (Frame)
物理层:     比特 (Bit)

常见端口速查

服务 端口 协议 说明
HTTP 80 TCP 网页浏览
HTTPS 443 TCP 加密网页浏览
FTP 20/21 TCP 文件传输
SSH 22 TCP 远程登录(Linux)
Telnet 23 TCP 远程登录(不安全)
DNS 53 TCP/UDP 域名解析
DHCP 67/68 UDP 自动分配IP
MySQL 3306 TCP 数据库
Redis 6379 TCP 缓存数据库
PostgreSQL 5432 TCP 数据库
Tomcat 8080 TCP Java应用服务器
RDP 3389 TCP Windows远程桌面

💼 三、典型应用场景

场景1:应用无法连接数据库

问题描述

复制代码
应用服务器:192.168.10.100
数据库服务器:192.168.10.200

测试结果:
✅ ping 192.168.10.200 成功
❌ telnet 192.168.10.200 3306 失败
❌ 应用报错:Connection timeout

分层排查思路

第1层 - 物理层检查

复制代码
检查项:
✅ 网线是否插紧
✅ 交换机端口LED灯是否亮
✅ 网卡状态是否UP

命令:
Windows: ipconfig /all
Linux: ip link show

第2层 - 数据链路层检查

复制代码
检查项:
✅ VLAN配置是否正确
✅ MAC地址表是否学习到
✅ 交换机端口模式(Access/Trunk)

命令:
display mac-address (华为设备)
show mac address-table (思科设备)

第3层 - 网络层检查

复制代码
检查项:
✅ IP地址配置是否正确
✅ 子网掩码是否匹配
✅ 默认网关是否配置
✅ 路由表是否有路由条目

命令:
Windows: ipconfig /all && route print
Linux: ip addr && ip route

本场景:ping成功 = 网络层正常 ✅

第4层 - 传输层检查

复制代码
检查项:
❌ 目标端口是否开放
❌ 防火墙是否阻止
❌ 服务是否监听该端口

命令:
telnet 192.168.10.200 3306
netstat -tulpn | grep 3306 (Linux)

本场景:telnet失败 = 传输层有问题 ❌

第5层 - 应用层检查

复制代码
检查项:
✅ 数据库用户名密码是否正确
✅ 数据库是否允许该IP连接
✅ 数据库服务是否启动

命令:
systemctl status mysql
mysql -u root -p -h 192.168.10.200

结论 :问题出在传输层,可能原因:

  1. MySQL服务未启动
  2. 防火墙阻止了3306端口
  3. MySQL配置只允许本地连接

解决方案

bash 复制代码
# 检查MySQL服务
systemctl status mysql

# 启动MySQL
systemctl start mysql

# 检查端口监听
netstat -tulpn | grep 3306

# 配置防火墙(Linux)
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

# 检查MySQL绑定地址
cat /etc/mysql/my.cnf | grep bind-address
# 应该是 bind-address = 0.0.0.0 或注释掉

场景2:能访问外网IP但无法解析域名

问题描述

复制代码
✅ ping 8.8.8.8 成功(外网IP)
✅ ping 114.114.114.114 成功(DNS服务器IP)
❌ ping www.baidu.com 失败(域名解析)
应用报错:Unknown host

分析

  • ping外网IP成功 = 网络层正常,能访问互联网
  • ping域名失败 = DNS解析有问题

问题定位应用层DNS配置问题

解决方案

bash 复制代码
# Windows查看DNS配置
ipconfig /all | findstr "DNS"

# Linux查看DNS配置
cat /etc/resolv.conf

# 修改DNS为公共DNS
Windows:
  网络连接 → 属性 → IPv4设置 → DNS服务器
  首选:114.114.114.114
  备用:8.8.8.8

Linux:
  echo "nameserver 114.114.114.114" >> /etc/resolv.conf
  echo "nameserver 8.8.8.8" >> /etc/resolv.conf

# 验证
nslookup www.baidu.com

⚙️ 四、配置命令示例(华为设备)

4.1 基础网络命令

华为设备查看配置

shell 复制代码
# 查看运行配置
display current-configuration

# 查看接口状态
display interface brief

# 查看IP路由表
display ip routing-table

# 查看ARP表
display arp

# 查看MAC地址表
display mac-address

# 查看VLAN配置
display vlan

思科设备查看配置

shell 复制代码
# 查看运行配置
show running-config

# 查看接口状态
show ip interface brief

# 查看IP路由表
show ip route

# 查看ARP表
show ip arp

# 查看MAC地址表
show mac address-table

# 查看VLAN配置
show vlan brief

4.2 实用排错命令

Windows常用命令

cmd 复制代码
:: 查看IP配置
ipconfig /all

:: 查看路由表
route print -4

:: Ping测试
ping 192.168.1.1

:: 持续Ping(100次)
ping 192.168.1.1 -n 100

:: 路由跟踪
tracert www.baidu.com

:: 端口测试
telnet 192.168.1.1 23

:: DNS解析测试
nslookup www.baidu.com

:: ARP缓存查看
arp -a

:: 清除DNS缓存
ipconfig /flushdns

:: 查看连接状态
netstat -an

:: 查看特定端口
netstat -an | findstr "3306"

Linux常用命令

bash 复制代码
# 查看IP配置
ip addr show
ifconfig

# 查看路由表
ip route show
route -n

# Ping测试
ping -c 4 192.168.1.1

# 路由跟踪
traceroute www.baidu.com

# 端口测试
nc -zv 192.168.1.1 22
telnet 192.168.1.1 22

# DNS解析测试
nslookup www.baidu.com
dig www.baidu.com

# ARP缓存查看
arp -n

# 查看连接状态
netstat -tulpn
ss -tulpn

# 查看特定端口
netstat -tulpn | grep 3306

# 抓包
tcpdump -i eth0 -nn host 192.168.1.1
tcpdump -i eth0 port 3306

# 查看ARP表
ip neigh show

4.3 华为交换机基础配置示例

shell 复制代码
# 进入系统视图
system-view

# 修改设备名称
sysname Switch-A

# 创建VLAN
vlan batch 10 20 100

# 配置接口为Access模式(连接PC)
interface GigabitEthernet0/0/1
 port link-type access
 port default vlan 10
 quit

# 配置接口为Trunk模式(连接交换机)
interface GigabitEthernet0/0/24
 port link-type trunk
 port trunk allow-pass vlan 10 20 100
 quit

# 配置管理IP
interface Vlanif 100
 ip address 192.168.100.1 24
 quit

# 配置远程登录
user-interface vty 0 4
 authentication-mode password
 set authentication password simple Huawei@123
 protocol inbound ssh telnet
 quit

# 保存配置
return
save

4.4 华为路由器基础配置示例

shell 复制代码
# 进入系统视图
system-view

# 配置接口IP
interface GigabitEthernet0/0/0
 ip address 192.168.1.1 24
 quit

interface GigabitEthernet0/0/1
 ip address 192.168.2.1 24
 quit

# 配置静态路由
# 目标网段 10.1.0.0/16,下一跳 192.168.2.2
ip route-static 10.1.0.0 255.255.0.0 192.168.2.2

# 配置默认路由(访问互联网)
ip route-static 0.0.0.0 0.0.0.0 192.168.1.254

# 查看路由表
display ip routing-table

# 保存配置
save

⚠️ 五、常见误区与易错点

误区1:ping通就等于网络完全正常

错误认识

复制代码
"我能ping通对方,所以网络没问题!"

正确理解

复制代码
ping通只能证明:
✅ 物理层正常(网线通了)
✅ 数据链路层正常(MAC能转发)
✅ 网络层正常(IP可达)

但无法证明:
❌ 传输层是否通(端口是否开放)
❌ 应用层是否正常(服务是否可用)

案例

复制代码
✅ ping 192.168.1.200 成功
❌ telnet 192.168.1.200 3306 失败
→ 网络层正常,但传输层有问题

误区2:混淆IP地址和MAC地址

错误认识

复制代码
"IP地址和MAC地址不都是地址吗?有什么区别?"

正确理解

特性 IP地址 MAC地址
层次 网络层(第3层) 数据链路层(第2层)
作用 逻辑地址,用于跨网段路由 物理地址,用于同网段转发
长度 32位(IPv4) 48位
示例 192.168.1.100 AA:BB:CC:DD:EE:FF
变化 可以手动修改 网卡出厂固定
类比 家庭住址 身份证号码

记住

  • 跨网段通信用IP地址(路由器根据IP转发)
  • 同网段通信用MAC地址(交换机根据MAC转发)

误区3:忘记配置网关

错误认识

复制代码
"我的IP地址配置正确,为什么访问不了其他网段?"

正确理解

复制代码
默认网关 = 本网段的出口路由器

没有网关:
  ✅ 同网段通信正常(192.168.1.10 ↔ 192.168.1.20)
  ❌ 跨网段通信失败(192.168.1.10 ↔ 192.168.2.10)

配置网关后:
  数据包 → 网关 → 路由器 → 目标网段

案例

复制代码
错误配置:
IP: 192.168.1.10
掩码: 255.255.255.0
网关: (未配置)
→ 只能访问192.168.1.0/24网段

正确配置:
IP: 192.168.1.10
掩码: 255.255.255.0
网关: 192.168.1.1
→ 可以访问所有网段

误区4:忽略防火墙的影响

错误认识

复制代码
"网络配置都对了,为什么还是连不上?"

正确理解

复制代码
防火墙 = 网络的"门卫"

常见防火墙:
1. Windows防火墙
2. Linux防火墙(iptables/firewalld)
3. 网络防火墙(华为USG、天融信等)
4. 云安全组(阿里云、腾讯云)

防火墙默认策略:
  - 通常拒绝所有入站连接
  - 允许所有出站连接

案例

复制代码
网络配置正确,防火墙阻止导致连接失败

检查:
# Windows
netsh advfirewall firewall show rule name=all | findstr "3306"

# Linux
iptables -L -n | grep 3306
firewall-cmd --list-ports

解决:
# Windows添加防火墙规则
netsh advfirewall firewall add rule name="MySQL" `
  dir=in action=allow protocol=TCP localport=3306

# Linux添加防火墙规则
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

误区5:TCP和UDP选错

错误认识

复制代码
"TCP和UDP不都是传输协议吗?随便选一个就行。"

正确理解

特性 TCP UDP
连接 面向连接(三次握手) 无连接
可靠性 可靠传输(确认应答) 不可靠传输
速度 较慢
资源消耗
适用场景 文件传输、邮件、网页 视频、语音、游戏
类比 电话通话 寄明信片

选择建议

复制代码
必须用TCP:
✅ 数据不能丢失(文件传输、数据库、邮件)
✅ 需要确认对方收到(HTTP、HTTPS、SSH、FTP、MySQL)

可以用UDP:
✅ 允许少量丢包(视频流、语音通话)
✅ 速度优先(在线游戏、DNS查询)

误区6:认为OSI模型过时

错误认识

复制代码
"TCP/IP才是实用的,OSI模型没用。"

正确理解

复制代码
OSI模型的价值:
1. 提供统一的框架(行业标准)
2. 帮助理解网络通信的本质
3. 故障排查时的分层思路
4. 网络设备厂商遵循的规范

TCP/IP的价值:
1. 互联网实际使用的协议栈
2. 更简洁实用(4层 vs 7层)
3. 所有网络设备都支持

结论:
→ 学习时用OSI模型理解概念
→ 工作时用TCP/IP模型排错
→ 两者互为补充,不是对立关系

📌 六、本节重点总结

核心要点

  1. 网络通信本质:数据封装→传输→解封装(像寄快递)

  2. 两个模型的关系

    • OSI七层模型:理论教科书
    • TCP/IP四层模型:实际工作标准
  3. 数据封装过程(发送端):

    复制代码
    应用数据 → 加TCP头 → 加IP头 → 加帧头 → 变成比特流
  4. 数据解封装过程(接收端):

    复制代码
    比特流 → 去帧头 → 去IP头 → 去TCP头 → 应用数据
  5. 分层排查思维(从下到上):

    复制代码
    物理层(网线)→ 数据链路层(MAC)→ 网络层(IP)→ 传输层(端口)→ 应用层(服务)
  6. 重点关注

    • ✅ 网络层:IP地址配置、路由
    • ✅ 传输层:端口号、防火墙
    • ✅ 应用层:HTTP、MySQL等协议
    • ⏳ 物理层、数据链路层:基本了解即可

记忆口诀

复制代码
OSI七层从下往上记:
物(物理)数(数据链路)网(网络)传(传输)
会(会话)表(表示)应(应用)

"物理叔网传,表情应用"

常用命令速记

复制代码
看配置:ipconfig /all
查路由:route print
测连通:ping IP
查端口:telnet IP 端口
查DNS:nslookup 域名
看ARP:arp -a
看连接:netstat -an
查路由:tracert 域名

第三部分:答案反馈与进阶

📝 答案详细点评

问题1:场景分析题

应用服务器 IP: 192.168.10.100

数据库服务器 IP: 192.168.10.200

测试结果:

✅ ping 192.168.10.200 成功

❌ telnet 192.168.10.200 3306 失败

❌ 应用无法连接数据库

复制代码
**请问**:
1. 这说明网络哪几层是正常的?
2. 问题最可能出在哪一层?
3. 您会优先检查什么?

您的答案

复制代码
1. 物理层、数据链路层、网络层 ✅ 完全正确
2. 传输层 ✅ 完全正确
3. 优先检查传输层,端口是否开放 ✅ 完全正确
第1问:网络哪几层正常?✅ 满分

正确答案:物理层、数据链路层、网络层

解析

复制代码
ping命令使用ICMP协议(网络层)

✅ ping成功 = 说明以下层都正常:

物理层 ✅
  → 网线插好了,电信号能传输
  → 网卡LED灯亮,接口状态UP

数据链路层 ✅
  → MAC地址能正确转发
  → 交换机学习到MAC地址
  → VLAN配置正确(同VLAN)

网络层 ✅
  → IP地址配置正确
  → 路由表有路由条目
  → ICMP包能到达目标并返回

记住 :ping通是网络通信的最低要求,相当于"路是通的",但不保证"门是开的"。

第2问:问题最可能出在哪一层?✅ 满分

您的答案:传输层 ✅

教师补充

为什么是传输层?

复制代码
telnet 192.168.10.200 3306 失败
→ 尝试建立TCP连接到目标端口3306
→ TCP三次握手无法完成
→ 说明传输层不通

传输层问题的3大常见原因

原因 占比 解决方案
防火墙阻止端口 60% 配置防火墙规则放行端口
服务未启动 25% 启动服务(systemctl start mysql)
服务未监听该端口 15% 检查配置文件(端口可能改了)
第3问:优先检查什么?✅ 满分

您的答案:优先检查传输层,端口是否开放 ✅

完整的排查步骤(按优先级):

复制代码
第1步:检查端口是否开放
────────────────────────────────
命令(在数据库服务器上执行):
  Linux:
    netstat -tulpn | grep 3306
    或
    ss -tulpn | grep 3306

  Windows:
    netstat -an | findstr "3306"

期望看到:
  tcp  0  0 0.0.0.0:3306  0.0.0.0:*  LISTEN
  ↑                   ↑        ↑
  TCP协议            监听地址  监听状态

如果看不到:说明MySQL没有启动,或端口不是3306


第2步:检查防火墙是否阻止
────────────────────────────────
命令(在数据库服务器上执行):
  Linux (firewalld):
    firewall-cmd --list-ports

  Linux (iptables):
    iptables -L -n | grep 3306

  Windows:
    netsh advfirewall firewall show rule name=all | findstr "3306"

如果端口不在列表中:需要添加防火墙规则


第3步:检查MySQL服务状态
────────────────────────────────
命令:
  systemctl status mysql
  或
  service mysql status

期望看到:
  Active: active (running)

如果显示 inactive/failed:需要启动服务
  systemctl start mysql
  systemctl enable mysql  # 开机自启


第4步:检查MySQL配置文件
────────────────────────────────
问题:MySQL可能只监听127.0.0.1(不允许远程连接)

配置文件位置:
  /etc/mysql/my.cnf
  或 /etc/my.cnf

检查项:
  bind-address = 127.0.0.1  ❌ 只允许本地
  bind-address = 0.0.0.0    ✅ 允许所有IP
  #bind-address             ✅ 注释掉也行

修改后重启:
  systemctl restart mysql

问题2:概念理解题

复制代码
(判断题)当您在浏览器输入 `www.baidu.com` 访问网站时:
- 您的电脑会先发送"百度首页"的请求内容,再层层加IP地址、MAC地址等包装     正确
- 还是先加IP地址、MAC地址等包装,最后才把"百度首页"的请求内容放进去?  错误

您的答案

复制代码
✅ 先发送"百度首页"的请求内容,再层层加IP地址、MAC地址等包装
❌ 先加IP地址、MAC地址等包装,最后才把"百度首页"的请求内容放进去

🎯 数据封装过程详解

完整的封装流程(以访问百度为例)

复制代码
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第1步】应用层生成数据
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
您在浏览器输入:www.baidu.com

浏览器生成HTTP请求:
  GET / HTTP/1.1
  Host: www.baidu.com
  User-Agent: Mozilla/5.0...
  (空的)

这是"原始数据",就像您要寄的文件内容

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第2步】传输层加上TCP头(端口信息)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TCP层加上自己的控制信息:

  ┌─────────────────────────────────┐
  │ 源端口: 54321(随机端口)        │
  │ 目标端口: 80(HTTP端口)         │
  │ 序列号: 1001                    │
  │ 确认号: 0                       │
  │ 标志位: SYN(建立连接)          │
  ├─────────────────────────────────┤
  │ GET / HTTP/1.1                  │ ← 应用层数据
  │ Host: www.baidu.com             │
  └─────────────────────────────────┘

就像给文件装进信封,贴上快递单号

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第3步】网络层加上IP头(地址信息)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
IP层加上自己的控制信息:

  ┌─────────────────────────────────┐
  │ 版本: 4                         │
  │ 源IP: 192.168.1.100             │
  │ 目标IP: 220.181.38.148          │ ← 百度IP
  │ TTL: 64                         │
  │ 协议: 6(TCP)                    │
  ├─────────────────────────────────┤
  │ 源端口: 54321  目标端口: 80     │ ← TCP头
  │ 序列号: 1001                    │
  ├─────────────────────────────────┤
  │ GET / HTTP/1.1                  │ ← 应用数据
  └─────────────────────────────────┘

就像给信封装进纸箱,写上收件地址

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第4步】数据链路层加上以太网头(MAC地址)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以太网层加上自己的控制信息:

  ┌─────────────────────────────────┐
  │ 源MAC: AA:AA:AA:AA:AA:AA        │
  │ 目标MAC: BB:BB:BB:BB:BB:BB      │ ← 网关MAC
  │ 类型: 0x0800(IP协议)            │
  ├─────────────────────────────────┤
  │ 源IP: 192.168.1.100             │ ← IP头
  │ 目标IP: 220.181.38.148          │
  ├─────────────────────────────────┤
  │ 源端口: 54321  目标端口: 80     │ ← TCP头
  ├─────────────────────────────────┤
  │ GET / HTTP/1.1                  │ ← 应用数据
  └─────────────────────────────────┘

就像给纸箱贴上运输标签,准备装车

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【第5步】物理层转换成比特流
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
将整个数据帧转换成二进制0和1:

  01010101010101010110101010101010
  11010101010101010101010101010101
  10101010101010101010101010101010
  ...

变成电信号(网线)或光信号(光纤)发送出去

就像快递卡车开上高速公路

关键要点:数据是"从内到外"层层包装的

复制代码
         应用层数据(最里面的核心)
              ↓
         ┌─────────┐
         │ TCP头   │ ← 第1层包装
         ├─────────┤
         │ IP头    │ ← 第2层包装
         ├─────────┤
         │ 以太网头│ ← 第3层包装
         └─────────┘
              ↓
         比特流(发送)

记住先有数据,再加包装! 就像:

  • 先写好文件 → 再装信封 → 再装纸箱 → 再贴标签
  • 不是先准备好纸箱和标签,再在里面放文件

🎓 进阶知识点补充

知识点1:为什么需要分层?

问题:为什么不直接发送数据,要分这么多层?

答案分工合作,各司其职

复制代码
类比:建造房子

如果不分层:
  一个人要同时懂:
  - 打地基(物理层)
  - 盖楼体(数据链路层)
  - 装水电(网络层)
  - 装修(传输层)
  - 摆家具(应用层)
  → 效率低,容易出错

如果分层:
  专业分工:
  - 土木工程师负责地基和楼体
  - 水电工程师负责水管电线
  - 室内设计师负责装修
  - 用户负责摆家具
  → 效率高,责任明确

网络分层的好处

  1. 模块化:每一层专注自己的职责
  2. 可替换:某一层技术改变,不影响其他层
  3. 标准化:不同厂商设备可以互联互通
  4. 易调试:出问题时可以逐层排查

例子

复制代码
物理层可以升级:
  网线 → 光纤 → 5G无线
  不影响上面的IP地址、TCP、HTTP等

应用层可以创新:
  HTTP → HTTP/2 → HTTPS → HTTP/3
  不影响下面的TCP、IP、以太网等

知识点2:TCP三次握手(传输层核心概念)

问题:为什么telnet端口时要说"三次握手"?

答案建立可靠的TCP连接需要三个步骤

复制代码
客户端                        服务器
  │                             │
  │  ① SYN(我要连接你)          │
  │──────────────────────────→  │
  │                             │
  │  ② SYN+ACK(好的,我也连接你) │
  │←───────────────────────────│
  │                             │
  │  ③ ACK(好的,连接建立)       │
  │──────────────────────────→  │
  │                             │
     TCP连接建立成功!
     可以传输数据了

为什么是三次,不是两次?

复制代码
两次握手的问题:
  客户端发送的连接请求如果在中途滞留
  → 客户端重发请求
  → 连接建立后,第一个请求终于到达
  → 服务器误以为客户端要建立新连接
  → 资源浪费

三次握手的好处:
  双方都确认对方"活着"且"愿意连接"
  建立可靠的连接

实际抓包示例(Wireshark看到的):

复制代码
帧1: 客户端 → 服务器
  [SYN] Seq=0
  "我可以连接吗?"

帧2: 服务器 → 客户端
  [SYN, ACK] Seq=0 Ack=1
  "可以,我可以连接你吗?"

帧3: 客户端 → 服务器
  [ACK] Seq=1 Ack=1
  "好的,连接建立!"

帧4开始:传输HTTP数据

telnet失败的原因

复制代码
telnet 192.168.10.200 3306

如果卡在"正在连接..."
  → 第1步SYN发出去了,但没收到第2步SYN+ACK
  → 原因:端口未开放,或防火墙丢弃了SYN包

如果立即显示"无法打开连接"
  → 本地立即拒绝
  → 原因:IP地址格式错误,或本地有防火墙阻止

知识点3:ICMP协议(ping命令背后的协议)

问题:ping为什么能检测网络连通性?

答案ping使用ICMP协议,属于网络层

复制代码
ping 192.168.10.200 实际发生:

客户端                        服务器
  │                             │
  │  ICMP Echo Request         │
  │  (有人在吗?)                │
  │──────────────────────────→  │
  │                             │
  │  ICMP Echo Reply            │
  │  (有人!)                    │
  │←───────────────────────────│
  │                             │
     ping成功 = 收到Echo Reply

ICMP协议特点

特性 说明
所属层 网络层(第3层)
协议号 IP协议头中的协议号 = 1
传输层 不使用TCP或UDP
端口 无端口号
用途 网络诊断、错误报告

ICMP消息类型

复制代码
类型8:Echo Request(请求)
  → ping发送的包

类型0:Echo Reply(回复)
  → ping收到的包

类型11:Time Exceeded(超时)
  → TTL过期,路由器返回

类型3:Destination Unreachable(目标不可达)
  → 网络、主机、端口不可达

为什么ping通但telnet不通?

复制代码
ping使用ICMP(网络层)
  → 只要路由可达就能ping通
  → 不需要端口号
  → 就像"敲门看看有人在家"

telnet使用TCP(传输层)
  → 需要建立TCP连接
  → 需要端口开放
  → 就像"敲门并请求进门"

类比:
  ping = 敲门,确认房子在 ✅
  telnet = 敲门,请求进屋 ❌ 屋主不开门

知识点4:ARP协议(IP地址与MAC地址的桥梁)

问题:有了IP地址,为什么还需要MAC地址?

答案IP用于跨网段路由,MAC用于同网段转发

复制代码
场景:PC1要给PC2发数据

PC1:192.168.1.10  MAC: AA:AA:AA:AA
PC2:192.168.1.20  MAC: BB:BB:BB:BB

步骤1:PC1知道PC2的IP(192.168.1.20)
步骤2:但PC1不知道PC2的MAC地址
步骤3:PC1广播ARP请求:
        "谁是192.168.1.20?请告诉我你的MAC"
步骤4:PC2收到后回复:
        "我是192.168.1.20,我的MAC是BB:BB:BB:BB"
步骤5:PC1现在可以直接发送数据给PC2

ARP缓存表

复制代码
PC1的ARP表:

IP地址            MAC地址
192.168.1.1      AA:BB:CC:DD:EE:FF  (网关)
192.168.1.20     BB:BB:BB:BB:BB:BB  (PC2)
192.168.1.30     CC:CC:CC:CC:CC:CC  (PC3)

查看ARP表:
  Windows: arp -a
  Linux: arp -n

ARP工作流程

复制代码
场景:ping 192.168.1.20

PC1检查ARP表:
  "192.168.1.20的MAC是什么?"
  → ARP表中没有
  → 发送ARP请求广播

ARP请求(广播):
  "谁有192.168.1.20?请告诉我你的MAC"
  → 所有同网段设备都收到

PC2回复(单播):
  "我是192.168.1.20,MAC是BB:BB:BB:BB"
  → 只回复给PC1

PC1更新ARP表,然后发送ping数据:
  目标IP: 192.168.1.20
  目标MAC: BB:BB:BB:BB:BB:BB

ARP缓存超时

复制代码
ARP表项有生存时间(通常2-5分钟)
超时后会删除,下次需要重新ARP解析

为什么需要超时?
  → 设备可能更换网卡
  → IP地址可能改变
  → 保证ARP表的准确性

🛠️ 实战技巧总结

技巧1:快速判断网络问题的层级

复制代码
┌─────────────────────────────────────────┐
│ 网络故障快速定位表                      │
├─────────────────────────────────────────┤
│ 故障现象                可能问题层级    │
├─────────────────────────────────────────┤
│ 网线灯不亮            物理层(网线)      │
│ ping不同网段IP        网络层(路由)      │
│ ping同网段IP失败      物理层/数据链路层 │
│ ping通但域名解析失败  应用层(DNS)       │
│ ping通但端口不通      传输层(端口/防火墙)│
│ 端口通但应用报错      应用层(服务配置)  │
└─────────────────────────────────────────┘

技巧2:常用排查命令组合

复制代码
【场景1:网络完全不通】
步骤1:检查本地IP
  ipconfig /all

步骤2:ping网关
  ping 192.168.1.1

步骤3:ping外网IP
  ping 8.8.8.8

步骤4:ping域名
  ping www.baidu.com


【场景2:能ping通但应用无法连接】
步骤1:ping测试
  ping 192.168.1.200  ✅

步骤2:端口测试
  telnet 192.168.1.200 3306  ❌

步骤3:在目标服务器检查
  netstat -tulpn | grep 3306
  firewall-cmd --list-ports

步骤4:检查服务状态
  systemctl status mysql


【场景3:DNS解析失败】
步骤1:ping IP测试
  ping 8.8.8.8  ✅

步骤2:ping域名测试
  ping www.baidu.com  ❌

步骤3:DNS解析测试
  nslookup www.baidu.com

步骤4:修改DNS
  改为 114.114.114.114 或 8.8.8.8

技巧3:Wireshark抓包技巧

复制代码
【过滤器表达式】

查看特定IP:
  ip.addr == 192.168.1.100

查看特定端口:
  tcp.port == 3306

查看HTTP请求:
  http.request.method == "GET"

查看TCP三次握手:
  tcp.flags.syn == 1 && tcp.flags.ack == 0

查看ping包:
  icmp

查看特定协议:
  dns || http || mysql

【常用操作】
1. 选择网卡开始捕获
2. 操作(访问网站、ping等)
3. 停止捕获
4. 使用过滤器过滤
5. 右键 → "追踪流" → "TCP流" 查看完整对话

📝 课后作业

作业1:案例分析(必做)

场景

复制代码
公司网络:
  网段1:192.168.10.0/24(办公区)
  网段2:192.168.20.0/24(服务器区)

应用服务器:192.168.20.100
  部署在服务器区
  MySQL端口:3306
  防火墙已配置规则

您的笔记本:192.168.10.50
  部署在办公区

测试结果:
✅ ping 192.168.20.100 成功
❌ telnet 192.168.20.100 3306 失败

问题

  1. 这是几层的问题?(物理/数据链路/网络/传输/应用) 传输层 3306被防火墙拦截
  2. 您会依次检查什么?(至少3项)物理层、数据链路层、网络层
  3. 给出您的排查命令(至少2个)ip a(查看网卡的状态)、telnet 192.168.20.100 3306

作业2:概念巩固(选做)

填空题

  1. ping命令使用__ICMP__协议,属于__网络__层
  2. telnet命令使用__TCP__协议,属于__传输层__层
  3. TCP建立连接需要__3__次握手
  4. MAC地址有_48___位,IP地址有__32__位(IPv4)
  5. ARP协议的作用是:__IP__地址转换为__MAC__地址
相关推荐
wwangxu2 小时前
路由与交换技术基础
网络协议·tcp/ip·udp
河码匠2 小时前
VXLAN 简介、实现虚拟机跨物理机通信和网络隔离
网络·vxlan
旖旎夜光3 小时前
Linux(11)(中)
linux·网络
猿码优创4 小时前
过滤境外ip和域名访问的解决方案
网络·网络协议·tcp/ip·安全·阿里云
北京耐用通信5 小时前
耐达讯自动化Profibus光纤链路模块:跨行业通信的“隐形桥梁”,让控制更丝滑!
人工智能·网络协议·自动化·信息与通信
code bean6 小时前
深入理解:NO_PROXY 如何绕过代理
网络·代理
归去来?6 小时前
记录一次从https接口提取25G大文件csv并落表的经历
大数据·数据仓库·hive·python·网络协议·5g·https
lkbhua莱克瓦246 小时前
深入理解HTTP协议:从理论到SpringBoot实践
网络·笔记·后端·网络协议·http·javaweb
华硕之声6 小时前
苏式废土美学游戏
网络·数据·华硕