吊打面试官之浏览器输入网址发生了什么


前面我们学习了各种协议,应用层的 HTTP、DNS 协议,传输层的 TCP 协议,网络层的 IP 协议等等,今天我就带你看看一道常见的面试题:当在浏览器输入一个网址后会发生什么?探究一个数据包在网络的心路历程。

解析 URL

当我们在浏览器输入一个 URL 后,第一步就是对 URL 进行解析,得到里面的参数,将域名和需要请求的资源分离开来,从而知道需要请求的是哪个服务器,请求的是服务器上的哪些资源等。我们首先看看 URL 各元素的组成:

image-20220327125929734

服务器上面的资源的文件路径为:

image-20220327125939272

封装 HTTP 请求报文

URL 进行解析之后,浏览器确定了目标服务器和文件名,接下来就需要根据这些消息封装成一个 HTTP 请求报文发送出去。例如将上面的请求URL解析之后封装成下面这样的 HTTP 请求报文:

image-20220327125947083

封装好报文之后,就是将该报文发送出去,但是怎么知道服务器的地址呢?别忘了,我们之前学的 DNS 协议。

DNS 域名解析获取 IP 地址

在浏览器解析完 URL 后我们可以得到域名,但是域名并不是服务器的真实地址,IP地址才是每一台计算机在全世界的唯一标识,所以我们需要根据域名解析出 IP 地址,关于 DNS 协议不懂的可以看这篇

根据域名解析出 IP 地址我们在上一篇文章中讲解的很详细了,这里简单的复习一下获取IP地址的过程:

image-20220327130017954

通过上面的过程我们就知道服务器的IP地址了,于是就可以将请求发送给该服务器,但是在发送请求之前,我们还需要和服务器建立连接,那就是我们都知道的 TCP 连接了。

建立 TCP 连接

知道了服务器的 IP 地址之后,就可以和服务器建立连接了。关于和服务器建立连接,就是我们熟悉的 TCP 三次握手和四次挥手了,什么,你还不知道,等我。

这里简单的介绍一下 TCP 的三次连接:

image-20220327130033908

在建立好连接之后,我们就可以将请求发送给服务器了,但是上面的 HTTP 请求不问不能在 TCP 层进行传输啊,于是 TCP 会将HTTP 报文按序号分割成若干报文段并加上 TCP 首部,分别进行传输。接收方在收到这些报文段后,按照序号以原来的顺序重组 HTTP 报文。

远程定位的 IP 协议

实际上,TCP 在三次握手建立连接、四次握手断开连接、以及连接建立过程中的收发数据(TCP 报文段)等各阶段操作时,都是基于 IP 协议进行传输的,IP 协议将这些阶段的数据添加 IP 首部封装成 IP 数据报再进行传输。

IP 数据报的首部存有源 IP 地址目标 IP 地址。所谓源 IP 地址就是发送方的 IP 地址;目标 IP 地址就是通过 DNS 域名解析得到的目标服务器的 IP 地址。

其实,TCP 数据报并不是直接发送给目的服务器的,而是会经过很多路由器的中转操作才能到达目标服务器,但是怎么每次中转的时候怎么知道转到哪个路由器呢?于是,ARP 协议就出现了。

使用 ARP 解析 MAC 地址

我们知道 IP 协议的作用就是把各种数据包传送给对方,但是我们必须通过路由器中转才能将请求发送给目标服务器,这是因为客户端和服务器一般不会在同一个局域网内。这就需要利用中转设备的 MAC 地址来搜索下一个中转目标,并将 IP 数据报封装成 MAC 帧进行传输。就像下面这样:

image-20220327130041747

不知道 ARP 协议的,可以去看看我们之前写的文章,可以说是很清楚了。

服务器响应请求

通过上面一系列的步骤之后,就可以将请求发送给服务器了。这里我说一下请求时封装数据包和到达服务器时拆解数据报的方法:

image-20220327130050901

服务器处理完请求之后,也会以同样的方式将响应返回给客户端浏览器,浏览器就会将请求的资源渲染出来。

当服务器和客户端没有数据需要发送之后,就会断开连接,到此为止一个相应就完成了。

总结

这篇文章我们只是简单的总结了一下网络通信的过程,并没有写很详细的步骤,如果对具体步骤不是很了解的同学可以去看看之前的文章,这里就没有重复了,这里我们简单的总结一下上面的过程:

应用层:

  • 浏览器封装 HTTP 请求报文
  • DNS 解析域名获得目标服务器地址

传输层:

  • 建立连接
  • 把应用层传过来的 HTTP 请求报文进行分割,并在各个报文上打上标记序号及端口号转发给网络层

网络层:

  • 利用 ARP 协议根据 IP 地址获取作为通信目的地的 MAC 地址后转发给链路层

服务端在链路层收到数据,按序往上层发送,一直到应用层接收到浏览器发送来的 HTTP 请求报文,然后处理该请求并返回 HTTP 响应报文,浏览器接收到响应报文之后解析渲染界面。最后 TCP 断开连接。

引用:

https://mp.weixin.qq.com/s?__biz=MzI0NDc3ODE5OQ==&mid=2247484696&idx=1&sn=ba933d74c77104ed282315ec37b9d72f&scene=19#wechat_redirect

https://mp.weixin.qq.com/s?__biz=MzUxODAzNDg4NQ==&mid=2247483989&idx=1&sn=7e2ed852770743d3955ef9d5561fcef3&chksm=f98e46ffcef9cfe98e6c753afac86125b0d5891ca5e63968b5f3a8da4905d14274088f40c34e&scene=178&cur_album_id=1337204681134751744#rd


  目录