在浏览器内输入www.google.com会发生什么?

这是一道经典的面试题,细节可以参考《计算机网络:自顶向下》的 5.7 部分。

简单总结一下:

首先得到本机的 IP:

  • 操作系统生成一个 DHCP 请求报文,该请求报文被放到 UDP 报文段中,然后再放到 IP 数据报中,再放到以太网帧中。
  • 以太网帧的目的 MAC 地址为 FF:FF:FF:FF:FF:FF ,可以广播到和交换机连接的所有设备。
  • 路由器接收到该广播帧,并从中抽取 IP 数据报,再从中抽出 UDP 报文段,最后得到 DHCP 请求报文,至此,DHCP 服务器得到了 DHCP 请求报文。
  • DHCP 服务器分配了一个 IP 地址,生成包含该 IP 地址以及 DNS 服务器 IP 地址、默认网关路由器的 IP 地址和子网块(网络掩码)的一个 DHCP ACK 报文。该 DHCP 报文被放到一个 UDP 报文段中,再放到 IP 数据报,再放到以太网帧中,帧的目的 MAC 地址是我们本机的 MAC 地址。
  • 包含 DHCP ACK 的以太网帧由路由器发送给交换机,因为交换机是自学习的,之前从本机收到过以太网帧,因此此时只会讲以太网帧转发给本机所在的输出端口。
  • 本机收到包含 DHCP ACK 的以太网帧,从中抽取 IP 数据报,抽出 UDP 报文段,抽出 DHCP ACK 报文。本机的 DHCP 客户记录下得到的 IP 地址以及 DNS 服务器的 IP 地址,并且在 IP 转发表中安装默认网关的地址。
  • 至此,本机 IP 地址已经得到,网络组件的准备工作完成。

开始键入 URL:

  • 首先 Web 浏览器生成一个 TCP 套接字,该套接字被用来向 www.google.com 发送 HTTP 请求,为了生成该套接字,需要知道 www.google.com 的 IP 地址,此时需要使用到 DNS 协议来讲域名转换为 IP 地址。
  • 本机首先产生一个 DNS 查询报文,将字符串 www.google.com 放到 DNS 报文的问题段中,然后再放到 UDP 报文段中,再放到 IP 数据报中,再放到以太网帧中。
  • 该帧发送给网络中的网关路由器(在链路层进行寻址),但是此时只知道网关路由器的 IP 地址,还不知道其 MAC 地址,此时需要使用 ARP 协议。
  • 本机生成一个 ARP 查询报文,其目的 IP 为网关路由器 IP,该 ARP 报文放置在一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧发送给所有的设备,其中包括网关路由器。
  • 网关路由器接收到包含该 ARP 查询报文的帧,发现该报文中的目标 IP 地址是和其接口的 IP 地址是相匹配的,此时网关路由器便准备一个 ARP 回答,其中包含了其对应的 MAC 地址,该 ARP 回答也放在一个以太网帧中,目的 MAC 地址为本机。该帧由由网关路由器向交换机发送,交换机再向本机发送。
  • 本机收到 ARP 回答报文的帧,从中抽取出网关路由器的 MAC 地址。
  • 此时得到了网关路由器的 MAC 地址,本机可以将包含 DNS 查询的以太网帧顺利地发送给网关路由器,需要注意的是,此时该帧中的 IP 数据报里的 IP 目的地址是 DNS 服务器的 IP 地址,而该帧具有的目的 MAC 地址为网关路由器的 MAC 地址。本机向交换机发送该帧,交换机将该帧交付给网关路由器。
  • 网关路由器接收到该帧,从中抽取出包含 DNS 查询的 IP 数据报,路由器查找该数据报的目的地址,并根据其转发表来转发该数据报。
  • 路由器接收到该帧后,抽取 IP 数据报,检查该数据报的目的地址,根据其转发表确定出接口,经过出接口向 DNS 服务器转发数据报,其中转发表根据域内协议(如 RIP,OSPF 或 IS-IS)以及 因特网的域间协议 BGP 所填写。
  • 最终,包含 DNS 查询的 IP 数据报到达了 DNS 服务器,DNS 服务器抽取出 DNS 查询报文,在其 DNS 数据库中查找名字 www.google.com,找到其对应的 IP 地址的 DNS 源记录。然后 DNS 服务器形成一个包含这种主机名到 IP 地址映射的 DNS 回答报文,将该 DNS 回答报文放到 UDP 报文段中,再放到 IP 数据报中,反向转发回学校的路由器,再通过以太网交换机回到本机。
  • 此时本机从 DNS 报文中抽取 www.google.com 对应的 IP 地址。

Web 客户-服务器交互:

  • 此时本机已经有了 www.google.com 的 IP 地址,便可以生成 TCP 套接字,该套接字用来向 www.google.com 发送 HTTP GET 报文。本机生成 TCP 套接字时,本机的 TCP 必须首先与 www.google.com 中的 TCP 执行三次握手。
  • 本机首先生成一个目的端口为 80 (HTTP)的 TCP SYN 报文段,该 TCP 报文段放到 IP 数据报中,再放到目标 MAC 地址为网关路由器 MAC 地址的帧中,向交换机发送该帧。
  • 网络中的路由器将该帧向 www.google.com 转发,最终,包含 TCP SYN 的数据报到达 www.google.com,从数据报中抽出 TCP SYN 报文并分解到与端口 80 相联系的欢迎套接字。对于谷歌 HTTP 服务器和本机之间的 TCP 连接生成一个连接套接字,产生一个 TCP SYNACK 报文段,并将其放入数据报中,再放入链路层帧中。
  • 包含 TCP SYNACK 报文段的数据报通过网络最终到达本机的以太网卡,数据报在操作系统中分解得到 TCP 套接字,从而进入连接状态。
  • 借助于本机上的套接字,现在可以向 www.google.com 发送字节了!本机的浏览器生成包含要获取的 URL 的 HTTP GET 报文。HTTP GET 报文则写入套接字,其中 GET 报文成为一个 TCP 报文段的载荷,该 TCP 报文段放置到一个数据报中,并交给 www.google.com,过程与前面类似,不再赘述。
  • www.google.com 的 HTTP 服务器从 TCP 套接字中读取到 HTTP GET 报文,生成一个 HTTP 响应报文,将请求的 Web 页内容放入 HTTP 响应体中,并将报文发送到 TCP 套接字中。
  • 包含 HTTP 响应报文的数据报通过网络转发到本机,本机的 Web 浏览器从套接字中读取 HTTP 响应,从 HTTP 响应中抽取 Web 网页的 html,最终可以显示 Web 网页!!
posted @ 2020-07-25 20:12  winechord  阅读(335)  评论(0编辑  收藏  举报