《计算机网络:自顶向下方法》:Web 页面请求的历程

1. 场景

一名学生 Bob 启动他的计算机,将其用一根网线连接到学校的以太网交换机,然后通过浏览器访问 Google 主页。

网络环境:

  • Bob 的计算机与交换机相连
  • 交换机与学校路由器相连
  • 路由器与一个 ISP 相连,本例中 ISP 为 comcast.net
  • 本例中 comcast.net 为学校提供了 DNS 服务,所以 DNS 服务器驻留在 Comcast 网络中而不是学校网络中

image

2. 准备:DHCP、UDP、IP 和以太网

Bob 的计算机目前还没有 IP 地址,如何动态获取 IP 地址? 运行 DHCP,以从本地的 DHCP 服务器获取一个 IP 地址以及其他信息。

  • Bob 计算机上的操作系统生成一个 DHCP 请求报文,并将这个报文放入目的地端口 67(DHCP 服务器)和源端口 68(DHCP 客户)的 UDP 报文段。该 UDP 报文段则被放置在一个具有广播 IP 目的地地址(255.255.255.255)和源 IP 地址 0.0.0.0 的 IP 数据报中,因为此时 Bob 的计算机还不具有一个 IP 地址。
  • 该 IP 数据报则被放置在以太网帧中,目的 MAC 地址 FF:FF:FF:FF:FF:FF,使该帧将广播到与交换机连接的所有设备,源 MAC 地址为 Bob 计算机的网卡 MAC 地址 00:16:D3:23:68:8A。

    | 协议层 | 数据 |
    | —- | —————————————- |
    | 应用层 | DHCP 请求报文 |
    | 传输层 | UDP 源端口 68 目的端口 67 |
    | 网络层 | 源 IP 0.0.0.0 目的 IP 255.255.255.255 |
    | 链路层 | 源 MAC 00:16:D3:23:68:8A 目的 MAC FF:FF:FF:FF:FF:FF |

  • 包含 DHCP 请求的广播以太网帧是第一个有 Bob 计算机发送到以太网交换机的帧。该交换机在所有的出端口广播帧,包括连接到路由器的端口。同时交换机会在交换机表(switch table)中新添加一条记录,内容包括 MAC 地址,通往该 MAC 地址的交换机接口,该记录放置在表中的时间。

    | 地址 | 端口 | 时间 |
    | —————– | —- | —- |
    | 00-16-D3-23-68-8A | 1 | 9:30 |

  • 路由器在它的具有 MAC 地址 00:22:6B:45:1F:1B 接口接收到该广播以太网帧,该帧中包含 DHCP 请求,并且从该以太网帧中抽取出 IP 数据报。该数据报的广播 IP 目的地址指示了这个 IP 数据报应当由在该结点的高层协议处理,因此该数据报的载荷(一个 UDP 报文段)被分解向上到达 UDP,从此 UDP 报文段中抽取出 DHCP 请求报文。

  • 我们假设运行在路由器中的 DHCP 服务器能够以 CIDR 块 68.85.2.0/24 分配 IP 地址,然后分配地址 68.85.2.101 给 Bob 计算机。DHCP 服务器生成一个 DHCP ACK 报文,包含内容

    | DHCP ACK 报文 | 值 |
    | ————– | ————— |
    | IP 地址 | 68.85.2.101 |
    | DNS 服务器 IP 地址 | 68.87.71.226 |
    | 默认网关路由器(第一跳路由) | IP 地址 68.85.2.1 |
    | 子网块(网络掩码) | 68.85.2.0/24 |

    该 DHCP 报文被放入一个 UDP 报文段中,UDP 报文段被放入一个 IP 数据报中,IP 数据报再被放入一个以太网帧中。这个以太网帧的源 MAC 地址是路由器连到归属网络时接口的 MAC 地址(00:22:6B:45:1F:1B),目的 MAC 地址是 Bob 计算机的 MAC 地址(00-16-D3-23-68-8A)。

  • 包含 DHCP ACK 报文的以太网帧由路由器发送给交换机。因为交换机是自学习的,并且先前从 Bob 计算机收到(包含 DHCP 请求的)以太网帧,所以该交换机从交换机表中查询到通往 Bob 计算机 MAC 地址 00:22:6B:45:1F:1B 的相应接口。
  • Bob 计算机接收到包含 DHCP ACK 的以太网帧,从该以太网帧中抽取 IP 数据报,从 IP 数据报中抽取 UDP 报文段,从 UDP 报文段中抽取 DHCP ACK 报文。Bob的 DHCP 客户则记录下它的 IP 地址和它的 DNS 服务器的 IP 地址。它还在其 IP 转发表中安装默认网关的地址。

3. 仍在准备:DNS 和 ARP

当 Bob 将 www.google.com 的 URL 键入其 Web 浏览器时,他开启了一长串事件,这导致 Google 主页最终显示在其 Web 浏览器上。Bob 的 Web 浏览器通过生成一个 TCP 套接字开始了该过程,套接字用于向 www.google.com 发送 HTTP 请求。为了生成套接字,Bob 的计算机机需要知道 www.google.com 的 IP 地址。这就需要 DNS 协议提供这种域名到 IP 地址的转换服务。

但如果Bob计算机想向子网 68.85.2.0/24 之外的目的地址发送数据报,则先要经过默认网关。

  • Bob 计算机上的操作系统生成一个 DNS 查询报文,将字符串 www.google.com 放入 DNS 报文的问题段中。该 DNS 报文则放置在一个具有 53 号(DNS 服务器)目的端口的 UDP 报文段中。该 UDP 报文段则被放入具有 IP 目的地址 68.87.71.226(在 DHCP ACK 返回的 DNS 服务器地址)和源地址 68.85.2.101 的 IP 数据报中。
  • Bob 的计算机则将包含 DNS 请求报文的数据报放入一个以太网帧中。该帧将发送到(在链路层寻址)Bob 学校网络中的网关路由器。目前仅从 DHCP ACK 报文知道学校网关路由器的 IP 地址 65.85.2.1,但不知道网关路由器的 MAC 地址。此时就需要 ARP 协议提供IP地址到 MAC 地址的转换服务。
  • Bob 的计算机生成一个具有目的 IP 地址 68.85.2.1(默认网关)的 ARP 查询报文,将该 ARP 报文放置在一个具有广播目的地址 FF:FF:FF:FF:FF:FF 的以太网帧中,并向交换机发送该以太网帧,交换机将该帧交付给所有连接的设备,包括网关路由器。封装 ARP 报文的以太网帧:

    | 域 | 值 |
    | ———- | ———————————- |
    | 硬件类型 | 1 表示以太网 |
    | 协议类型 | 发送者所提供/请求的高级协议地址类型,0x0800 代表 IP 协议 |
    | 发送者 IP 地址 | 68.85.2.101 |
    | 发送者 MAC 地址 | 00:16:D3:23:68:8A |
    | 目的 IP 地址 | 68.85.2.1 |
    | 目的 MAC 地址 | FF:FF:FF:FF:FF:FF |

  • 网关路由器在通往学校网络的接口上接收到包含该 ARP 查询报文的帧,发现在 ARP 报文中的目标地址 68.85.2.1 匹配其接口地址。网关路由器因此准备一个 ARP 回答,指示 IP 地址 68.85.2.1 对应的 MAC 地址为 00:22:6B:45:1F:1B。它将 ARP 回答放在一个以太网帧中,其目的地址为 00:16:D3:23:68:8A(Bob 的计算机),并向交换机发送该帧,再由交换机将帧交付给 Bob 的计算机。

  • Bob 计算机收到包含 ARP 回到报文的帧,并从 ARP 回答报文中抽取网关路由器的 MAC 地址(00:22:6B:45:1F:1B),在本地 ARP 表中创建一条新的记录。

    | IP 地址 | MAC 地址 | TTL (Time to Live) |
    | ——— | —————– | —————— |
    | 68.85.2.1 | 00-22-6B-45-1F-1B | 09:30:00 |

现在,Bob 的计算机能够使包含 DNS 查询报文的以太网帧寻址到网关路由器的 MAC 地址了。

4. 仍在准备:域内路由选择到 DNS 服务器

  • 网关路由器接收该帧并抽取包含 DNS 查询的 IP 数据报。路由器查找该数据报的目的地址(68.87.71.226),并根据其转发表决定该数据报应道发送到 Comcast 网络中最左边的路由器。IP 数据报放置在链路层帧中,该链路适合将学校路由器连接到最左边 Comcast 路由器,并且该帧经过这条链路发送。
  • Comcast 最左边的路由器接到该帧,抽取 IP 数据报,检查该数据报的目的地址(68.87.71.226),并根据其转发表确定接口,经过该接口朝着 DNS 服务器转发数据报,而转发表已根据 Comcast 的域内协议(如 RIP、OSPF 或 IS-IS)以及因特网的域间协议 BGP 所填写。
  • 最终包含 DNS 查询的 IP 数据报到达了 DNS 服务器。DNS 服务器抽取出 DNS 查询报文,在它的 DNS 数据库中查找域名 www.google.com,找到包含对应 www.google.com 的 IP 地址(64.233.169.105)的 DNS 源记录。该 DNS 服务器形成了一个包含这种主机名到 IP 地址映射的 DNS 回答报文,将该 DNS 回答报文放入 UDP 报文段中,该报文段放入寻址到 Bob 计算机的 IP 数据报中。该数据报将通过 Comcast 网络反向转发到学校的路由器,并从这里经过以太网交换机到 Bob 计算机。
  • Bob 计算机从 DNS 报文抽取出服务器 www.google.com 的 IP 地址,并添加到浏览器的 DNS 缓存中。

经过大量的工作后,Bob 的计算机终于可以与 www.google.com 服务器通信了。

5. Web 客户 - 服务器交互:TCP 和 HTTP

  • Bob 计算机有了 www.google.com 的 IP 地址,它就能够生成 TCP 套接字,该套接字将用于向 www.google.com 发送 HTTP GET 报文。当 Bob 生成 TCP 套接字时,在 Bob 计算机中的 TCP 必须首先与 www.google.com 中的 TCP 执行三次握手。Bob 计算机首先生成一个具有目的端口 80(针对 HTTP)的 TCP SYN 报文段,将该 TCP 报文段放置在具有目的 IP 地址 64.233.169.105(www.google.com)的 IP 数据报中,将该数据报放置在 MAC 地址为 00:22:6B:45:1F:1B(网关路由器)的帧中,并向交换机发送该帧。
  • 在学校网络、Comcast 网络和 Google 网络中的路由器朝着 www.google.com 转发包含 TCP SYN 的数据报,使用每台路由器中的转发表。
  • 最终,包含 TCP SYN 的数据报到达 www.google.com。Google 服务器从数据报抽取出 TCP SYN 报文并分解到与端口 80 相联系的套接字。对于 Google HTTP 服务器和 Bob 计算机之间的 TCP 连接生成一个连接套接字。产生一个 TCP SYNACK 报文段(SYNACK segment),将其放入一个向 Bob 计算机寻址的数据报中。包含 TCP SYNACK 报文段的数据报经过 Google、Comcast 和学校网络,最终到达 Bob 计算机的以太网卡。
  • Bob 的 Web 浏览器生成 HTTP GET 报文。HTTP GET 报文则写入套接字,其中 GET 报文成为一个 TCP 报文段的载荷,该 TCP 报文段则被放进一个数据报中,并交付到 www.google.com。 注意到该 TCP 报文同时也对来自 Google 的 SYNACK 报文段进行 ACK。
  • www.google.com 的 HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将请求的 Web 页面内容放入 HTTP 响应体中,并将报文发送进 TCP 套接字中。包含 HTTP 响应报文的数据报经过 Google、Comcast 和学校网络转发,到达 Bob 计算机。Bob 的 Web 浏览器从套接字读取 HTTP 响应,从 HTTP 响应体中抽取 Web 网页的 HTML,最终渲染出页面效果。