大家回顾一下每天的上网流程:第一步 打开 Web 浏览器。第二步 在地址栏键入一个 URL 地址,例如 www.google.com 。第三步 等待谷歌的 Web 服务器给你返回一个 HTML 页面。
这个看似简单的请求,背后隐藏了许多细节。我们来聊一聊这些细节吧。
网络环境
假设 Bob 想访问 www.google.com 。需要先启动电脑,然后用一根以太网电缆连接到学校的以太网交换机,交换机与学校的路由器相连,路由器又与一个 ISP 相连(本例中 ISP 为 comcast.net)。comcast.net 为学校提供 DNS 服务(因为学校没有在局域网中设置一个默认的 DNS 服务器),同时假设 DHCP 服务器运行在路由器中(网关路由器通常被设置为 DHCP 服务器)。
Web 请求的网络环境和动作
DHCP、UDP、IP 和以太网
Bob 的电脑刚接入网络时还没有 IP 地址,此时不能做任何事情。所以 Bob 采取的第一个动作是运行 DHCP 协议,从本地 DHCP 服务器获得一个 IP 地址。
- (1) Bob 的电脑生成一个 DHCP 请求消息,将其放入一个目的地端口 67 (DHCP 服务端)和源端口 68 (DHCP 客户端)的 UDP 报文段中。该报文段则被放入一个目的 IP 255.255.255.255(广播地址)和源 IP 0.0.0.0(因为 Bob 的电脑还没有 IP 地址)的 IP 数据报中。
- (2) IP 数据报被放入以太网帧中,该帧的目的 MAC 地址为 FF:FF:FF:FF:FF:FF(广播地址),源 MAC 地址为 00:16:D3:23:68:8A(Bob 电脑的 MAC 地址)。
- (3) 包含 DHCP 请求消息的 广播以太网帧 是 Bob 发送到以太网交换机的第一帧。交换机在所有的出端口广播该帧(包括连接到路由器的端口)。
- (4) 路由器在它的 MAC 地址接口(00:22:68:45:1F)接收到该以太网帧,并从中取出 IP 数据报。IP 数据报的广播目的地址指示了这个数据报应当由当前节点的高层协议处理,因此该数据报的有效载荷(一个 UDP 报文段)被分解,向上交付给 UDP 协议处理。UDP 协议将 DHCP 请求消息抽取出来,交给 DHCP 服务器处理。
- (5) 假设运行在路由器中的 DHCP 服务器能够以 68.85.2.0/24 (CIDR 地址块 )分配 IP 地址,那么学校内的所有 IP 地址都在 Comcast(68.85.0.0/13)的地址块中。假设 DHCP 服务器分配 IP 地址 68.85.2.101 给 Bob。DHCP 服务器生成一个包含这个 IP 地址、DNS 服务器的 IP 地址(68.87.71.226)、默认网关路由器的 IP 地址(68.85.2.1)和子网块(68.85.2.0/24)的一个 DHCP ACK 消息。该消息被放入一个 UDP 报文段中,UDP 报文段又被放入一个 IP 数据报中,IP 数据报再被放入一个以太网帧中。这个以太网帧的源 MAC 地址是路由器连到学校网络接口的 MAC 地址(00:22:6B:45:1F:1B),目的 MAC 地址是 Bob 电脑的 MAC 地址(00:16:03:23:68:8A)。
- (6) 包含 DHCP ACK 消息的以太网帧由路由器发送给交换机。交换机是自学习的,先前收到过 Bob 电脑发送的以太网帧,所以交换机知道目的地址为 00:16:D3:23:68:8A 的帧仅向 Bob 的电脑转发即可。
- (7) Bob 接收到包含 DHCP ACK 消息的以太网帧,从该帧中抽取 IP 数据报,从 IP 数据报中抽取 UDP 报文段,从 UDP 报文段中抽取 DHCP ACK 消息。Bob 的 DHCP 客户端记录下 DHCP ACK 消息中分配给它 IP 地址和 DNS 服务器的 IP 地址,并在 IP 转发表中添加默认网关的地址。Bob 电脑向默认网关发送目的地址 68.85.2.0/24 (相同子网)以外的所有数据报。
Bob 的电脑已经完成网络组件的初始化,准备发送 Web 页面请求。
DNS 和 ARP
当 Bob 将 www.google.com 键入 Web 浏览器的地址栏时,会开启一长串事件,最终导致谷歌主页显示在 Web 浏览器上。浏览器通过生成一个 TCP socket 开始该过程,为了生成该 socket,Bob 的电脑需要知道 www.google.com 的 IP 地址。我们在先前的 《DNS》 中学到,DNS 服务提供了从域名到 IP 地址的转换。
- (8) Bob 的电脑生成一个 DNS 查询消息,将 www.google.com 放入该消息中。查询消息被放入一个目的端口 53(DNS 服务端)的 UDP 报文段中,该报文段则被放入目的 IP 68.87.71.226(第(5)步中返回的 DNS 服务器地址)和源 IP 68.85.2.101 的 IP 数据报中。
- (9) Bob 的电脑将 IP 数据报放入一个以太网帧中,该帧将在链路层寻址到学校网络中的网关路由器。然而,即使 Bob 的电脑知道了学校网关路由器的 IP 地址(68.85.2.1),但仍然不知道网关路由器的 MAC 地址。为了获得网关路由器的 MAC 地址,需要使用 ARP 协议。
- (10) Bob 的电脑生成一个 目的 IP 地址 68.85.2.1 的 ARP 查询消息,将该消息放置在一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该帧,交换机将该帧交付给所有连接的设备(包括网关路由器)。
- (11) 网关路由器在通往学校网络的接口上接收到包含 ARP 查询消息的帧,发现消息中目的 IP 地址(68.85.2.1)就是关联该接口的 IP 地址。因此网关路由器准备回复一个 ARP 回答消息,指示它的 MAC 地址(00:22:68:45:1F:1B)对应着 IP 地址 68.85.2.1。它将 ARP 回答消息放在一个以太网帧中,其目的地址为 00:16:D3:23:68:8A(Bob 的电脑),并向交换机发送该帧,再由交换机将帧交付给 Bob 的电脑。
- (12) Bob 的电脑接收到 ARP 回答消息,并从消息中抽取网关路由器的 MAC 地址。
- (13) Bob 的电脑现在能够使包含 DNS 查询消息的以太网帧寻址到网关路由器的 MAC 地址。在该帧中的 IP 数据报的目的地址为 68.87.71.226(DNS 服务器),MAC 目的地址为 00:22:6B:45:1F:1B(网关路由器)。
Bob 电脑向交换机发送该帧,交换机将该帧交付给网关路由器。
域内路由到 DNS 服务器
- (14) 网关路由器接收该帧并抽取出 IP 数据报(包含 DNS 查询消息)。网关路由器查找该数据报的目的地址(68.87.71.226),根据其转发表决定将数据报发送到 Comcast 网络中最左边的路由器。
- (15) Comcast 网络中最左边的路由器接收到该帧,抽取 IP 数据报,检查该数据报的目的地址(68.87.71.226),根据其转发表确定输出接口,经过该接口朝着 DNS 服务器转发数据报(转发表根据 Comcast 的 域内协议 以及因特网的域间协议 BGP 填写)。
- (16) 最终,包含 DNS 查询消息的 IP 数据报到达了 DNS 服务器。DNS 服务器抽取出 DNS 查询消息,在它的 DNS 数据库中查找域名 www.google.com 。找到包含域名 www.google.com 的 IP 地址(64.233.169.105)的 DNS 记录(假设它缓存在 DNS 服务器中)。DNS 服务器生成一个包含域名到 IP 地址映射的 DNS 回答消息,将该回答消息放入 UDP 报文段中,该报文段放入寻址到 Bob 电脑(68.85.2.101)的 IP 数据报中。该数据报将通过 Comcast 网络转发到学校路由器,再经以太网交换机转发到 Bob 电脑。
- (17) Bob 的电脑从 DNS 回答消息抽中取出 www.google.com 对应的 IP 地址。
在大量的准备工作之后,Bob 的电脑开始接触 www.google.com 的服务器。
TCP 和 HTTP
- (18) 既然 Bob 的电脑有了 www.google.com 的 IP 地址,它现在能生成 TCP socket,该 socket 用于向 www.google.com 发送 HTTP GET 消息。生成 TCP socket 时,在 Bob 电脑中的 TCP 必须先与 www.google.com 中的 TCP 执行三次握手。Bob 的电脑生成一个目的端口 80(该端口用于 HTTP 协议)的 TCP SYN 报文段,将该报文段放置在目的 IP 地址 64.233.169.105( www.google.com )的 IP 数据报中,将该数据报放置在目的 MAC 地址 00:22:6B:45:1F:1B(网关路由器)的以太网帧中,并向交换机发送该帧。
- (19) 在学校网络、Comcast 网络和谷歌网络中的路由器朝着 www.google.com 转发包含 TCP SYN 的数据报(根据转发表进行转发)。
- (20) 最终,包含 TCP SYN 的数据报到达 www.google.com ,谷歌的 HTTP 服务器从数据报中抽取出 TCP SYN 报文段并分解到与 80 端口相关联的 TCP socket。服务器和 Bob 电脑之间的 TCP 连接生成一个 connection socket,并生成一个 TCP SYN ACK 报文段,将其放入向 Bob 电脑寻址的一个数据报中。
- (21) 包含 TCP SYN ACK 报文段的数据报通过谷歌、Comcast 和学校网络,最终到达 Bob 电脑的以太网卡。数据报被操作系统分解到步骤(18)中生成的 TCP socket,从而进入连接状态。
- (22) 通过 Bob 电脑上的 socket,现在准备向 www.google.com 发送字节了,Bob 的浏览器生成包含要获取的 URL 的 HTTP GET 消息。HTTP GET 消息将被写入 socket,成为一个 TCP 报文段的有效载荷。同时该 TCP 报文段将被放入一个数据报中,并交付到 www.google.com 。步骤如前面(18)-(20) 所述。
- (23) www.google.com 的 HTTP 服务器从 socket 中读取 HTTP GET 消息,并创建一个 HTTP response,然后将 GET 消息请求的 Web 页面放入 HTTP response 中,再将 HTTP response 放进 socket 中。
- (24) 包含 HTTP response 的数据报通过谷歌、Comcast 和学校网络转发,到达 Bob 的电脑。Web 浏览器从 socket 中读取 HTTP response,从 response 中取出 Web 网页,并最终向 Bob 展示网页内容。
小结
上面的步骤涉及了许多网络基础知识,如果你已经理解了步骤中的大多数或全部,那么恭喜你:你对计算机网络已经有了一个比较全面的了解。