-
Notifications
You must be signed in to change notification settings - Fork 1
Description
浏览器输入 URL 之后发生了什么
这是一道经典的面试题,秋招面试的时候被问过无数次 💥 ,所以觉得值得好好复盘一下这道题。
我的回答其实也就是很粗略的说一下这个问题 🌱
因为这道题完全可以写一本书,其实也确实有一本书,这本书也主要讲了这个问题 网络是怎样连接的 📚
我的其他文章 : 分享汇总 🔖
这题主要考察的就是计算机网络,特别是各个层次的协议是什么进行交互的,从最上层往下,主要涉及 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 三次握手又是另外一个经典问题了,这个问题值得再写另外一篇文章,我之后会在另一篇文章中讨论这个问题。
// to-do 三次握手的过程
IP 路由数据包 (网络层)
传输层的下一层是网络层,网络层负责将 TCP 报文加上 IP 头,生成 IP 数据包。并且在数据链路层加上帧头帧尾,发送到路由器,路由器去掉帧头帧尾得到 IP 数据包,并且根据目的 IP 地址,对数据包进行路由。
服务端接收报文
服务端拿到 IP 数据包之后,向上剥离,得到 HTTP 请求报文。之后根据请求报文,发送回应报文,再一步步发送到客户端。
