原来在浏览器输入框键入一个 URL 的过程还能这么答

151 阅读4分钟

分析在浏览器输入框键入一个 URL 的过程

在浏览器输入框键入一个 URL 的过程,这是一道已经被问烂了的面试题,相信不少同学都已经有一套自己的回答说辞了,针对这道题目,我给一个我自己的回答,期望能对各位小伙伴有帮助。

当我们在浏览器输入一个URL并按下Enter后,浏览器会解析我们输入的URL,并将其转为HTTP请求消息,正常情况下,我们键入的是域名,当前的浏览器默认使用HTTPS协议,当然也可以使用HTTP协议,我这里以HTTP协议为例。

与此同时,浏览器会根据URL解析出域名信息,委托DNS服务找到域名对应的IP地址。接着,根据HTTP请求消息以及服务器IP,浏览器会使用Socket将这两个参数传递给操作系统并委托操作系统的协议栈完成数据的传输。

进入传输层,HTTP消息将作为数据被封装,并加上一个TCP头,在传输层进行正式的数据传输之前,TCP还会先进行三次握手,在三次握手的过程中,客户端传输层的数据包需要被传递到服务器的传输层,这里涉及计算机网络两点之间的通信,因此我们从这里继续向下看。

第一次握手过程中,客户端传输层将发送一个仅包含TCP头部的包,这个包的SYN标志位置为 1,表示想与服务器建立连接,接着这个数据包被送到网际层,网际层将本机IP,port以及服务器的IP,port,装入IP头部,数据部分为TCP的头部。封装好之后,进入数据链路层,我们假设客户端的电脑使用的是网线连接路由器或者交换机,那么数据链路层将会给IP数据包封装多一个MAC头部,最终由网卡将这个数据包转为电信号通过物理层传递出去。

出了网卡之后,就会进入用户网域的网关路由器,路由器会将电信号进行解析,并拆除MAC头,拿到其IP包,路由器根据IP包中的内容以及路由表决定这个包的下一跳。通过路由器的接力,第一次握手的数据包到达服务器,由于服务器有防火墙,因此防火墙会先检查数据包是否合法,合法才放行,最后进入到服务器的网卡,服务器最终收到客户端的第一次握手请求并返回这个第二次握手的数据包。回来的过程与过来的时候相似,这里不再赘述。

我们将视角移回到客户端,我们此时仍在传输层,HTTP请求消息并没有发出去,待握手成功,客户端与服务器建立连接后,HTTP请求便可以发送了,一般来说HTTP的请求消息不会很大,使用以太网时TCP包的数据最大为1460字节,并不会达到这个上限,因此不会触发TCP的拆包机制。接着后面的过程与前面几乎一致,不过在响应方面会有不同。

由于时代的进步,网站的内容越来越丰富,用户对响应速度的要求也越来越高,如果仍然按照传统的客户端请求,服务器响应来传输数据,那么响应时间必然是有一定的时间的,因此推出了CDN技术,也就是说,服务器可以将一些变化不频繁的静态数据放在CDN服务器,响应的时候部分数据由CDN响应给客户,缓解浏览器的压力。这是我需要强调的地方。

最终,浏览器拿到了网站的数据,根据我先前的说法,网站数据来到浏览器必定是有一个先后顺序的,浏览器就拿着提前到达的数据变解析边等待后续的数据到来,这里就用到了多线程技术。

最终,耗时可能 0.1 秒甚至更少,一个渲染好的网站便呈现在我们浏览上。

以上便是我自己对分析在浏览器输入框键入一个 URL 的过程这个问题的解答,其实能写的内容十分的多,比如使用HTTPS协议的过程,就算是HTTP协议,不同的版本也是有不同的说法的,例如HTTP/2.0默认使用TLS,头部压缩等,HTTP/3.0甚至不使用TCP协议而是使用UDP协议,我觉得大家如果能将这个问题进行优化,使用新时代的协议来给这个答案添加更多的色彩,避免庸俗化,是很容易让面试官眼前一亮的。

求知若渴,虚心若愚。

今天的内容就到这里,我是东蓓,我们下期再见~