🌐 网络访问原理完整解析

从 DHCP 获取IP → DNS 域名解析 → TCP连接 → HTTP请求,彻底讲清楚!

📡

DHCP — 动态主机配置协议

DHCP(Dynamic Host Configuration Protocol)是局域网协议,用于自动分配IP地址。当你连接Wi-Fi时,设备会从路由器自动获取IP地址、子网掩码、网关和DNS服务器地址。

🎯 DHCP 四步握手(DORA)

DORA = Discover → Offer → Request → Acknowledge
1

DHCP Discover(发现)

客户端广播:255.255.255.255:67 → "我是新来的(MAC: aa:bb:cc:dd:ee:ff),谁能给我一个IP?"

广播 · UDP 67/68 源IP: 0.0.0.0

2

DHCP Offer(提供)

服务器响应:192.168.1.1:67 → "我这儿有 192.168.1.100,你要不要?租期24小时。"

可能多个服务器响应,客户端选第一个

3

DHCP Request(请求)

客户端广播:255.255.255.255:67 → "好的,我就要 192.168.1.100!通知所有人。"

广播 · 通知所有服务器选择了谁

4

DHCP Acknowledge(确认)

服务器:192.168.1.1:67 → "确认!IP 192.168.1.100 归你了,同时下发:网关 192.168.1.1、DNS 8.8.8.8、子网掩码 255.255.255.0"

租约生效,T1=50%时自动续租

📦 DHCP 报文关键字段

// DHCP Discover 报文结构(简化)
struct dhcp_msg {
  uint8  op   = 1;        // 1=BOOTREQUEST, 2=BOOTREPLY
  uint8  htype= 1;        // 硬件类型:1=以太网
  uint8  hlen = 6;        // MAC地址长度(6字节)
  uint8  hops = 0;
  uint32 xid;              // 事务ID(随机生成,标识本次会话)
  uint16 secs = 0;
  uint16 flags= 0x8000;   // 广播标志位
  uint32 ciaddr= 0;       // 客户端IP(0.0.0.0 = 未知)
  uint32 yiaddr;           // 你的IP(服务器Offer时填入)
  uint32 siaddr;           // 服务器IP
  uint8  chaddr[16];      // 客户端MAC地址
  uint8  options[];       // 选项字段(关键!)
};

// options 字段示例:
options = {
  53: 1,              // message_type = Discover
  55: [1,3,6,15,28], // 请求的参数:子网掩码(1), 路由器(3), DNS(6), 域名(15), 广播地址(28)
  61: "aa:bb:cc:dd:ee:ff", // 客户端标识符(MAC)
  12: "my-device",     // 主机名
}

⏰ DHCP 租约机制(Lease Time)

时间点事件行为说明
T = 0分配获得IP,租约开始客户端可使用该IP
T = 50%续租(单播)向原服务器发 Request若成功,租期重置为100%
T = 87.5%续租(广播)广播 Request 给所有服务器若成功,租期重置
T = 100%过期停止使用IP,需重新DiscoverIP可能被分配给其他设备

💡 为什么需要租约?

IP地址是稀缺资源!租约机制让长时间不用的设备释放IP,供其他设备使用。比如你离开公司Wi-Fi范围,IP会在租期到期后自动回收。

🏠 家用场景 vs 🏢 企业场景

对比项家用路由器企业DHCP服务器
IP池大小通常 192.168.1.100~199(100个)可配置数千个
租期24小时(常见)8小时或自定义
固定IP(保留)支持(MAC绑定)支持(IP Reservation)
多子网不支持支持(DHCP Relay/Helper)
🔍

DNS — 域名系统

DNS(Domain Name System)是互联网的电话簿。它将人类可读的域名(如 www.baidu.com)转换为机器可读的IP地址(如 220.181.38.149)。

⚠️ 注意:DNS默认使用 UDP 53 端口,只在数据超过512字节或特殊场景下使用TCP 53。

🌳 DNS 层级结构(树状)

🔄 DNS 递归查询流程

1

检查本地缓存

浏览器缓存 → 操作系统缓存 → /etc/hosts(或 Windows hosts 文件)

先查本地,命中则直接返回,超快!

2

查询递归DNS服务器

向ISP的DNS服务器(如 8.8.8.8)发送查询请求

UDP Port 53 · 递归查询

3

根域名服务器(Root Server)

全球13组根服务器(标号A-M),返回 .com 顶级域服务器地址

根服务器不直接解析域名,只指路

4

顶级域服务器(TLD Server)

查询 baidu.com 的权威域名服务器(Name Server)地址

5

权威域名服务器(Authoritative NS)

ns1.baidu.com 返回最终IP:220.181.38.149

最终结果,带TTL缓存时间

📝 DNS 记录类型详解

A

IPv4地址记录
例:www.baidu.com → 220.181.38.149

AAAA

IPv6地址记录
例:www.google.com → 2404:6800:4008:c17::65

CNAME

别名记录
例:www.baidu.com → www.a.shifen.com

MX

邮件交换记录
指定邮件服务器地址

NS

域名服务器记录
指定该域名的权威DNS服务器

TXT

文本记录
用于域名验证、SPF反垃圾邮件等

PTR

反向解析记录
IP → 域名(用于邮件反垃圾)

SOA

起始授权记录
存储区传送、刷新间隔等管理信息

⚡ DNS 缓存机制

缓存位置缓存时间说明
浏览器缓存约60秒~几分钟Chrome: chrome://net-internals/#dns
操作系统缓存依TTL而定Windows: ipconfig /displaydns
macOS: dscacheutil -statistics
路由器缓存依TTL而定家用路由器通常也会缓存
ISP DNS缓存依TTL而定递归DNS服务器的缓存

💡 TTL(Time To Live)是什么?

TTL是DNS记录的一个字段,表示"缓存有效时间"(秒)。例如TTL=300表示缓存5分钟。修改DNS记录后,需要等待TTL过期才能全球生效,这就是"DNS传播延迟"。

🚀

完整网络访问流程

在浏览器输入 https://www.baidu.com 并按回车,到页面显示,究竟发生了什么?下面一步步拆解!

🎬 完整流程动画

① URL 解析

浏览器第一步

解析URL各部分:https → 协议,www.baidu.com → 主机名,443 → 默认端口,/ → 路径

URL: https://www.baidu.com:443/search?q=hello#section1
协议: https
主机: www.baidu.com
端口: 443(https默认)
路径: /
查询: q=hello
哈希: section1

② DNS 域名解析

将域名转换为IP地址

www.baidu.com → 220.181.38.149,详见DNS章节

③ ARP 地址解析(同一局域网内)

IP → MAC,链路层寻址

如果目标IP不在同一子网,则先ARP查询默认网关(路由器)的MAC地址

# 查看ARP缓存
arp -a
# 输出示例:
# ? (192.168.1.1) at aa:bb:cc:dd:ee:01 [ether] on en0

④ 建立 TCP 三次握手

可靠连接的前提

SYN → SYN+ACK → ACK,建立可靠连接

客户端 → 服务器: SYN, seq=1000      (我想连接,我的初始序号是1000)
服务器 → 客户端: SYN+ACK, seq=5000, ack=1001  (好的,我的序号是5000,确认你的1000)
客户端 → 服务器: ACK, seq=1001, ack=5001      (确认,连接建立!)

⑤ TLS 握手(HTTPS 专用)

建立加密通道

协商加密算法、验证证书、生成会话密钥(TLS 1.3只需1-RTT!)

TLS 1.2: 需要2-RTT(往返两次)
  1. ClientHello → 
  2. ← ServerHello + 证书 + Key Exchange
  3. ClientKeyExchange →
  4. ← Finished

TLS 1.3: 只需1-RTT!
  1. ClientHello(含密钥共享参数) →
  2. ← ServerHello + 证书 + Finished
  3. 客户端验证后立即发送 HTTP 请求

⑥ 发送 HTTP 请求

真正的数据传输开始

浏览器发送HTTP请求报文

GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: ...

⑦ 服务器处理请求

后端处理链路

负载均衡 → Web服务器(Nginx)→ 应用服务器 → 数据库 → 返回结果

⑧ 返回 HTTP 响应

服务器 → 浏览器

状态码200,HTML内容,响应头

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 2443
Server: BWS/1.1
Cache-Control: private

<!DOCTYPE html>
<html>...(HTML内容)...

⑨ 浏览器渲染页面

解析 → 布局 → 绘制

构建DOM树 → 构建CSSOM树 → 合并渲染树 → 布局(Layout)→ 绘制(Paint)→ 合成(Composite)

⑩ 断开连接(或复用)

HTTP/1.1 默认 Keep-Alive

TCP四次挥手(或连接复用,发送下一个请求)

客户端 → 服务器: FIN, ACK   (我数据发完了,准备关闭)
服务器 → 客户端: ACK           (知道了)
服务器 → 客户端: FIN, ACK     (我这边也发完了)
客户端 → 服务器: ACK           (好的,连接关闭)

🌐 TCP/IP 协议栈(分层模型)

📱 应用层(L7):HTTP/HTTPS · DNS · DHCP · FTP · SMTP
📦 传输层(L4):TCP(可靠)· UDP(快速)
🌍 网络层(L3):IP(寻址和路由)· ICMP · ARP
📡 数据链路层(L2):以太网 · Wi-Fi(802.11)· MAC地址
🔌 物理层(L1):电信号 · 光信号 · 双绞线 · 光纤
📦

数据包封装与解封装

发送方逐层封装(加头),接收方逐层解封装(去头)。每一层只关心自己的头部信息。

📥 封装过程(发送方,自顶向下)

📤 解封装过程(接收方,自底向上)

📋 各层数据包结构

层级PDU名称关键头部字段地址类型
应用层消息(Message)HTTP方法、URL、状态码无(应用定义)
传输层(TCP)段(Segment)源端口、目标端口、seq、ack、标志位端口号(0~65535)
网络层(IP)包(Packet)源IP、目标IP、TTL、协议号IP地址
数据链路层帧(Frame)源MAC、目标MAC、类型MAC地址
物理层比特(Bit)无(纯电信号/光信号)

🔧 关键端口号速查

53
DNS
UDP/TCP · 域名解析
67/68
DHCP
UDP · IP自动分配
80
HTTP
TCP · 网页访问
443
HTTPS
TCP · 加密网页
22
SSH
TCP · 远程登录
21
FTP
TCP · 文件传输
25
SMTP
TCP · 邮件发送
3306
MySQL
TCP · 数据库

🌍 私网IP vs 公网IP(NAT场景)

类型IP范围说明能否直连互联网
A类私网10.0.0.0 ~ 10.255.255.255大型企业内网❌ 需NAT
B类私网172.16.0.0 ~ 172.31.255.255中型企业网络❌ 需NAT
C类私网192.168.0.0 ~ 192.168.255.255家庭/小型办公❌ 需NAT
回环地址127.0.0.0 ~ 127.255.255.255本机内部通信❌ 仅本机
公网IP除上述范围全球唯一,IANA分配✅ 可以直接访问

🔄 NAT 网络地址转换(关键技术!)

💡 为什么需要NAT?

IPv4地址只有约42亿个,早已不够用!NAT让多个设备共享一个公网IP,通过端口号区分不同设备的内网流量。这是IPv4能撑到今天的关键技术之一(另一个是关键技术之二的CIDR)。

📊 TCP vs UDP 深度对比

对比维度TCP(传输控制协议)UDP(用户数据报协议)
连接性面向连接(三次握手)无连接(即发即走)
可靠性可靠(确认、重传、排序)不可靠(不保证送达)
流量控制有(滑动窗口)
拥塞控制有(慢启动、拥塞避免)
速度较慢(握手+确认开销)快(无握手,头部仅8字节)
有序性保证有序(seq序号)不保证(可能乱序)
头部大小20~60字节8字节(固定)
适用场景网页、邮件、文件传输DNS、视频流、游戏、VoIP
广播/多播不支持支持

🌐 网络原理可视化教程 | DHCP · DNS · TCP/IP · NAT · HTTP 全流程

作者:WorkBuddy AI · 暗色主题自包含交互式HTML