在面试过程中常常会遇到这样一个问题:请你详细描述一下从我们在浏览器中输入网址到最后看到网页,这个过程中发生了什么?这个问题涉及面十分广,几乎涵盖了计网的全部相关问题,这个题的答案因人而异,可以挑选一两个着重点进行详细说明,其他的略过。

全过程简要概述

当我们将网址输入到浏览器后,第一件事就是解析url得到域名,通过DNS协议获取到该域名的ip地址,得到ip后浏览器会先与服务器通过TCP三次握手建立连接,然后构建HTTP请求,将HTTP的传输工作交给操作系统的协议栈,发送请求成功后,浏览器会从服务端拿到该页面的HTML以及资源文件,浏览器会渲染页面,呈现出我们所看到的模样。

在这整个过程中,涉及到了DNS解析,http请求,TCP\IP协议栈、页面渲染等知识,当然也可以继续扩展,比如从HTTP可以说到HTTPS,可以说到对称加密与非对称加密,可以说到网络安全等等,主要目的就是让整个面试过程跟着你的技术栈走,而不被面试官带到你不会的地方。

在这里我将重点写一下我在面试中喜欢拓展的方向,并拟出一份答案。

DNS解析

浏览器在拿到url时,首先会对url进行解析,将域名与实际的文件路径分离,然后需要使用DNS协议,通过域名得到IP地址。

首先浏览器会查询浏览器缓存,如果有这个网址就可以直接获取到IP,如果没有就进一步访问本机缓存,如果本机缓存也没有才会发起DNS请求。

而DNS的服务器是一个树状结构,对于域名来说是倒着进行解析的,根节点是根DNS服务器,他的子节点为com、cn这种顶级域dns服务器,然后进一步向下进行解析。

以baidu.com为例,当我们的电脑需要发起DNS请求的时候,会先对根DNS服务器发起请求,这个服务器的IP地址一般在每台电脑上都有,我们一般会设置为8.8.8.8或者114.114.114.114,我们的电脑在访问根DNS服务器后,会得到con域DNS服务器的IP,然后会继续访问con域DNS服务器,这时就能得到baicu.com的IP地址了。

HTTP请求

在解析url时,我们能获取到需要请求资源的资源路径、端口号、请求参数等信息,这些信息会被存储在http头中,通过DNS请求获取到ip后,浏览器会构建并发送HTTP请求或者HTTPS请求,HTTPS就是在HTTP的基础上加了一个TLS协议来进行数据加密,这个我们待会说。

HTTP请求有很多种,但对资源的操作离不开增删改查,也就对应着POST、DELETE、PUT、GET请求。最常用的是GET和POST,其区别在于GET的参数是在url中的,而POST的参数是在请求的body中。

以GET为例,当需要发送HTTP请求的时候,同样也不是直接就发送了,需要先查询浏览器缓存。浏览器中的缓存分为强缓存和协商缓存,浏览器发起HTTP请求时首先会根据http头信息来判断是存有强缓存,以及其是否过期,如果有强缓存且未过期则命中,不会发送请求到服务器了。如果强缓存没命中,则会向服务器发起请求,这个请求的Header头中会带有浏览器最后一次请求该资源的时间和一个资源校验码(使用资源修改时间、资源大小等信息生成),服务器收到这个请求后会判断协商缓存是否过期,如果过期则返回新的资源信息,如果没过期则返回304状态码,表示资源未更新,可以使用缓存中的资源。

TCP->网络层连接

TCP这一块内容比较多,所以一般不会在这个问题中详细说明,这里只写一个过渡段,想要了解TCP相关问题解答的可以看我的另一篇博客:TCP详解

HTTP请求发出后会将数据包交给下层协议栈处理,在传输层和网络层该数据包会被分别加上TCP头和IP头,并且被发送出去,沿路的网关会收到这个数据包并进行识别和转发,直到该数据包被服务器收到,通过相同的流程返回回复数据包。

页面渲染

由于我对前端不熟悉,就不展开讲,被问到的话就说是通过写爬虫来了解DOM树的(挪威组),前端只会简单的Vue开发,底层原理不了解

一般来说,浏览器第一次从服务器请求的资源都是一个HTML文件,例如服务端默认的index.html等,浏览器获取到这个HTML文件就会对其进行解析,构建出一棵DOM树,并通过执行其中的js代码发起更多的请求,请求渲染页面需要的其他资源,CSS或者一些外链的图片等,拿到CSS后将其与DOM树结合进行更进一步的渲染,我们就能看到页面了。

HTTPS

由于HTTP是使用信息明文传播,所以会有窃听、篡改、冒充等风险,所以HTTPS在HTTP的基础上加上了SSL层,通过加密的方式来保证数据安全。

SSL通过加密防止窃听,通过签名来防止篡改,通过证书来防止冒充。
HTTPS协议在客户端与服务端开始通信前,会进行密钥协商,通过一轮非对称加密,一般是RSA加密来传递后序通信过程使用的对称密钥,由于非对称加密较慢,后续通信过程中使用对称加密。在密钥协商的过程中,服务端会将自己的证书发送给客户端,客户端会到CA机构通过摘要值验证证书的合法性,从而防止中间人攻击。

补充提问:你对中间人攻击有哪些了解?

中间人攻击主要分为SSL劫持攻击、SSL剥离攻击以及针对SSL算法的攻击

  • SSL劫持攻击即SSL证书欺骗攻击,攻击者为了获得HTTPS传输的明文数据,需要先将自己接入到客户端和目标网站之间;在传输过程中伪造服务器的证书,将服务器的公钥替换成自己的公钥,这样中间人就可以解密客户端和服务端的数据传输内容。可以通过在网站前端加入证书校验来预防SSL劫持攻击。
  • SSL剥离攻击,即将HTTPS连接降级到HTTP连接。假如客户端直接访问HTTPS的URL,攻击者是没办法直接进行降级的,该攻击方式主要是利用用户并不会每次都直接在浏览器上输入https来访问网站或者有些网站并非全网HTTPS,中间人攻击者在劫持了客户端与服务端的HTTP会话后,将HTTP页面里面所有的 https:// 超链接都换成 http:// ,用户在点击相应的链接时,是使用HTTP协议来进行访问。可以通过在网站前端检查URL是否被篡改来预防SSL剥离攻击。
  • 针对SSL算法的攻击:低版本的SSL协议是存在漏洞的,这些漏洞可能会被公共者利用,及时升级服务端的SSL配置可以预防针对SSL算法的攻击。

最终答案

浏览器在拿到url时,首先会对url进行解析,将域名与实际的文件路径分离,然后需要使用DNS协议,通过域名得到IP地址。
浏览器会查询浏览器缓存,如果有这个网址的缓存就可以直接获取到IP,如果没有就进一步访问本机缓存,如果本机缓存也没有才会发起DNS请求。
而DNS的服务器是一个树状结构,对于域名来说是倒着进行解析的,根节点是根DNS服务器,他的子节点为com、cn这种顶级域dns服务器,然后进一步向下进行解析。
以baidu.com为例,当我们的电脑需要发起DNS请求的时候,会先对根DNS服务器发起请求,这个服务器的IP地址一般在每台电脑上都有,我们一般会设置为8.8.8.8或者114.114.114.114,我们的电脑在访问根DNS服务器后,会得到con域DNS服务器的IP,然后会继续访问con域DNS服务器,这时就能得到baicu.com的IP地址了。

得到ip后浏览器会先与服务器通过TCP三次握手建立连接,然后构建HTTP请求。
在解析url时,我们能获取到需要请求资源的资源路径、端口号、请求参数等信息,这些信息会被存储在http头中,通过DNS请求获取到ip后,浏览器会构建并发送HTTP请求或者HTTPS请求,HTTPS就是在HTTP的基础上加了一个TLS协议来进行数据加密,这个我们待会说。
HTTP请求有很多种,但对资源的操作离不开增删改查,也就对应着POST、DELETE、PUT、GET请求。最常用的是GET和POST,其区别在于GET的参数是在url中的,而POST的参数是在请求的body中。
以GET为例,当需要发送HTTP请求的时候,同样也不是直接就发送了,需要先查询浏览器缓存。浏览器中的缓存分为强缓存和协商缓存,浏览器发起HTTP请求时首先会根据http头信息来判断是存有强缓存,以及其是否过期,如果有强缓存且未过期则命中,不会发送请求到服务器了。如果强缓存没命中,则会向服务器发起请求,这个请求的Header头中会带有浏览器最后一次请求该资源的时间和一个资源校验码(使用资源修改时间、资源大小等信息生成),服务器收到这个请求后会判断协商缓存是否过期,如果过期则返回新的资源信息,如果没过期则返回304状态码,表示资源未更新,可以使用缓存中的资源。

HTTP请求发出后会将数据包交给下层协议栈处理,在传输层和网络层该数据包会被分别加上TCP头和IP头,并且被发送出去,沿路的网关会收到这个数据包并进行识别和转发,直到该数据包被服务器收到,通过相同的流程返回回复数据包。

一般来说,浏览器第一次从服务器请求的资源都是一个HTML文件,例如服务端默认的index.html等,浏览器获取到这个HTML文件就会对其进行解析,构建出一棵DOM树,并通过执行其中的js代码发起更多的请求,请求渲染页面需要的其他资源,CSS或者一些外链的图片等,拿到CSS后将其与DOM树结合进行更进一步的渲染,我们就能看到页面了。

最后再补充一下HTTPS,由于HTTP是使用信息明文传播,所以会有窃听、篡改、冒充等风险,所以HTTPS在HTTP的基础上加上了SSL层,通过加密的方式来保证数据安全。
SSL通过加密防止窃听,通过签名来防止篡改,通过证书来防止冒充。
HTTPS协议在客户端与服务端开始通信前,会进行密钥协商,通过一轮非对称加密,一般是RSA加密来传递后序通信过程使用的对称密钥,由于非对称加密较慢,后续通信过程中使用对称加密。在密钥协商的过程中,服务端会将自己的证书发送给客户端,客户端会到CA机构通过摘要值验证证书的合法性,从而防止中间人攻击。

参考资料