0


面试官:输入 url 之后会执行什么样的流程?

输入 url 后的流程

前言

最近的面试中遇到一个比较常见的问题,面试官:同学,你知道我们在浏览器中输入 url 之后会执行什么流程嘛?

好好问问自己,真的清楚吗?本文博主就来整体的梳理一遍,输入 url 之后的流程。

首先,我们需要明确,输入 url 之后会执行哪些操作?

  1. 执行 DNS 域名解析。
  2. 封装 HTTP 请求报文。
  3. 封装 TCP 请求数据报。
  4. 建立 TCP 三次握手。
  5. 数据报从客户端传输到服务器。
  6. 服务器接收到数据包后,进行相应的业务处理,再封装成 HTTP 数据报,返回给客户端。
  7. 客户端与服务器的交互完成,断开 TCP 连接(四次挥手)
  8. 浏览器通过自身引擎,将数据渲染并展示给用户。

下面我们就来一一看看每一个步骤都有哪些细节。


1. DNS 域名解析

在网络中,我们是需要依靠 IP 地址去进行定位的,所以在输入 URL 之后的第一个步骤就是需要拿到 IP 地址,这就需要我们对输入的 URL 进行 DNS 域名解析了,把输入的 URL 转换成他相对应的 IP 地址。

那么为什么我们要输入 URL 而不输入 IP 直接获取地址呢?原因很简单,就是因为 IP
地址太长太不好记了,一串数字根本记不住,但是如果使用 URL 就好记很多,比如我们熟悉的 “www.baidu.com”。

URL 就像是 IP 地址的别名一样,一一对应,拿到我的 URL,就一定能通过 DNS 域名解析获取到对应的 IP 地址。

域名解析大致流程:

  1. 先检查浏览器中的缓存,是否有当前 url 地址对应的 ip 地址,如果有,就直接返回缓存中的 ip,完成解析。
  2. 如果浏览器中的缓存没有当前 url 对应的 ip 地址,则会在操作系统中寻找是否留有缓存,如果有,则直接返回该 ip,完成解析。
  3. 如果操作系统中依然没有对应缓存,则会在本地 host 文件中寻找是否留有缓存,如果 host 文件中有对应记录,则直接使用,完成解析。ps:host 文件目录一般为 “C:\Windows\System32\drivers\etc\hosts”。
  4. 如果在 host 文件中也没有找到,则会请求本地 DNS 服务器,完成对应的域名解析,而本地 DNS 服务器,一般由本地网络服务商提供,如移动,电信等。通常情况下可根据 DHCP 完成自动匹配,也可以通过手动设置,一般设置为 “8.8.8.8” 或者 “114.114.114.114”。
  5. 如果在本地服务器中也没能完成解析,则会去根域名服务器中进行查找,但根域名服务器本身并不会直接去解析域名,这是为了保证解析域名请求的高效性。根域名服务器将不同的域名解析请求分类后交由不同的域名解析服务器去处理。

下面是 DNS 域名系统的树状结构图:

在这里插入图片描述
由上图所示将域名解析完成之后,就可以拿到对应的 IP 地址了,从而进行下一步。


2. 封装 HTTP 请求数据报

我们要将对应的请求通过 http 应用层协议发送给服务器,就需要将请求封装成 http 格式的请求数据报。

一般的,http 请求的格式如下:

在这里插入图片描述

由图可知,一个 http 请求中包含了 4 个部分:

  1. 请求头
  2. 请求报文
  3. 空行
  4. 请求正文

一般请求头中包含请求方法(常用 GET/POST),url,http 版本号

在通过 DNS 域名解析得到服务器 IP 之后,就会将要发送的请求封装成如上格式的 http 请求,接下来通过网络套接字将 http 请求向下传递到数据链路层。


3. 封装 tcp 数据报

因为 HTTP 协议底层是基于 TCP/IP 协议的,所以当来到传输层之后,就会将传递过来的 http 请求进行解析,并在数据报上拼接上一个 TCP 报头,将整个数据报封装成一个 TCP 数据报之后继续向下传递。


4. 进行 tcp 三次握手连接

要想在客户端/服务器间进行通信,则少不了 TCP 的连接,毕竟你 HTTP 协议都是基于我 TCP 的嘛。

而 tcp 想要进行连接,就需要经过 3 次握手来完成,通过这 3 次握手则能确保客户端发送和接收数据的能力,并且确保服务器端发送和接收数据的能力。

整个 tcp 三次握手的过程就像打电话:

  1. A:喂喂喂,你听的到吗?
  2. B:我听得到,你能听见吗?
  3. A:我也能听见。

第一步就是客户端给服务器端放松了一个 SYN 数据报,申请建立连接。
第二步就是服务器在收到客户端的 SYN 数据报之后,立刻返回一个 ACK 响应报文给客户端,证明了客户端的发送能力和服务器端的接收能力。
第三步就是客户端在收到服务器端的 SYN + ACK 报文之后,也返回给服务器端一个 ACK 响应报文,证明了服务器端的发送能力和客户端的接收能力。

通过以上的三次握手的过程,能够确保通信双方的数据的接收和发送能力,以及双方通信间的网络稳定性,这样,就可以开始进行通信了。


5. 服务器端获取到 http 请求

由客户端发送数据包给服务器端接收到,期间还会经过 3 个过程,分别是封装过程,转发过程以及分用过程

下面就来详细解释一下完整的流程:

封装过程:

在 tcp 三次握手建立好连接之后,此时的数据报是一个带有 TCP 报头的 TCP 数据报,则在这再次将数据报向下传递给网络层。

网络层常用的协议是 IP 协议,则在网络层会将该 TCP 数据报进行解析,并拼接上一个 IP 报头,封装成一个 IP 数据报。

继续向下传递至数据链路层,在数据链路层使用的协议是以太网协议,同样的,对数据包进行解析,并且拼接上帧头和帧尾,封装成一个以太网数据帧,向下传递。

传递到物理层,则会对以太网数据帧进行解析,将数据由 0/1 序列转变为光/电信号,进行转发。


转发过程:

在发送的数据报到达服务器端之前,会经过很多的转发设备,比如路由器和交换机,在路由器和交换机中进行分用和封装,讲数据报一路传递到服务器端。

而在这个过程中值得注意的是,交换机是分用到数据链路层,而路由器是分用到网络层。


分用过程:

当数据报传输到服务器端后,由物理层对光/电信号进行解析,转换成 0/1 序列的以太网数据帧,发送到数据链路层,在数据链路层拿到以太网数据帧,将帧头和帧尾去掉,这就完成了一次分用。

此时去掉帧头帧尾的数据报成了一个 IP 数据报,传输到网络层,交由网络层进一步对数据进行解析,在网络层,将 IP 数据报的 IP 报头去掉,变成一个 TCP 数据报,传输至传输层,这就又完成了一次分用。

在传输层,拿到 TCP 数据报,将 TCP 报头去掉,将解析的数据通过 socket 套接字传输至应用层,此时服务器端拿到的就是一个 HTTP 请求。


6. 服务器获取请求进行业务处理

服务器端在拿到 HTTP 请求之后,将数据进行解析,并对其进行相应的业务处理,将要返回的数据封装成一个 HTTP 响应报文,再返回给客户端。

一个 HTTP 响应数据报,一般来说长下面这个样子:
在这里插入图片描述
其中也包含了 4 个部分:

  1. 状态行
  2. 响应报头
  3. 空行
  4. 响应正文

其中状态行用于描述当前响应的状态
它由三部分组成:

  1. HTTP 版本号
  2. 状态码
  3. 状态描述信息

常见的状态码:

  • 200 - 返回成功
  • 301 - 永久重定向
  • 302 - 临时重定向
  • 404 - 未找到页面
  • 500 - 服务器出错

在构造好 HTTP 响应报文之后就要经过数据的返回,而返回的过程,也同样要经过上述描述的数据传输过程,进行封装,转发,分用三个步骤,这里就不再展开进行剖析了。


7. 断开 TCP 连接

在完成一次数据交互之后,客户端和服务器之间的交流也就随之结束了,这个时候就要断开 TCP 的连接,这个过程就是 4 次挥手。

简单举个例子就是:

  • 客户端:我们分手吧
  • 服务器:好的,你让我准备一下
  • 服务器:我准备好了,我们分手吧
  • 客户端:好的

经过上述的流程之后,TCP 的连接也就被断开了。

具体来说就是客户端给服务器发送一个将 FIN 置为 1 的数据报,然后服务器端接收到该数据报之后由内核态自动给客户端发送一个响应报文,该报文将 ACK 置为 1,并且当服务器端的用户态执行到断开连接的指令时,向客户端发送一个 FIN 置为 1 的数据报,在客户端接收到该数据报之后返回一个 ACK 置为 1 的响应报文,表示当前连接成功断开。


8. 浏览器渲染并展示结果

当 TCP 的连接断开之后,此时的客户端已然接收到了服务器端发来的响应报文,此时由客户端解析响应并发数据传输到浏览器,由浏览器的自身引擎渲染数据,并将最终的数据呈现给用户。

此时,便完成了输入 URL 之后的完整的数据交互过程。


总结

以上就是本文的全部内容,由本文可知,当我们在浏览器中输入 URL 之后,首先会对 url 进行 DNS 域名解析,获取到对应的 IP 地址,拿到 IP 地址之后,相当于知道了服务器所在地,就可以把想要发送的请求构造成一个 HTTP 请求报文,通过 TCP 三次握手与服务器端建立好连接之后,便可把 HTTP 请求报文进行传输,传输到服务器端之后,由服务器对请求数据进行解析并做业务处理,构造一个 HTTP 响应报文返回给客户端,客户端收到数据解析完成后,将数据交由浏览器,通过浏览器的引擎渲染数据并最终呈现给用户。

总的来说,整个过程并不算复杂,而这也是在校招过程中经常被问到的一个考点,希望博主的整理可以给大家带来帮助,希望给个三连支持~

标签: 网络 服务器 java

本文转载自: https://blog.csdn.net/Aaron_skr/article/details/126736933
版权归原作者 万羽西 所有, 如有侵权,请联系我们删除。

“面试官:输入 url 之后会执行什么样的流程?”的评论:

还没有评论