输入网址后发生了什么(常见经典面试题)

时间:2021-09-09 09:08:56 类型:web前端
字号:    

一次HTTP请求过程或者输入网址(www.ncyteng.com)后发生了什么?

前言

一、流程概括

二、具体流程

1.DNS解析

2.三次握手建立连接

2.1为什么是三次握手,二次不行吗?

3.发送HTTP请求

4.服务器解析请求,并返回数据

5.浏览器解析响应,展示相应的界面

6.断开连接(四次挥手)

6.1为什么是四次挥手?

前言

当我们在浏览器中输入一个网址后,浏览器给我们返回一个页面过程中,到底发生了什么?


一、流程概括

1.进行DNS解析,找到对应ip地址的服务器

2.通过TCP协议建立连接(三次握手)

3.建立连接后,浏览器发送HTTP请求

4.服务器根据HTTP请求返回相应的数据

5.浏览器根据协议解析数据,得到资源

6.根据得到的资源显示在页面上

7.根据Connection的Keep-Alive属性可以选择是否断开TCP连接(四次挥手)


二、具体流程

1.DNS解析

DNS解析过程就是寻找哪台机器上有你所要的资源,根据URL得到相应的ip地址去寻找:

1.先在浏览器本地缓存中查找是否相应的记录,浏览器缓存会保存一些访问过网址的DNS信息,

2.如果没有找到,就在本机操作系统缓存中查找是否有当前要访问的DNS信息,

3.如果还没有找到对应的ip地址,就发送到路由器上,路由器根据自身查找当前记录,路由器本身也会存储一些DNS信息,

4.如果没有找到,这个请求就会发送到运营商上,运营商就是互联网服务提供商,一般大部分请求的域名都能在这里找到,

5.如果还没有找到,就将请求发送给根域名服务器进行搜索,

6.如果还没找到,就说明这个域名不存在,或者说域名过期了。


所以DNS解析过程就是

浏览器->操作系统->路由器->运营商->根路由器


2.三次握手建立连接

找到相对应的服务器之后,浏览器要和服务器建立相对应的连接,通过三次握手建立连接,保证建立连接无误。

为什么要进行三次握手?确保接收双方发送能力和接收能力是否正常

三次挥手的过程:

1.第一次握手,客户端向服务器发送SYN报文,并指明客户端的初始化序列号 ISN,首部的同步位SYN=1,初始序号seq=x,

2.第二次握手,服务器接收到客户端SYN报文,并将自己的SYN报文作为响应发送,同时把客户端的ISN+1作为ACK的值,表明自己已经接收到客户端的SYN

3.第三次握手,客户端接收到服务器SYN报文后,同样把服务器的ISN+1作为ACK的值,表示已经接收到服务器的SYN报文,服务器收到ACK值后,此时双方建立连接



2.1为什么是三次握手,二次不行吗?

三次握手的目的就是确认客户端和服务器两端接收和发送能力正常,通过三次握手来保证的

1.第一次握手,客户端发送报文,服务器接收报文

这样服务器端就能得到结论:客户端的发送能力,服务器的接收能力是正常的

2.第二次握手 服务器发送报文, 客户端接收报文 ,

客户端得到结论 客户端接收能力,服务器发送能力是正常的,但是此时服务器并不知道,客户端的接收能力是否正常,就需要第三次握手来确定

3.第三次握手 客户端发送报文,客户端接收报文,

服务器就得到了 客户端接收能力正常

这样三次握手才能确定双方的接收能力和发送能力是否正常


如果是两次握手:

有一次连接的时候,客户端发送的请求丢失了,客户端等待一段时间后没有接收到响应,就会重新发送一个请求,第二个请求成功到达后,服务返回响应建立连接,但是第一次请求可能在某些网络结点长时间滞留了,延误到连接释放以后的某个时间才到达服务端,这样服务器以为是建立了新的连接了,就发送响应,此时客户端会忽略服务器发送的响应,也不发送数据,而服务器这边一直等待客户端发送的数据,造成了资源的浪费。


3.发送HTTP请求

通过建立的TCP连接,客户端向服务器发送HTTP请求,

1、HTTP请求的格式

1.首行: 【方法】+【URL】+【版本】

2.Header(请求报头):请求的属性 , 冒号分割键值对

3.空行:Header结束的标志

4.Body : 空行后面的内容都是Body


4.服务器解析请求,并返回数据

服务器根据HTTP协议来解析请求,得到客户端想要的数据,并发送响应

HTTP响应格式

1.首行: 【版本号】+【状态码】+【状态码解释】

2.Header:响应的属性 , 冒号分割键值对

3.空行:Header结束的标志

4.Body : 空行后面的内容都是Body


5.浏览器解析响应,展示相应的界面

浏览器通过HTTP协议来解析服务器发送的响应,将响应中的资源展现出来,比如一些HTML界面,文字,图片信息等


6.断开连接(四次挥手)

当数据完成请求到返回的过程之后,根据Connection的Keep-Alive属性可以选择是否断开TCP连接

双方都可以主动断开连接,断开连接后主机中的「资源」将被释放。

1.客户端想断开连接,就会发送一个TCP首部FIN标志为1的报文,也就是FIN报文,之后客户端进入FIN_wait_1状态

2.服务器接收到客户端发送的报文,就会回复一个ACK应答报文,服务器进入CLOSED_WAIT状态

3.客户端接收到服务器的应答报文,就进去FIN_wait_2状态

4.等待服务器端处理完数据后,向客户端发送一个FIN报文,服务器进如LAST_ACK状态

5.客户端接收到FIN报文后,回复一个ACK报文,客户端进入TIME_WAIT 状态

6.服务器接收到ACK报文后,就进入了CLOSED状态,自此服务器端已经完成连接的关闭

7.客户端等待2个时间段后,自动进入CLOSED状态,自此客户端已经完成连接的关闭



首先客户端发送FIN报文,就是说明客户端不再发送数据,但是还会接收数据,服务器接收到FIN时,先发送响应ACK,但是服务器这边还有未处理完的数据,还要发送数据,当服务器不再发送数据时,才会发送FIN给客户端,通过现在关闭连接。


6.1为什么是四次挥手?

TCP连接时不允许半打开状态,就单向传输数据,所以在三次握手时,服务器就会把SYN和ACK同时发送给客户端,其中,ACK 用来打开客户端的发送通道,SYN 用来打开服务器的发送通道。这样,原本的四次握手就降为三次握手了。

而当连接处于半关闭状态时,TCP是允许单向传输数据的,当客户端要关闭连接时,发送FIN但是服务器可能还没有处理完数据,等服务器处理完数据后才会发送FIN确认关闭数据,即每一方都要接收和发送FIN和ACK报文,所以就是四次挥手了

<