《计算机网络-自顶向下方法》6.7 回顾:Web页面请求的历程 读书笔记

目录

  • 导语
  • [一、6.7.1 准备:DHCP、UDP、IP和以太网](#一、6.7.1 准备:DHCP、UDP、IP和以太网)
  • [二、6.7.2 仍在准备:DNS和ARP](#二、6.7.2 仍在准备:DNS和ARP)
  • [三、6.7.3 仍在准备:域内路由选择到DNS服务器](#三、6.7.3 仍在准备:域内路由选择到DNS服务器)
  • [四、6.7.4 Web客户-服务器交互:TCP和HTTP](#四、6.7.4 Web客户-服务器交互:TCP和HTTP)
  • 本节核心总结(必看)
  • 结语

导语

  大家好呀~这一节是整本书最精彩、最融会贯通的一节------Web页面请求的历程!我们每天都在浏览器里输入网址、回车、看网页,但你有没有想过,从你按下回车键到网页显示在屏幕上,到底发生了什么?数据包经历了哪些层?经过了哪些设备?用了哪些协议?

  这一节我们会跟着一个叫"小明"的同学,从他打开笔记本电脑、连接校园网开始,一步步追踪他访问Google主页的完整过程。我们会看到DHCP怎么分配IP、DNS怎么解析域名、ARP怎么获取MAC、OSPF怎么路由、TCP怎么建立连接、HTTP怎么传输网页------前面学过的所有协议都会在这个过程中登场!

  这是一个把全书知识串起来的绝佳机会。准备好了吗?让我们跟着小明的数据包,开始这场奇妙的网络之旅~


一、6.7.1 准备:DHCP、UDP、IP和以太网

1. 场景设定

  小明带着笔记本电脑来到学校图书馆,打开电脑,连接到校园网的以太网交换机。他想访问Google主页,在浏览器里输入www.google.com并按下回车。

  但是,小明的电脑刚开机,什么都没有------没有IP地址、不知道DNS服务器是谁、不知道默认网关在哪。它需要先完成一系列"准备工作",才能真正发送Web请求。

2. 第一步:DHCP获取IP地址

  小明的电脑首先需要一个IP地址。它使用**DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)**自动获取IP地址。

  DHCP的四步握手(DORA过程):

  1. DHCP Discover(发现):小明的电脑还没有IP,它用源IP 0.0.0.0、目的IP 255.255.255.255(广播)发送DHCP Discover报文,封装在UDP中(源端口68,目的端口67),再封装成以太网帧(源MAC是电脑网卡的MAC,目的MAC是FF:FF:FF:FF:FF:FF广播),发送给交换机。
  2. DHCP Offer(提供):校园网的DHCP服务器收到广播后,回复DHCP Offer,提供一个IP地址(如192.168.1.100)、子网掩码、默认网关、DNS服务器地址等信息。
  3. DHCP Request(请求):小明的电脑收到Offer后,广播DHCP Request,表示接受这个IP分配(同时通知其他DHCP服务器这个IP已被占用)。
  4. DHCP ACK(确认):DHCP服务器回复DHCP ACK,确认分配。小明的电脑现在有了IP地址、子网掩码、默认网关(192.168.1.1)、DNS服务器(8.8.8.8)。

  注意:DHCP全程使用广播,因为小明的电脑一开始没有IP,也不知道DHCP服务器在哪。整个过程封装在UDP→IP→以太网中,经过交换机转发。

3. 此时小明的电脑知道了什么

  经过DHCP,小明的电脑获得了:

  • 自己的IP地址:192.168.1.100
  • 子网掩码:255.255.255.0
  • 默认网关:192.168.1.1(校园网路由器的内网口)
  • DNS服务器:8.8.8.8

  但是,要发送数据包,还需要知道下一跳的MAC地址。这就需要ARP了。


二、6.7.2 仍在准备:DNS和ARP

1. 第二步:DNS域名解析

  小明的浏览器要访问www.google.com,但网络层用IP地址寻址,所以需要先把域名翻译成IP地址------这就是**DNS(Domain Name System,域名系统)**的工作。

  DNS解析过程:

  1. 小明的电脑构造一个DNS查询报文:"www.google.com的IP地址是什么?",封装在UDP中(源端口随机,目的端口53)。
  2. 目的IP是DNS服务器8.8.8.8。小明的电脑检查自己的路由表------8.8.8.8不在本地子网(192.168.1.0/24),所以需要发给默认网关192.168.1.1。
  3. 要发给默认网关,需要知道默认网关的MAC地址。

2. 第三步:ARP获取网关MAC

  小明的电脑查ARP缓存,没有192.168.1.1的MAC地址,于是发送ARP请求

  1. ARP请求:广播帧(目的MAC=FF:FF:FF:FF:FF:FF),内容是"谁的IP是192.168.1.1?请告诉我你的MAC地址"。
  2. ARP应答:默认网关(路由器)收到广播,发现是问自己,回复单播ARP应答:"我的IP是192.168.1.1,我的MAC是AA:BB:CC:DD:EE:FF"。
  3. 小明的电脑把"192.168.1.1 → AA:BB:CC:DD:EE:FF"存入ARP缓存。

  现在,小明的电脑可以把DNS查询报文封装成以太网帧了:

  • 源MAC:电脑的MAC
  • 目的MAC:网关的MAC(AA:BB:CC:DD:EE:FF)
  • 源IP:192.168.1.100
  • 目的IP:8.8.8.8
  • 数据:UDP DNS查询

  帧发送给交换机,交换机根据目的MAC单播转发给网关端口。


三、6.7.3 仍在准备:域内路由选择到DNS服务器

1. 第四步:路由器转发DNS查询

  默认网关(校园网路由器)收到以太网帧:

  1. 解封装:去掉以太网帧头,得到IP数据报。
  2. 查路由表:目的IP 8.8.8.8,匹配到默认路由或具体路由,下一跳是运营商的边缘路由器。
  3. 重新封装:把IP数据报封装成新的以太网帧(源MAC是路由器出接口的MAC,目的MAC是下一跳路由器的MAC------这也需要ARP解析),从出接口发送。

  注意:每经过一个路由器,源IP和目的IP不变,但源MAC和目的MAC每跳都变。这就是网络层和链路层的关键区别。

2. OSPF域内路由

  校园网内部和运营商网络内部,路由器之间运行OSPF(链路状态路由协议)。每个路由器都有完整的网络拓扑,用Dijkstra算法计算到8.8.8.8的最短路径。DNS查询报文沿着OSPF计算出的最短路径,经过多个路由器,最终到达DNS服务器8.8.8.8。

  如果8.8.8.8在不同的AS(自治系统),还需要BGP在AS之间路由。但8.8.8.8使用IP任播(Anycast),全球有多个实例,报文会被路由到最近的DNS服务器。

3. DNS服务器回复

  DNS服务器收到查询后,查找www.google.com的A记录,得到IP地址(如142.250.80.46),构造DNS应答报文,通过UDP发回给小明的电脑。应答报文沿着反向路径(同样经过OSPF/BGP路由、每跳重新封装以太网帧)回到小明的电脑。

  小明的电脑收到DNS应答,知道了www.google.com的IP地址是142.250.80.46,存入DNS缓存。

  至此,所有准备工作完成!小明的电脑现在可以和Google服务器建立TCP连接、发送HTTP请求了。


四、6.7.4 Web客户-服务器交互:TCP和HTTP

1. 第五步:TCP三次握手建立连接

  HTTP使用TCP作为传输层协议,所以浏览器先要和Google服务器建立TCP连接。

  TCP三次握手

  1. SYN:小明的电脑选择一个初始序列号(如1000),发送SYN报文(SYN=1, seq=100),目的端口80(HTTP默认端口)。封装在IP→以太网中,经过和DNS查询一样的路径到达Google服务器。
  2. SYN+ACK:Google服务器收到SYN,选择自己的初始序列号(如5000),回复SYN+ACK(SYN=1, ACK=1, ack=101, seq=5000)。
  3. ACK:小明的电脑收到SYN+ACK,回复ACK(ACK=1, ack=5001, seq=101)。

  三次握手完成,TCP连接建立!注意这三个报文也都经过了完整的封装和解封装过程,每经过一个路由器MAC地址都变,但IP地址不变。

2. 第六步:HTTP请求

  TCP连接建立后,浏览器构造HTTP请求报文

复制代码
GET / HTTP/1.1
Host: www.google.com
Connection: keep-alive
User-Agent: Mozilla/5.0 ...

  HTTP请求报文交给TCP,TCP把它分成报文段(如果太大),加上TCP首部(源端口、目的端口、序列号、确认号等),交给IP。IP加上IP首部(源IP 192.168.1.100,目的IP 142.250.80.46),交给链路层。链路层加上以太网首部(源MAC、目的MAC=网关MAC),发送出去。

  数据包经过校园网交换机→网关路由器→运营商网络→Google数据中心的边界路由器→数据中心内部的叶脊网络→最终到达Google的Web服务器。每一跳都重新封装以太网帧,每一跳都查路由表/转发表。

3. 第七步:HTTP响应

  Google服务器收到HTTP请求,处理后构造HTTP响应报文

复制代码
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 12345

<html>...Google主页内容...</html>

  HTTP响应通过TCP(可能分成多个报文段,可靠传输、流量控制、拥塞控制)→IP→以太网,沿着反向路径回到小明的电脑。

  小明的电脑收到所有TCP报文段后,TCP按序重组,交给HTTP。HTTP解析响应,把HTML内容交给浏览器渲染引擎。浏览器解析HTML、加载CSS/JS/图片(可能又发起多个HTTP请求,重复上述过程),最终把Google主页显示在屏幕上。

4. 整个过程的协议栈回顾

  让我们回顾一下一个数据包在每一层的封装:

复制代码
应用层:    HTTP请求 (GET / HTTP/1.1)
运输层:    TCP首部 + HTTP请求
网络层:    IP首部 + TCP首部 + HTTP请求
链路层:    以太网首部 + IP首部 + TCP首部 + HTTP请求 + 以太网CRC
物理层:    比特流在网线上传输

  发送方从上到下逐层封装,接收方从下到上逐层解封装。每经过一个路由器,链路层帧被解封装再重新封装(MAC地址变),但网络层及以上的内容不变(IP地址不变)。


本节核心总结(必看)

  这一节是全书知识的融会贯通,核心要点:

一、准备阶段

  1. DHCP:四步握手(Discover→Offer→Request→ACK),获取IP、子网掩码、网关、DNS服务器。全程广播,UDP端口67/68。
  2. DNS:把域名翻译成IP,UDP端口53。递归查询+迭代查询。
  3. ARP:已知IP求MAC,广播请求+单播应答。用于获取下一跳(网关)的MAC地址。

二、路由阶段

  • 每经过一个路由器:解封装以太网帧→查IP路由表→重新封装以太网帧
  • IP地址不变(源IP和目的IP全程不变),MAC地址每跳都变
  • AS内部用OSPF(Dijkstra最短路径),AS之间用BGP(策略路由)
  • 8.8.8.8使用IP任播,路由到最近的DNS实例

三、Web交互阶段

  1. TCP三次握手:SYN→SYN+ACK→ACK,建立可靠连接
  2. HTTP请求:GET请求,经过TCP→IP→以太网封装,逐跳转发
  3. HTTP响应:200 OK + HTML内容,TCP可靠传输,按序重组
  4. 浏览器渲染HTML,加载资源,显示网页

四、关键原则

  • 发送方从上到下逐层封装,接收方从下到上逐层解封装
  • 网络层负责端到端(IP不变),链路层负责每条链路(MAC每跳变)
  • 每个协议各司其职:DHCP分配IP、DNS解析域名、ARP解析MAC、TCP可靠传输、HTTP传输网页

关键概念清单

  • DHCP:动态主机配置协议,自动获取IP
  • DNS:域名系统,域名→IP
  • ARP:地址解析协议,IP→MAC
  • OSPF:AS内部路由协议
  • BGP:AS之间路由协议
  • TCP三次握手:建立可靠连接
  • HTTP:超文本传输协议
  • 封装/解封装:发送方逐层加首部,接收方逐层去首部
  • IP任播:多服务器共享IP,路由到最近
  • 默认网关:跨子网通信的下一跳

结语

  这一节我们跟着小明的数据包,完整地走了一遍Web页面请求的历程------从DHCP获取IP,到DNS解析域名,到ARP获取MAC,到OSPF/BGP路由,到TCP三次握手,到HTTP请求响应,最后到浏览器渲染网页。前面学过的所有协议在这个过程中都发挥了作用,就像一场精心编排的交响乐。

  理解了这个过程,你就真正理解了计算机网络是怎么工作的。下次你在浏览器里输入网址回车时,不妨想一想:你的数据包正在经历一场奇妙的旅程,经过无数个路由器和交换机,跨越几千公里,在几百毫秒内把网页送到你面前。这就是计算机网络的魅力!

  下一节6.8我们会做第6章的总结、课后习题和Wireshark以太网实验------用Wireshark实际抓包看看以太网帧长什么样、ARP和DHCP报文的格式。让我们用一节精彩的总结和实验来结束第6章吧!

  如果你觉得这篇笔记对你有帮助,欢迎点赞收藏~有问题也欢迎留言讨论,我们一起进步!

相关推荐
云上工程笔记1 小时前
四柱记账法和复式记账法有什么区别?复式记账为什么更适合查错和对账
大数据·前端·人工智能
恋猫de小郭1 小时前
Dart Skills CLI 1.0 :AI 时代的 Dart 交付支持
android·前端·flutter
Hilaku1 小时前
为什么技术极强的前端,往往当不好前端 Team Leader?
前端·javascript·程序员
Knight_AL2 小时前
EasyExcel 导入模板踩坑:row.add(““)导致文本格式失效与单元格保护问题解决方案
java·前端·easyexcel
Csvn2 小时前
模板字面量类型:用类型做字符串的正则
前端
倾颜2 小时前
AI Chat 长会话性能实践:消息虚拟化、动态高度与流式滚动设计
前端·react.js·node.js
幸运小圣2 小时前
SSE 与 WebSocket 新手入门:前端实时通信完全指南【JavaScript】
前端·javascript·websocket
艾伦野鸽ggg2 小时前
25级开学 JS 考核题解
前端·javascript
leoZ2312 小时前
2026-09-08-mysql-57-init-walkthrough
前端·javascript·数据库·vue.js·opencv·mysql·adb