——从插上网线到网页加载的微观世界
场景设定:
- 设备:一台光猫、一台路由器(集成交换机功能)、一台电脑。
- 连接:光猫连接路由器 WAN 口,电脑连接路由器 LAN 口(视为连接在虚拟交换机上)。
- 目标:电脑从无网状态到成功访问
baidu.com。
第一阶段:获取身份(DHCP 协议)
在电脑刚插上网线时,它没有 IP 地址,就像一个没有身份证的人,无法在网络中通信。
1. DHCP Discover(发现)
- 触发:电脑连接网络,DHCP 客户端启动。
- 目的:寻找局域网内的 DHCP 服务器(通常是路由器)索要 IP。
- 封装细节:
- 传输层:使用 UDP 协议。源端口 68 (客户端),目标端口 67 (服务端)。
- 网络层:由于没有 IP,源 IP 填
0.0.0.0。由于不知道服务器在哪,目标 IP 填 广播地址255.255.255.255。 - 接口层:源 MAC 是本机网卡 MAC,目标 MAC 是 全F广播 (
FF:FF:FF:FF:FF:FF)。
- 交换机处理:交换机收到全 F 的 MAC 广播包,会将其**洪泛(Flooding)**转发给除来源口外的所有接口。
2. DHCP Offer(提供)
- 处理:路由器收到广播包,发现目标端口 67,由 DHCP 服务处理。
- 分配:从地址池选取一个未占用 IP(如
192.168.1.3),包含子网掩码、网关、DNS、租期(默认通常 12 小时/720 分钟)。 - 回复:路由器通过单播或广播(取决于实现)将 Offer 包发回给电脑。
3. DHCP Request & Ack(请求与确认)
- 流程:电脑收到 Offer 后,正式发送 Request 请求占用该 IP,路由器回复 Ack 确认。
- 租期续约机制:
- 租期过去 50% (6小时) 时,电脑会自动向服务器发送续约请求。
- 如果服务器无响应,在剩余 1/8 时间时会再次尝试。
- 如果彻底失联,租期结束后 IP 释放,电脑断网。
- 故障特征:如果电脑获取到
169.254.x.x开头的 IP,说明 DHCP 失败(无人响应),系统自动分配了链路本地地址,此时只能进行局域网通信,无法上网。
第二阶段:寻找目的地(DNS 解析)
电脑有了 IP 192.168.1.3,用户在浏览器输入了 baidu.com。机器不认识域名,只认识 IP,必须通过 DNS 解析。
1. 构建 DNS 请求
- 内容:“请问
baidu.com的 IP 是多少?” - 目标:发送给预设的 DNS 服务器(通常是网关/路由器 IP
192.168.1.1)。 - 封装:UDP 协议,目标端口 53。
2. 拦路虎:ARP 协议(地址解析)
- 问题:数据包要发给路由器(IP
192.168.1.1),但封装到物理层需要对方的 MAC 地址。电脑查本地 ARP 缓存表,发现是空的。 - 解决:发送 ARP 广播请求。
- 内容:“我是
192.168.1.3,谁是192.168.1.1?请告诉我你的 MAC。” - 范围:局域网内广播。
- 内容:“我是
- 响应:路由器收到后,单播回复:“我是
192.168.1.1,我的 MAC 是BB:BB...”。 - 缓存:电脑收到后,将路由器的 MAC 存入 ARP 缓存表(后续通信不再重复广播)。
3. DNS 转发与递归
- 转发:路由器收到 DNS 请求,它自己不知道百度的 IP,于是将请求转发给上级 DNS(运营商提供,通过 PPPoE 拨号获取)。
- 结果:经过层层查询,拿到百度 IP(例如
202.108.22.5)。 - 缓存:路由器和电脑都会将结果缓存(TTL 时间内有效),避免重复查询。
第三阶段:发起连接(路由与子网判断)
浏览器拿到了百度的 IP,准备发起 HTTP 请求(TCP 80 端口)或 HTTPS 请求(TCP 443 端口)。
1. 同网段 vs 异网段判断
电脑在发包前,会用自己的 子网掩码 (255.255.255.0) 进行二进制 与运算 (AND):
- 源网络号 =
192.168.1.3&255.255.255.0->192.168.1.0 - 目标网络号 =
202.108.22.5(百度) &255.255.255.0->202.108.22.0
结论:网络号不同,目标在外网。
决策:必须将数据包发给 默认网关(路由器)。
2. 发送数据包
- 层级封装:
- IP 层:源 IP
192.168.1.3,目标 IP202.108.22.5。 - MAC 层:源 MAC
本机,目标 MAC路由器(网关)。
- IP 层:源 IP
- 交换机根据目标 MAC 将包转发给路由器 LAN 口。
第四阶段:走出家门(NAT 地址转换)
这是家庭网络最关键的一步。由于 192.168.x.x 是私有地址,无法在互联网上传输,路由器必须进行 NAT (网络地址转换)。
1. SNAT(源地址转换)
- 路由器操作:
- 将数据包的 源 IP 从
192.168.1.3修改为路由器的 公网 IP(如2.2.2.2)。 - 将 源端口(如
9527)修改为路由器的一个 随机空闲端口(如4134)。
- 将数据包的 源 IP 从
- 建立映射表:路由器在内存中记录一条 NAT 映射记录:
WAN口(2.2.2.2:4134) <==> LAN内(192.168.1.3:9527)
2. 公网传输
- 数据包顶着路由器的公网 IP,经过运营商网络、骨干网,最终到达百度服务器。
第五阶段:满载而归(回程与 DNAT)
1. 百度回复
- 百度服务器处理请求,将网页数据打包发回。
- 目标 IP:
2.2.2.2(路由器的公网 IP)。 - 目标端口:
4134。
2. DNAT(目标地址转换)
- 路由器接收:收到数据包,查 NAT 映射表。
- 逆向转换:
- 发现端口
4134对应内网192.168.1.3:9527。 - 将 目标 IP 修改回
192.168.1.3。 - 将 目标端口 修改回
9527。
- 发现端口
- 转发:通过 LAN 口发送给交换机,最终到达电脑。
3. 页面渲染
浏览器收到数据,解析 HTML,页面呈现在用户面前。
💡 关键知识点总结 (Key Takeaways)
- DHCP 广播:获取 IP 是靠“喊”出来的(广播),所以必须在同一物理网段内。
- ARP 缓存:不知道 MAC 地址就无法封装数据帧。ARP 是连接逻辑 IP 和物理硬件的桥梁。
- 子网掩码的作用:它是一把尺子,用来衡量对方是在“屋里”(局域网)还是“屋外”(互联网)。
- NAT 的必要性:它解决了 IPv4 地址不足的问题,同时让内网设备“隐身”于公网之后。
- 网关:局域网通向世界的“大门”,所有出站流量必须经过它。
Comments NOTHING