浏览器输入 URL 之后发生了什么
这是一道经典的面试题,秋招面试的时候被问过无数次 ,所以觉得值得好好复盘一下这道题。
我的回答其实也就是很粗略的说一下这个问题
因为这道题完全可以写一本书,其实也确实有一本书,这本书也主要讲了这个问题 网络是怎样连接的
我的其他文章 : 分享汇总
本文的其他地址 :GitHub
这题主要考察的就是计算机网络,特别是各个层次的协议是什么进行交互的,从最上层往下,主要涉及 DNS,HTTP, HTTPS,TCP, IP,ARP 协议
浏览器输入URL 之后主要进行下面几个阶段
- 浏览器解析 URL 生成 HTTP 请求报文
-
DNS 解析
-
ARP 解析
- TCP 三次握手
- IP 路由
浏览器解析 URL 生成 HTTP 请求报文
输入 URL 之后,浏览器会对输入的 URL 进行解析,解析出服务器名,端口号,文件路径等信息之后,用于构造 HTTP 请求,并且对于 URL 中的中文,或者保留字符,也要进行相应的编码
有关 URL 的一些知识在我的另一篇文章中有涉及:URL URN 与 URI
DNS 解析(应用层)
因为发送 HTTP 请求报文需要依赖下层 TCP 协议,TCP 建立连接并通信是需要 IP 地址 + 端口号 这一对二元组的,端口号可以直接从 URL 中获得,但是 IP 地址需要由 DNS 解析域名来获得。DNS 服务主要功能就是将 URL 中的域名,解析为 IP 地址。
DNS 的过程大致为:
(假设要访问的域名为 aaa.bbb.ccc
)
- 会先查看自己浏览器有没有缓存此域名的信息,如果没有则进一步查看操作系统缓存,如果有则直接返回,如果没有则准备发送 DNS 请求
- 会先准备请求最近的 DNS 服务器,就是会向 DNS 服务器发送 DNS 请求。最近的 DNS 服务器收到请求后,会查询自己有没有存储着这个域名的 IP 地址,如果有则直接返回,如果没有则将此消息转发到根服务器
- 根域名服务器会发现这个域名属于
ccc
域,所以会将消息转发到ccc
域的 DNS 服务器上。ccc
域的 DNS 服务器会将请求转发到bbb.ccc
域的服务器中,bbb.ccc
域的服务器会转发到aaa.bbb.ccc
域服务器中,此服务器中一定有相关的信息,所以直接返回即可。
ARP 地址解析
刚才说了 DNS 解析是将 域名映射为 IP 地址,而 ARP 协议是什么呢?ARP 协议是将 IP 地址映射为 MAC 地址。IP 地址和 MAC 地址是什么关系呢?这里就体现了计算机网络的分层的设计哲学。IP 地址是网络层的概念,而 MAC 地址是数据链路层的概念。假如有 N 个主机,通过一个交换机连接起来,那么这就是一个局域网,而局域网之间通过发送 MAC 帧进行通信,互相识别的都是 MAC 地址。而 N 个局域网通过路由器连接在一起就形成了一个互联网,这时候主要假如主机之间跨局域网,通过互联网来通信,就需要 IP 地址来发挥作用了。那 ARP 地址解析和咱们的这道题又有什么关系呢。是这样的,如果一台主机,新加入了一个局域网,那他会知道自己的 IP 地址和 MAC 地址,他也会知道自己网关路由器的 IP 地址,但是他不知道网关路由器的 MAC 地址。这就导致了比如咱们的主机发送 DNS 请求的时候,有可能会无法发送 MAC 帧给网关路由器,咱们的 DNS 请求根本就无法发出。这时候就需要 ARP 协议了。
ARP 解析的过程:
-
主机会先检查自己的 ARP 缓存中有没有相关信息,如果没有则准备发送 ARP 请求
-
主机发送一个 ARP 请求,里面有自己的 IP 地址和 MAC 地址和目标主机的 IP 地址。此主机会对局域网的所有主机发送一个广播 MAC 帧
-
每个主机收到 ARP 请求之后,将会比较自己的 IP 地址是不是和 ARP 请求报文中的 IP 地址一致,如果一致,则需要发送一个 ARP 回应报文
- 回应报文中会写入自己的 MAC 地址,这样主机收到 ARP 回应之后,就知道网关路由器的 MAC 地址,就可以发送 MAC 帧了
TCP 三次握手(传输层)
HTTP 协议是基于 TCP 的,在生成了 HTTP 请求报文之后,就会通过 TCP socket 对报文进行传输。这样我们就从应用层来到了传输层,其实就是 HTTP 报文会在应用层加上 TCP 头。因为 TCP 协议是面向连接,所以要先进行 TCP 三次握手建立连接,之后才可以进行数据的传输。
TCP 三次握手又是另外一个经典问题了,这个问题我写在了另一篇文章中。
IP 路由数据包 (网络层)
传输层的下一层是网络层,网络层负责将 TCP 报文加上 IP 头,生成 IP 数据包。并且在数据链路层加上帧头帧尾,发送到路由器,路由器去掉帧头帧尾得到 IP 数据包,并且根据目的 IP 地址,对数据包进行路由。
服务端接收报文
服务端拿到 IP 数据包之后,向上剥离,得到 HTTP 请求报文。之后根据请求报文,发送回应报文,再一步步发送到客户端。
网络层路由也写明白就好了
前排膜拜%%%
谢谢hh
Orz