本文面向有一定基础但希望系统理解网络原理的读者。每个概念都会从以下几个方面展开:
-
解决什么问题
-
工作原理
-
关键技术细节
-
常见问题与排查方法
-
实操验证命令
建议收藏后阅读。
一、DNS:域名系统
1.1 问题背景
人类易记的是域名(如www.baidu.com),但网络通信依赖的是IP地址(如110.242.68.66)。DNS(Domain Name System)的作用就是在两者之间建立映射关系。
核心功能:将域名解析为IP地址。
1.2 DNS的层次化结构
DNS采用树状层次结构,从根到叶子依次为:
text
根域(.)
│
├── 顶级域(TLD):.com, .cn, .org, .net 等
│ │
│ └── 二级域:baidu.com, google.com 等
│ │
│ └── 主机名:www.baidu.com, mail.baidu.com 等
各级DNS服务器职责:
| 层级 | 服务器类型 | 职责 |
|---|---|---|
| 根域 | 根DNS服务器 | 返回顶级域服务器的地址(全球13组) |
| 顶级域 | TLD DNS服务器 | 返回权威域名服务器的地址 |
| 二级域 | 权威DNS服务器 | 返回具体的域名解析结果 |
1.3 递归查询与迭代查询
以客户端访问www.baidu.com为例:
递归查询(客户端→本地DNS服务器):
客户端只发一次请求,本地DNS服务器负责完成整个查询过程,最终返回结果。
迭代查询(本地DNS服务器→各级DNS服务器):
本地DNS服务器依次向根、TLD、权威服务器发起查询,每次返回下一级服务器的地址。
text
客户端 本地DNS服务器 根DNS .com DNS baidu DNS
│ │ │ │ │
│─── 递归查询 ─────────→│ │ │ │
│ │── 迭代查询 ──────→│ │ │
│ │←─ 返回.com地址 ───│ │ │
│ │─────────────────→│ │ │
│ │←─ 返回baidu地址 ─────────────────│ │
│ │─────────────────────────────────→│ │
│ │←─ 返回IP地址 ─────────────────────────────────────│
│←──── 返回IP地址 ─────│ │ │ │
1.4 DNS缓存机制
为提高效率,DNS采用多级缓存:
| 缓存位置 | 缓存内容 | 生效时间 |
|---|---|---|
| 浏览器 | 域名解析结果 | 几十秒到几分钟 |
| 操作系统 | DNS缓存 | 由TTL决定 |
| 本地DNS服务器 | 递归查询结果 | 由TTL决定 |
查看操作系统DNS缓存:
Windows:
cmd
ipconfig /displaydns # 查看缓存
ipconfig /flushdns # 清除缓存
Mac/Linux:
bash
sudo dscacheutil -flushcache # Mac
sudo systemd-resolve --flush-caches # Linux (systemd)
1.5 常见DNS记录类型
| 记录类型 | 用途 | 示例 |
|---|---|---|
| A | 域名→IPv4地址 | baidu.com → 110.242.68.66 |
| AAAA | 域名→IPv6地址 | baidu.com → 2400:da00:2::29 |
| CNAME | 域名别名 | www.baidu.com → baidu.com |
| MX | 邮件交换器 | baidu.com → mx.baidu.com |
| NS | 域名服务器 | baidu.com → ns.baidu.com |
| TXT | 文本记录 | 常用于验证 |
| PTR | IP地址→域名 | 反向解析 |
1.6 常用DNS诊断工具
nslookup(Windows/Linux通用):
cmd
nslookup www.baidu.com
nslookup -type=MX baidu.com # 查询MX记录
nslookup 8.8.8.8 # 反向解析
dig(Linux/Mac功能更强):
bash
dig www.baidu.com
dig +trace www.baidu.com # 显示完整解析路径
dig @8.8.8.8 www.baidu.com # 指定DNS服务器
1.7 经典故障:能上网但打不开网页
现象:即时通讯软件能登录,但浏览器打不开任何网页。
原因:DNS解析失败。
排查步骤:
cmd
ping 114.114.114.114 # 1. 测试网络连通性
nslookup www.baidu.com # 2. 测试DNS解析
nslookup www.baidu.com 8.8.8.8 # 3. 使用公共DNS测试
解决方案:将DNS修改为公共DNS。
修改DNS的方法:
Windows:
-
控制面板 → 网络和共享中心 → 更改适配器设置
-
右键网卡 → 属性 → Internet协议版本4(TCP/IPv4)
-
手动填入DNS服务器地址
Linux(Ubuntu):
bash
sudo nano /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
二、DHCP:动态主机配置协议
2.1 问题背景
如果没有DHCP,每台设备需要手动配置IP地址、子网掩码、网关、DNS。在大型网络中,手动配置不仅繁琐,还容易出错(如IP冲突)。
DHCP(Dynamic Host Configuration Protocol)自动为网络设备分配IP地址及相关配置信息。
2.2 DHCP的DORA四步交互
DHCP客户端和服务器之间的交互被称为DORA:
| 步骤 | 名称 | 方向 | 内容 |
|---|---|---|---|
| 1 | Discover | 客户端→广播 | "谁有IP地址可以给我?" |
| 2 | Offer | 服务器→广播/单播 | "我可以给你192.168.1.101" |
| 3 | Request | 客户端→广播 | "我请求使用这个IP" |
| 4 | Ack | 服务器→广播/单播 | "确认,这个IP归你了" |
抓包验证(需在DHCP获取IP时抓取):
bash
tcpdump -i eth0 -n port 67 or port 68
2.3 DHCP消息类型详解
| 消息类型 | 代码 | 发送方 | 说明 |
|---|---|---|---|
| DHCPDISCOVER | 1 | 客户端 | 寻找DHCP服务器 |
| DHCPOFFER | 2 | 服务器 | 提供IP地址 |
| DHCPREQUEST | 3 | 客户端 | 请求使用提供的IP |
| DHCPACK | 5 | 服务器 | 确认分配 |
| DHCPNAK | 6 | 服务器 | 拒绝请求 |
| DHCPRELEASE | 7 | 客户端 | 释放IP地址 |
| DHCPINFORM | 8 | 客户端 | 请求其他配置信息 |
2.4 租期与续租机制
DHCP分配的IP地址有租期(lease time),通常为24小时到7天。
续租时间点:
-
租期的50%:客户端尝试续租(发送DHCPREQUEST)
-
租期的87.5%:如果前次续租失败,再次尝试
租期计算:
text
租期到期时间 = 分配时间 + lease_time
2.5 DHCP分配的信息
| 选项编号 | 参数 | 说明 |
|---|---|---|
| 1 | 子网掩码 | 255.255.255.0 |
| 3 | 默认网关 | 192.168.1.1 |
| 6 | DNS服务器 | 114.114.114.114, 8.8.8.8 |
| 12 | 主机名 | 设备名称 |
| 15 | 域名 | localdomain |
| 42 | NTP服务器 | 时间同步 |
| 51 | 租期 | 86400秒 |
2.6 查看DHCP信息
Windows:
cmd
ipconfig /all # 查看DHCP信息
ipconfig /release # 释放IP
ipconfig /renew # 重新获取IP
Mac/Linux:
bash
ipconfig getpacket en0 # Mac
dhclient -v eth0 # Linux
# 查看租约文件(Linux)
cat /var/lib/dhcp/dhclient.leases
2.7 DHCP中继代理
当DHCP客户端和服务器不在同一个广播域时,需要在路由器上配置DHCP中继(DHCP Relay)。中继将广播的DHCPDISCOVER转换为单播转发给DHCP服务器。
配置示例(以某品牌设备为例):
text
interface vlan 10
ip helper-address 192.168.100.10
三、ARP:地址解析协议
3.1 问题背景
IP地址工作在网络层(第三层),但局域网内数据帧的转发依赖MAC地址(第二层)。ARP(Address Resolution Protocol)的作用是通过IP地址解析出对应的MAC地址。
3.2 ARP工作原理
以主机A(192.168.1.1)访问主机B(192.168.1.2)为例:
-
检查ARP缓存:主机A查找本地ARP表
-
发送ARP请求:如果没有,发送广播帧
-
源MAC:A的MAC
-
目标MAC:FF:FF:FF:FF:FF:FF(广播)
-
内容:"谁有192.168.1.2?请告诉192.168.1.1"
-
-
目标响应:主机B收到广播后回复单播
-
源MAC:B的MAC
-
目标MAC:A的MAC
-
内容:"192.168.1.2的MAC是xx:xx:xx:xx:xx:xx"
-
-
更新缓存:主机A将映射关系存入ARP缓存
3.3 ARP报文格式
| 字段 | 长度 | 说明 |
|---|---|---|
| 硬件类型 | 2字节 | 1=以太网 |
| 协议类型 | 2字节 | 0x0800=IPv4 |
| 硬件地址长度 | 1字节 | 6(MAC地址长度) |
| 协议地址长度 | 1字节 | 4(IPv4地址长度) |
| 操作码 | 2字节 | 1=请求,2=应答 |
| 源MAC地址 | 6字节 | 发送方硬件地址 |
| 源IP地址 | 4字节 | 发送方IP地址 |
| 目标MAC地址 | 6字节 | 请求时为0 |
| 目标IP地址 | 4字节 | 目标IP地址 |
3.4 ARP缓存管理
查看ARP缓存:
Windows:
cmd
arp -a # 查看所有
arp -a | findstr "192.168" # 过滤
Mac/Linux:
bash
arp -a
ip neigh # 使用ip命令
手动添加静态ARP条目:
Windows:
cmd
arp -s 192.168.1.100 00-11-22-33-44-55
Linux:
bash
arp -s 192.168.1.100 00:11:22:33:44:55
清除ARP缓存:
Windows:
cmd
arp -d # 清除所有
arp -d 192.168.1.100 # 清除单个
Mac/Linux:
bash
sudo arp -a -d # Mac
sudo ip neigh flush all # Linux
3.5 ARP欺骗与防御
ARP欺骗原理:
某些恶意程序发送伪造的ARP应答,声称自己是网关(或目标主机),导致流量被重定向到该程序。
防御方法:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 静态ARP | 手工绑定IP-MAC | 小型网络 |
| DAI | 交换机验证ARP包 | 企业网络 |
| 端口安全 | 限制端口MAC地址数量 | 接入层 |
| 网关防护 | 网关定期发送免费ARP | 通用 |
四、NAT:网络地址转换
4.1 问题背景
IPv4地址空间有限(约42.9亿个),无法满足全球设备需求。NAT(Network Address Translation)允许多个设备共享一个公网IP地址。
核心功能:将私有IP地址转换为公网IP地址。
4.2 NAT地址类型
| 地址类型 | 范围 | 特点 |
|---|---|---|
| 公网IP | 除私有地址外的所有 | 全球唯一,可在互联网路由 |
| 私有IP | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | 局域网内使用,不可路由 |
4.3 NAT的三种模式
| 模式 | 映射关系 | 适用场景 |
|---|---|---|
| 静态NAT | 1个私有IP ↔ 1个公网IP | 需要对外提供服务的服务器 |
| 动态NAT | 多个私有IP ↔ 地址池中的公网IP | 较少使用 |
| PAT | 多个私有IP ↔ 1个公网IP + 端口 | 最常见(家庭/企业上网) |
PAT原理图解:
text
内网 NAT设备 互联网
192.168.1.101:12345 ──→ 123.123.123.123:54321 ──→ 百度
192.168.1.102:12345 ──→ 123.123.123.123:54322 ──→ 百度
192.168.1.103:12345 ──→ 123.123.123.123:54323 ──→ 百度
NAT表:
┌─────────────────┬──────────────────┐
│ 内网地址:端口 │ 公网地址:端口 │
├─────────────────┼──────────────────┤
│ 192.168.1.101:12345 │ 123.123.123.123:54321 │
│ 192.168.1.102:12345 │ 123.123.123.123:54322 │
│ 192.168.1.103:12345 │ 123.123.123.123:54323 │
└─────────────────┴──────────────────┘
4.4 端口转发(Port Forwarding)
当外部需要主动访问内网服务器时,需要在路由器上配置端口转发。
示例:外网访问内网Web服务器
text
外网用户访问 123.123.123.123:80
↓
路由器查表:80端口 → 192.168.1.100:80
↓
内网Web服务器(192.168.1.100)响应
4.5 查看NAT映射(Linux)
bash
# 查看NAT表(iptables)
iptables -t nat -L -n -v
# 查看连接跟踪表
conntrack -L
五、TCP/IP协议族
5.1 TCP/IP四层模型
| 层级 | 名称 | 协议示例 | 数据单位 |
|---|---|---|---|
| 4 | 应用层 | HTTP, FTP, DNS, SSH | 消息 |
| 3 | 传输层 | TCP, UDP | 段/数据报 |
| 2 | 网络层 | IP, ICMP, ARP | 包 |
| 1 | 网络接口层 | 以太网, WiFi | 帧 |
5.2 TCP:传输控制协议
核心特点:
| 特性 | 说明 |
|---|---|
| 面向连接 | 通信前需建立连接(三次握手) |
| 可靠传输 | 确认重传机制 |
| 流量控制 | 滑动窗口协议 |
| 拥塞控制 | 慢启动、拥塞避免、快速重传 |
| 有序传输 | 序列号保证顺序 |
TCP头部格式:
text
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 源端口 | 目的端口 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 序列号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 确认号 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据偏移 | 保留 |U A P R S F| 窗口大小 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 校验和 | 紧急指针 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 选项(可选) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 数据 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
控制位:
U:URG(紧急)
A:ACK(确认)
P:PSH(推送)
R:RST(重置)
S:SYN(同步,用于建立连接)
F:FIN(结束,用于断开连接)
5.3 三次握手详解
text
客户端(主动打开) 服务器(被动打开)
│ │
│─────── SYN (seq=x) ───────────────→│ (1) 客户端请求连接
│ │
│←───── SYN+ACK (seq=y, ack=x+1) ────│ (2) 服务器确认并请求连接
│ │
│─────── ACK (seq=x+1, ack=y+1) ───→│ (3) 客户端确认
│ │
│←───────── 数据传输 ────────────────→│
序列号的作用:
-
保证数据有序到达
-
去重(丢弃重复包)
-
确认机制的基础
为什么不是两次:防止历史连接请求突然到达服务器。如果只有两次握手,服务器会直接建立连接,占用资源。
5.4 四次挥手详解
text
客户端 服务器
│ │
│─────── FIN (seq=u) ────────────────→│ (1) 客户端发送关闭请求
│ │
│←─────── ACK (ack=u+1) ──────────────│ (2) 服务器确认
│ │
│ (此时客户端不能再发数据,但可以接收) │
│ │
│←─────── FIN (seq=v) ────────────────│ (3) 服务器发送关闭请求
│ │
│─────── ACK (ack=v+1) ──────────────→│ (4) 客户端确认
│ │
│ (进入TIME_WAIT状态,等待2MSL) │
TIME_WAIT的作用:
-
确保最后一个ACK能被正确接收
-
确保旧连接的数据包在网络中超时消失
-
持续时间:2倍MSL(最大报文生存时间),通常1-4分钟
5.5 滑动窗口机制
TCP的滑动窗口用于流量控制。接收方通告自己的可用窗口大小,发送方根据窗口限制未确认数据量。
text
发送方 接收方
│ │
│←─────── window=4096 ─────────────────│ 接收方告知窗口大小
│ │
│─────── 发送4096字节 ────────────────→│
│ │
│←─────── ACK, window=2048 ───────────│ 接收方处理了部分数据
窗口缩放 :TCP选项Window Scale可将窗口从16位扩展至30位(最大1GB)。
5.6 拥塞控制
TCP拥塞控制算法(以CUBIC为例):
| 阶段 | 行为 | 标志 |
|---|---|---|
| 慢启动 | 指数增长(每RTT翻倍) | cwnd < ssthresh |
| 拥塞避免 | 线性增长(每RTT +1) | cwnd ≥ ssthresh |
| 快速重传 | 收到3个重复ACK立即重传 | 丢包检测 |
| 快速恢复 | 进入拥塞避免而非慢启动 | 避免过度降速 |
查看当前拥塞控制算法:
bash
# Linux
sysctl net.ipv4.tcp_congestion_control
# 查看支持的算法
sysctl net.ipv4.tcp_available_congestion_control
5.7 UDP:用户数据报协议
核心特点:
| 特性 | 说明 |
|---|---|
| 无连接 | 不需要握手 |
| 不可靠 | 不确认不重传 |
| 无序 | 不保证顺序 |
| 轻量 | 头部仅8字节 |
UDP头部格式:
text
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| 源端口 | 目的端口 |
+--------+--------+--------+--------+
| 长度 | 校验和 |
+--------+--------+--------+--------+
| 数据 |
+----------------------------------+
5.8 TCP vs UDP 对比
| 对比维度 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 确认重传 | 尽力而为 |
| 有序性 | 序列号保证 | 不保证 |
| 流量控制 | 滑动窗口 | 无 |
| 拥塞控制 | 有 | 无 |
| 头部大小 | 20-60字节 | 8字节 |
| 速度 | 较慢 | 较快 |
| 适用场景 | 网页、邮件、文件、SSH | 直播、DNS、语音、游戏 |
5.9 查看TCP连接状态
bash
# 查看所有TCP连接
netstat -an
# 查看监听的端口
netstat -an | grep LISTEN
# 查看已建立的连接
netstat -an | grep ESTABLISHED
# 查看连接统计(ss命令更高效)
ss -tan
TCP状态说明:
| 状态 | 说明 |
|---|---|
| LISTEN | 正在监听(服务端) |
| SYN-SENT | 发送SYN(客户端) |
| SYN-RECEIVED | 收到SYN,发送SYN+ACK |
| ESTABLISHED | 连接已建立 |
| FIN-WAIT-1 | 主动关闭,已发FIN |
| FIN-WAIT-2 | 主动关闭,收到ACK |
| CLOSE-WAIT | 被动关闭,收到FIN |
| TIME-WAIT | 等待2MSL |
| CLOSED | 关闭 |
六、综合验证示例
以下是一个完整的网络验证脚本,可用于排查基础网络问题:
bash
#!/bin/bash
# 网络连通性测试脚本
# 1. 测试本地协议栈
echo "=== 测试本地协议栈 ==="
ping -c 4 127.0.0.1
# 2. 查看IP配置
echo "=== 查看IP配置 ==="
ip addr show
# 3. 查看路由表
echo "=== 查看路由表 ==="
ip route show
# 4. 测试网关连通性
GATEWAY=$(ip route | grep default | awk '{print $3}')
echo "=== 测试网关 $GATEWAY ==="
ping -c 4 $GATEWAY
# 5. 测试外网连通性
echo "=== 测试外网连通性 ==="
ping -c 4 114.114.114.114
# 6. 测试DNS解析
echo "=== 测试DNS解析 ==="
nslookup www.baidu.com
# 7. 查看ARP表
echo "=== 查看ARP表 ==="
arp -a
# 8. 查看NAT连接(需要root)
echo "=== 查看NAT连接 ==="
sudo conntrack -L 2>/dev/null | head -20
七、总结对照表
| 概念 | 全称 | 层级 | 核心作用 | 关键协议/端口 |
|---|---|---|---|---|
| DNS | Domain Name System | 应用层 | 域名↔IP解析 | UDP/TCP 53 |
| DHCP | Dynamic Host Configuration Protocol | 应用层 | 自动分配IP | UDP 67/68 |
| ARP | Address Resolution Protocol | 网络层 | IP→MAC | 以太类型0x0806 |
| NAT | Network Address Translation | 网络层 | 地址转换 | - |
| TCP | Transmission Control Protocol | 传输层 | 可靠传输 | - |
| UDP | User Datagram Protocol | 传输层 | 不可靠传输 | - |
八、最后
本文详细讲解了DNS、DHCP、ARP、NAT、TCP/IP五个核心网络概念:
-
DNS:域名解析,互联网的通讯录
-
DHCP:自动分配IP,避免手动配置
-
ARP:IP找MAC,局域网通信的关键
-
NAT:地址转换,一个宽带养全家
-
TCP/IP:互联网的交通规则
加上上一篇文章的五个概念(子网掩码、网关、端口、MAC地址、VLAN),你已经具备了阅读网络知识的基础。