前端面试题:输入url地址按下回车发生了什么?

1.输入地址。
2.DNS解析,寻找服务器。
3.TCP连接,三次握手。
4.发送http请求,找到相应的资源库;。
5.返回http响应。
6.浏览器解析渲染页面。
7.断开连接。

URL简介:通常最简单的url,就像这样:https://www.ycsnews.com/,这串url就包含方案(就是通信协议,常见的http,https),服务器地址(www.ycsnews.com),端口号(http协议默认是80端口,https协议默认是443端口,https就是加密的http协议,就是在http和TCP之间加了一层TSL或者SSL的安全层),资源(默认是index.html,跟服务器配置有关)。

1.输入url地址后,首先进行DNS解析,将相应的域名解析为IP地址;

1.第一次访问某个站点的时候解析过程发生了什么?

url解析出了服务器域名,现在要将域名解析出ip地址,就要请求域名服务器来解析ip,比如www.jianshu.com.这个域名,后面多了一个点,这个点就表示公网,通常是省略的,域名解析就是从右向左开始解析,解析.域->com域->jianshu.com域->www.jianshu.com域这样解析出ip地址来(其中的过程也是很复杂的,这里只是概括),如下解析过程:

用户发起请求->操作系统把域名发送给本地区的域名服务器->有就解析返回ip,然后结束;

用户发起请求->操作系统把域名发送给本地区的域名服务器->没有->到Root Server的域名服务器请求解析->返回一个主域名(.com)的服务器地址地址->本地的域名服务器再向主域名服务器发起请求->返回Name Server域名服务器地址(jianshu.com)->接下来的解析就由域名提供商的服务器来解析->Name Server域名服务器查询存储的域名和ip的映射关系表->返回ip地址和一个过期时间,根据这个时间缓存到本地,解析结束。

2.第二次再访问同样站点的时候要做什么?

通常第一次访问完成之后,浏览器会将域名解析的映射缓存到本地,下次再访问该站点的时候,会先从浏览器的缓存中查看有没有这个域名被解析过的ip地址,有没有过期等,如果有这个ip而且没有过期,解析过程就结束。如果浏览器的缓存中没有,浏览器就会查找操作系统的缓存中是否有对应域名的ip地址(操作系统的域名解析也有一个过程的,大家可以自行了解)。

2.客户端根据IP地址去寻找相应的服务器;

前面通过url解析出方案,端口号,域名服务器解析出ip地址,此时浏览器发起到122.228.25.221端口80的TCP连接,

3.与服务器进行TCP的三次握手;

所谓三次握手就是客户端在请求与服务器相连接时,彼此共计发送了三次数据包,就好比以下的对话:

首先,需要明确的是,三次握手是客户端先发起请求。
  第一次:浏览器向服务器发送请求(SYN=1),等待服务器确认;

第二次:服务器收到请求并确认,回复一个指令(SYN=1,ACK=1);

第三次:客户端收到服务器的回复指令,并返回确认(ACK=1);

形象版说明:
  (第一次)客户端:hi,服务器,在吗?我想和你建立连接,你能收到我的消息吗?(此时客户端给服务端发送了一个数据包和发送序号,即SYN=1,Seq=X)

(第二次)服务器:hi,客户端,我在呢,我收到你的消息了,我们可以建立连接,你能收到我答复的消息吗?(此时服务端发送syn+ack报文,并置发送序号为Y,再确认序号为X+1)

(第三次)客户端:我收到你的答复了,很开心能和你建立连接。(此时客户端发送ack报文,并置发送序号为Z,再确认序号为Y+1)

以上就是tcp三次握手的简化版。

4.客户端找到相应的资源库;
5.根据资源库返回页面信息;
6.浏览器根据自身的执行机制解析页面;(浏览器的执行机制?重绘?重排?…)

服务器返回html文档之后,浏览器的渲染引擎开始dom解析过程(构建DOM树->渲染树(Render tree)->布局render树->绘制render树)
  浏览器解析页面时,会找到每一个文件夹(css、js、html、img…),每一个文件夹下的资源会重新走到第二步,去找到相应的服务器,然后一步步执行。

7.最后服务器将解析信息返回给客户端,进行TCP的四次挥手。

所谓四次挥手就是客户端与服务端在断开连接时,彼此交互传输了四次数据包,就好比以下对话:

首先,需要明确的是,四次挥手不知道哪一方是主动方,哪一方是被动方。

男朋友(可能是客户端,可能是服务器):xxx,我们分手吧?我不想和你联系了。(此时主动方发送fin+ack报文,并置发送序号为X)

女朋友:好的,我收到你分手的消息了,我同意分手。(此时被动方发送ack报文,并置发送序号为Z,再确认序号问X+1)

(此时,女朋友正不爽呢,凭什么分手呀,我也不管你能不能收到,我也要提出分手…)

女朋友:xxx,我们分手吧,我也不想和你联系了。(此时被动方发送fin+ack报文,并置发送序号问Y,再确认序号为X)

男朋友:好的,我收到你同意并提出分手的消息了,再见!(此时主动方发送ack报文,并置发送序号为X,再确认序号为Y)

8.至此,客户端显示自己请求,即服务端返回的东西

你可能感兴趣的:(【★web前端开发】)