面试题整理学习(一):在浏览器中输入网址后的流程

       本篇博客属于整理性质的文章,贴出主要的参考链接在浏览器中输入网址后都发生了什么,当你从浏览器地址栏中输入URL回车后发生了什么


输入网址后流程图


1、浏览器发起DNS查询请求

       在广域网中是基于IP地址进行通信的。但通常客户访问的是一个网址,为此需要先得到网址对应的IP地址,这就需要域名服务系统将域名转换成IP地址。在客户端浏览器中输入网址时,浏览器会根据本地客户端DNS服务器配置,向DNS服务器获取域名对应的IP地址。
       域名解析服务器是基于UDP协议实现的一个应用程序,通常通过监听53端口来获取客户端的域名解析请求。

       DNS查找过程为:
       浏览器缓存->系统缓存->路由器缓存->ISP DNS缓存->递归搜索
       递归搜索过程为:从根域名服务器到顶级域名服务器到所查询的域名服务器。


2、域名服务器向客户端返回查询结果域名,从而完成域名到IP地址的转换。


3、客户端向web服务器发送HTTP请求

       得到了域名对应的IP地址后客户端便可向真正的web服务器发生HTTP请求。通常一个HTTP请求格式如下:

GET http://www.cricode.com/ HTTP/1.1
Host: www.cricode.com
Connection: keep-alive
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8  

       

       如果浏览器存储了该域名下的cookie,那么cookie也会放入http请求中         

       HTTP请求是一个基于TCP协议之上的应用层协议——超文本传输协议。浏览器通过DNS获取到web服务器真的IP地址后,便向Web服务器发起TCP连接请求,通过TCP三次握手建立好连接后,浏览器便可以将HTTP请求数据通过发送给服务器了。

      TCP三次握手连接:
      第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
      第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
      第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
     握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。


4、服务器给浏览器进行一个301永久重定向响应。

       IP对应的服务器很可能是代理服务器,比如输入“http://baidu.com”,而不是“http://www.baidu.com”,这两个网址对应的是同一个网页,因此通过代理服务器的方式进行重定向响应,让这两个网址访问的同一个网页。 浏览器根据重定向地址再次进行HTTP请求。

5、发送响应数据给客户端

      Web服务器通常通过监听80端口来获取客户端的HTTP请求。与客户端建立好TCP连接后,Web服务器开始接受客户端发来的数据,并通过HTTP解码,从接受到的网络数据中解析出请求的url信息以前其他诸如Accept-Encoding、Accept-Language等信息。
     Web服务器根据HTTP请求头的信息,得到响应数据返回给客户端。一个典型的HTTP响应头数据报如下:

HTTP/1.1 200 OK


Date: Fri, 24 Oct 2014 13:55:18 GMT


Server: Apache


X-Powered-By: PHP/5.4.32


Keep-Alive: timeout=5, max=10000


Connection: Keep-Alive


Transfer-Encoding: chunked


Content-Type: text/html; charset=UTF-8


a0f6




















快课网— 程序员的自我修养!





。。。。。。。


。。。。。。。






       至此,一个HTTP通信过程完成。web服务器会根据HTTP请求头中的Connection字段值决定是否关闭TCP链接通道,当Connection字段值为keep-alive时,web服务器不会立即关闭此连接。


6、浏览器响应过程

      浏览器收到响应内容之后,生成主页框架,同时向服务端继续发送请求,请求的内容是主页里的一些资源,比如说图片、视频等。 对于静态的页面内容,浏览器通常进行缓存,对于动态的内容通常不缓存,缓存的时间也是有期限的。
     浏览器向服务器发送异步请求,因为有些页面显示完成之后客户端仍需要与服务端保持联系。
     整个过程结束之后,浏览器关闭TCP连接。

TCP四次挥手断开连接

     假设Client端发起中断连接请求,即发送FIN报文。Server端接到FIN报文后,意思是说"Client端没有数据要发送了",但是如果Server端还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以Server端先发送ACK,告诉Client端"请求已经收到,但是Server端还没准备好,请继续等待消息"。这个时候Client端进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端"数据发送完成,准备好关闭连接"。Client端收到FIN报文后知道可以断开连接,但是怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后断开连接。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,则自身关闭连接。

面试题整理学习(一):在浏览器中输入网址后的流程_第1张图片                                          

 


你可能感兴趣的:(面试,网络)