从 DHCP 获取IP → DNS 域名解析 → TCP连接 → HTTP请求,彻底讲清楚!
DHCP(Dynamic Host Configuration Protocol)是局域网协议,用于自动分配IP地址。当你连接Wi-Fi时,设备会从路由器自动获取IP地址、子网掩码、网关和DNS服务器地址。
客户端广播:255.255.255.255:67 → "我是新来的(MAC: aa:bb:cc:dd:ee:ff),谁能给我一个IP?"
广播 · UDP 67/68 源IP: 0.0.0.0
服务器响应:192.168.1.1:67 → "我这儿有 192.168.1.100,你要不要?租期24小时。"
可能多个服务器响应,客户端选第一个
客户端广播:255.255.255.255:67 → "好的,我就要 192.168.1.100!通知所有人。"
广播 · 通知所有服务器选择了谁
服务器: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 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", // 主机名
}
| 时间点 | 事件 | 行为 | 说明 |
|---|---|---|---|
| T = 0 | 分配 | 获得IP,租约开始 | 客户端可使用该IP |
| T = 50% | 续租(单播) | 向原服务器发 Request | 若成功,租期重置为100% |
| T = 87.5% | 续租(广播) | 广播 Request 给所有服务器 | 若成功,租期重置 |
| T = 100% | 过期 | 停止使用IP,需重新Discover | IP可能被分配给其他设备 |
IP地址是稀缺资源!租约机制让长时间不用的设备释放IP,供其他设备使用。比如你离开公司Wi-Fi范围,IP会在租期到期后自动回收。
| 对比项 | 家用路由器 | 企业DHCP服务器 |
|---|---|---|
| IP池大小 | 通常 192.168.1.100~199(100个) | 可配置数千个 |
| 租期 | 24小时(常见) | 8小时或自定义 |
| 固定IP(保留) | 支持(MAC绑定) | 支持(IP Reservation) |
| 多子网 | 不支持 | 支持(DHCP Relay/Helper) |
DNS(Domain Name System)是互联网的电话簿。它将人类可读的域名(如 www.baidu.com)转换为机器可读的IP地址(如 220.181.38.149)。
⚠️ 注意:DNS默认使用 UDP 53 端口,只在数据超过512字节或特殊场景下使用TCP 53。
浏览器缓存 → 操作系统缓存 → /etc/hosts(或 Windows hosts 文件)
先查本地,命中则直接返回,超快!
向ISP的DNS服务器(如 8.8.8.8)发送查询请求
UDP Port 53 · 递归查询
全球13组根服务器(标号A-M),返回 .com 顶级域服务器地址
根服务器不直接解析域名,只指路
查询 baidu.com 的权威域名服务器(Name Server)地址
ns1.baidu.com 返回最终IP:220.181.38.149
最终结果,带TTL缓存时间
IPv4地址记录
例:www.baidu.com → 220.181.38.149
IPv6地址记录
例:www.google.com → 2404:6800:4008:c17::65
别名记录
例:www.baidu.com → www.a.shifen.com
邮件交换记录
指定邮件服务器地址
域名服务器记录
指定该域名的权威DNS服务器
文本记录
用于域名验证、SPF反垃圾邮件等
反向解析记录
IP → 域名(用于邮件反垃圾)
起始授权记录
存储区传送、刷新间隔等管理信息
| 缓存位置 | 缓存时间 | 说明 |
|---|---|---|
| 浏览器缓存 | 约60秒~几分钟 | Chrome: chrome://net-internals/#dns |
| 操作系统缓存 | 依TTL而定 | Windows: ipconfig /displaydnsmacOS: dscacheutil -statistics |
| 路由器缓存 | 依TTL而定 | 家用路由器通常也会缓存 |
| ISP DNS缓存 | 依TTL而定 | 递归DNS服务器的缓存 |
TTL是DNS记录的一个字段,表示"缓存有效时间"(秒)。例如TTL=300表示缓存5分钟。修改DNS记录后,需要等待TTL过期才能全球生效,这就是"DNS传播延迟"。
在浏览器输入 https://www.baidu.com 并按回车,到页面显示,究竟发生了什么?下面一步步拆解!
解析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
www.baidu.com → 220.181.38.149,详见DNS章节
如果目标IP不在同一子网,则先ARP查询默认网关(路由器)的MAC地址
# 查看ARP缓存 arp -a # 输出示例: # ? (192.168.1.1) at aa:bb:cc:dd:ee:01 [ether] on en0
SYN → SYN+ACK → ACK,建立可靠连接
客户端 → 服务器: SYN, seq=1000 (我想连接,我的初始序号是1000) 服务器 → 客户端: SYN+ACK, seq=5000, ack=1001 (好的,我的序号是5000,确认你的1000) 客户端 → 服务器: ACK, seq=1001, ack=5001 (确认,连接建立!)
协商加密算法、验证证书、生成会话密钥(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请求报文
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)→ 应用服务器 → 数据库 → 返回结果
状态码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)
TCP四次挥手(或连接复用,发送下一个请求)
客户端 → 服务器: FIN, ACK (我数据发完了,准备关闭) 服务器 → 客户端: ACK (知道了) 服务器 → 客户端: FIN, ACK (我这边也发完了) 客户端 → 服务器: ACK (好的,连接关闭)
发送方逐层封装(加头),接收方逐层解封装(去头)。每一层只关心自己的头部信息。
| 层级 | PDU名称 | 关键头部字段 | 地址类型 |
|---|---|---|---|
| 应用层 | 消息(Message) | HTTP方法、URL、状态码 | 无(应用定义) |
| 传输层(TCP) | 段(Segment) | 源端口、目标端口、seq、ack、标志位 | 端口号(0~65535) |
| 网络层(IP) | 包(Packet) | 源IP、目标IP、TTL、协议号 | IP地址 |
| 数据链路层 | 帧(Frame) | 源MAC、目标MAC、类型 | MAC地址 |
| 物理层 | 比特(Bit) | 无(纯电信号/光信号) | 无 |
| 类型 | 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分配 | ✅ 可以直接访问 |
IPv4地址只有约42亿个,早已不够用!NAT让多个设备共享一个公网IP,通过端口号区分不同设备的内网流量。这是IPv4能撑到今天的关键技术之一(另一个是关键技术之二的CIDR)。
| 对比维度 | TCP(传输控制协议) | UDP(用户数据报协议) |
|---|---|---|
| 连接性 | 面向连接(三次握手) | 无连接(即发即走) |
| 可靠性 | 可靠(确认、重传、排序) | 不可靠(不保证送达) |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有(慢启动、拥塞避免) | 无 |
| 速度 | 较慢(握手+确认开销) | 快(无握手,头部仅8字节) |
| 有序性 | 保证有序(seq序号) | 不保证(可能乱序) |
| 头部大小 | 20~60字节 | 8字节(固定) |
| 适用场景 | 网页、邮件、文件传输 | DNS、视频流、游戏、VoIP |
| 广播/多播 | 不支持 | 支持 |
🌐 网络原理可视化教程 | DHCP · DNS · TCP/IP · NAT · HTTP 全流程
作者:WorkBuddy AI · 暗色主题自包含交互式HTML