浏览器输入URL到页面展示之中发生了什么?

当我们在浏览器的地址栏输入一个URL ,然后回车否能看到页面,这之中到底发生了什么呢?

其中我归纳为6个步骤:

        域名解析

        TCP的3次握手

        建立TCP连接后发起http请求

        服务器响应http请求,浏览器得到html代码

        浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)

        浏览器对页面进行渲染呈现给用户

一.域名解析

        首先浏览器会解析 www.xxx.com这个域名对应的IP地址。

怎么解析到对应的IP地址?

        1浏览器 会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有对应的条目,而且没有过期,如果有且没有过期则解析到此结束。 

        2如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束.

     注:怎么查看操作系统自身的DNS缓存,以Windows系统为例,可以在命令行下使用 ipconfig /displaydns 来进行查看 

        3如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。

        4如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器(一般是电信运营商提供的)发起域名解析请求(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址)。

如果经过以上的4个步骤,还没有解析成功,那么会进行如下步骤:

        5操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。

        6如果第5步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)

        7如果第6步也没有查询成功,那么客户端就要进行广播查找

        8如果第7步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)

        如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这八步中有一步可以解析成功,那就可以成功和目标计算机进行通信。

二. TCP的3次握手

        发送方:SYN(synchronize)

        接收方:SYN/ACK(acknowledgement),确认信息传达

        发送方:ACK - 确认接收方在线可收消息,握手结束

        Accept

        目前在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议作为TCP/IP模型中应用层的协议也不例外,TCP是一个端到端的可靠的面向连接的协议,所以HTTP基于传输层TCP协议不用担心数据的传输的各种问题。

三.建立TCP连接后发起http请求

        进过TCP3次握手之后,浏览器发起了http的请求:

        报文首部(GET/index.html HTTP/1.1)

                方法

                URL

                HTTP版本

        空行(CR+LF)

        报文主体

四.服务器端响应http请求,浏览器得到html代码

        报文首部(HTTP/1.1200 OK)

                HTTP版本

                响应状态码

                状态码信息

        空行(CR+LF)

        报文主体

常见的状态码信息:

        1xx:信息性状态码

    100, 101

        2xx:成功状态码

    200:OK

        3xx:重定向状态码

    301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向;

    302: 临时重定向,显式重定向, Location响应首部的值为新的URL

    304:Not Modified  未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,告诉浏览器,你不用请求该资源,直接使用本地的资源即可。

        4xx:客户端错误状态码

    404: Not Found  请求的URL资源并不存在

        5xx:服务器端错误状态码

    500: Internal Server Error  服务器内部错误

    502: Bad Gateway  前面代理服务器联系不到后端的服务器时出现

    504:Gateway Timeout  这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应

服务端后端一个线程((结合数据库查询出数据,填充模板生成html文件))生成一个html给浏览器

        会向内核发起IO系统调用(因为要跟硬件打交道,这里的硬件是指硬盘,通常需要靠内核来操作),告诉内核,我需要这个文件

       

四、浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)

        浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但是由于每个资源大小不一样,而浏览器又多线程请求请求资源,所以从下图看出,这里显示的顺序并不一定是代码里面的顺序。

        浏览器在请求静态资源时(在未过期的情况下),向服务器端发起一个http请求(询问自从上一次修改时间到现在有没有对资源进行修改),如果服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。

五、浏览器对页面进行渲染呈现给用户

        最后,浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,渲染之后呈现给用户。

自此一次完整的HTTP请求后得到页面宣告完成.

猜你喜欢

转载自blog.csdn.net/qq_27327855/article/details/80653354