在浏览器的地址栏上输入lion1ou.win,然后点击回车,回车到看到页面这一段时间到底发生了什么?

答:域名解析 –> 发起TCP的3次握手 –> 建立TCP连接后发起http请求 –> 后台服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) –> 浏览器对页面进行渲染呈现给用户

以下我们简单介绍一下各个步骤:

域名解析

即解析域名对应的IP地址。浏览器会从浏览器自身的DNS缓存,操作系统的DNS缓存,hosts文件一层层向外查询域名对应的IP地址。如果在都没找到则会发起一个DNS的调用,通过运营商提供的DNS服务器向外界查询IP地址。则运营商DNS服务器会从根域的DNS服务器找到.win域的DNS服务器,再从.win服务器找到lion1ou.win的DNS服务器,最后找到对应的IP地址返回给操作系统内核,内核再将地址返回给浏览器。这样就完成一次域名解析的过程了。

发起TCP的3次握手

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接。

拿到域名对应的IP地址之后,User-Agent(这里一般指的是浏览器)会以一个随机端口(1024-65535)向后台服务器的WEB程序(httpd或nginx)的80端口发起TCP的连接请求。

TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图所示。

  • 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
  • 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
  • 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。确认号:其数值等于发送方的发送序号 +1(即接收方期望接收的下一个序列号)。

建立TCP连接后发起http请求

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

进过TCP3次握手之后,浏览器发起了http的请求,使用的http的方法GET方法,请求的URL是/,协议是HTTP/1.0。下面是Chrome发起的http请求报文头部信息:

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

服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件。请求成功后,服务器返回给客户端http响应包(200 ok 响应的MIME类型是text/html),代表这一次客户端发起的http请求已成功响应。用Chrome浏览器看到的响应头信息:

浏览器解析html代码,并请求html代码中的资源

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

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

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

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

转载请标注原文地址