从浏览器输入url到显示页面,发生了什么?

本文是关于浏览器和服务器端交互过程的一个转载整理。

(一)浏览器查找该域名的IP地址

查找顺序: 浏览器缓存→系统缓存→路由器缓存→ISP DNS缓存→根域名服务器

a.首先查找浏览器缓存,浏览器会缓存DNS记录一段时间,不同浏览器缓存时间不等(2min–30min)。
b.如果在浏览器缓存中没找到,浏览器会做一个操作系统调用(windows是gethostname),获取系统缓存中的记录。
c.如果系统缓存中没找到,将查询请求发给路由器,它一般会有自己的DNS缓存。
d.接下来查找ISP(Internet Service Provider,即因特网服务提供商)。 每一个ISP,或一个大学,甚至是一个大学里的系都会有一个自己的本地域名服务器,他会在url第一次访问时缓存该域名的指向。下次再访问时,他会从缓存里把这个url曾经指向的IP调出来。
e.仍没找到的话,请求将发给根域名服务器进行搜索。找不到则说明该域名不存在。

(二)浏览器根据解析得到的IP地址向web服务器发送http请求

示例:
GET http://facebook.com/ HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, […]
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; […]
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: facebook.com
Cookie: datr=1265876274-[…]; locale=en_US; lsd=WW[…]; c_user=2101[…]

浏览器将请求发送到Facebook所在的服务器,各项参数:
GET表示读取的url;
Accept和Accept-Encoding表示希望接受的响应类型;
User-Agent表示浏览器自身定义;
Connection要求服务器为了后边的请求不要关闭TCP连接;
Cookie会存储登录用户名、服务器分配的密码、用户偏好设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。

(三)服务器可能返回301永久重定向响应,浏览器跟踪重定向地址

服务器给浏览器响应一个301,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”。浏览器就根据重定向地址再次发送请求。

【注】为什么服务器一定要重定向而不是直接发回用户想看的网页内容呢?这个问题有好多有意思的答案。
其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.igoro.com/http://igoro.com/,搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。

还有一个是用不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。

(四)服务器处理请求

[1]web服务器软件(apache/IIS等)接收到http请求,通过程序(类似于asp.net,php,ruby)等读懂请求并生成html响应。
[2]处理请求时阅读请求、header参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上。然后生成html响应。

所有动态网站都面临一个有意思的难点–如何存储数据。小网站一般都会有一个SQL数据库来存储数据,存储大量数据或访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案 有:sharding分片(基于主键值将数据表分散到多个数据库中),复制,利用弱语义的一致性简化数据库等。

(五)服务器发回html响应

服务器生成并返回的响应:
HTTP/1.1 200 OK
Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP=”DSP LAW”
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cnection: close
Transfer-Encoding: chunked
Date: Fri, 12 Feb 2010 09:05:55 GMT

关于压缩,头信息说明了是否缓存这个页面,如果缓存的话如何去做,有什么cookies要去设置和隐私信息等等。

请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其他因素。

(六)浏览器显示html,发送请求获取嵌入在html中的对象

在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了。显示HTML时,它会注意到需要获取其他地址内容的标签。这时,浏览器会发送一个获取请求来重新获得这些文件(例如图片、css样式表、js文件等)。
但不像动态页面那样,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取。服务器的响应中包含了静态文件保存的期限信息,所以浏览器知道要把它们缓存多长时间。还有,每个响应都可能包含像版本号一样工作的ETag头(被请求变量的实体值),如果浏览器观察到文件的版本ETag信息已经存在,就马上停止这个文件的传输。

(七)浏览器发送异步(AJAX)请求

页面显示完成后浏览器仍与服务器端保持着联系。它会持续与服务器保持联系来及时更新一些页面信息。在浏览器中执行的 JavaScript代码会给服务器发送异步请求。

拓展:
三次握手:
https://blog.csdn.net/wn_hello/article/details/50066339
https://www.cnblogs.com/cy568searchx/p/3711670.html

ARP协议:
http://www.cnblogs.com/hongzg1982/articles/2335313.html

参考链接:
http://www.cnblogs.com/xiaoloulan/p/6265956.html
https://blog.csdn.net/liuzhigang828/article/details/74170805
http://www.cnblogs.com/xsilence/p/6035559.html

猜你喜欢

转载自blog.csdn.net/wn_hello/article/details/80439402