http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/
*DNS是一个应用层的域名解析协议,简单说就是一套从域名映射到IP地址的系统,其底层使用UDP(TCP备选)进行解析(未对DNS底层进行学习,仅仅是知道这点)。
DNS查找过程如下:
(1)查找浏览器缓存——浏览器会缓存DNS记录一段时间,但问题是操作系统并不会告诉浏览器每个DNS记录的生存时间,因此浏览器会将他们缓存固定的持续时间(2到30分钟不等)
(2)查找操作系统缓存——如果浏览器不包含所需的记录,则浏览器将进行系统调用(Windows中为gethostbyname),操作系统是具有自己的DNS缓存的。
(3)查找路由器缓存——如果上一步未找到,则进行此操作,路由器通常也具有自己的DNS缓存。
(4)ISP DNS缓存——ISP(Internet Service Provider)因特网服务提供商,DNS服务器通常有两种,一种是权威DNS,一种是缓存DNS,ISP运营商的一般是缓存DNS,给用户查询使用的;域名商的是权威DNS,给缓存DNS查询使用的。
(5)递归搜索——ISP的DNS服务器开始从根名称服务器到.com顶级名称服务器再到Facebook的名称服务器的递归搜索。(通常,DNS服务器在缓存中具有.com名称服务器的名称,因此无需对根名称服务器进行匹配。)
*轮询DNS是一种DNS查找返回多个IP地址而不是一个IP地址的解析方案,例如,facebook.com实际上映射到4个IP地址。
*可以肯定的是,浏览器不会从缓存中提供Facebook.com的主页,因为动态页面会很快或立即过期(将过期时间设置为过去),因此浏览器会向Facebook服务器发送以下请求:
(1)GET请求的网址为“http://facebook.com/”,使用的协议为1.1版本的HTTP协议;
(2)浏览器标识自己(User-Agentb标头),并声明它所接受的响应类型(Accept和Accept-Encoding标头);
(3)Connection标头要求服务器保持此TCP连接开放以便接下来的请求;
(4)请求中还包括针对该域的Cookie,Cookie是键值对,在不同页面请求之间跟踪网站的状态,因此Cookie会存储登录用户的名称,服务器分配给该用户的密码,用户的某些设置等,这些Cookie存储在客户端的文本文件中,并发送给服务器处理每个请求。
*可通过抓包工具查看原始HTTP请求和相应的响应。
*除GET请求外,还有一种常见请求是POST请求通常用于提交表单,二者的区别是GET请求不能带正文,但可以在URL中带参数;POST请求可以带正文,并在正文中携带参数。
*URL“http://facebook.com/”中的斜杠很重要,这种情况下浏览器可以安全地添加斜杠,但对于这种形式“http://example.com/folderOrFile”的URL,浏览器无法自动添加斜杠,因为不清楚folderOrFile是文件夹还是文件,这种情况下,浏览器将在不带斜杠的情况下访问URL,并且服务器通过重定向进行响应,从而导致了不必要的往返。
这是Facebook服务器对浏览器请求的响应:
服务器以301永久重定向进行响应,Location标头告知浏览器目的地址是“http://www.facebook.com/”而不是“http://facebook.com/”。
*服务器坚持重定向而不是立即响应用户想要查看的网页的原因之一与搜索引擎排名有关,如果同一个页面有两个URL,例如“http://www.igoro.com/”和“http://igoro.com/”搜索引擎可能会将它们视为两个不同的站点,传入链接越短的站点排名越低,搜索引擎理解重定向(301),并将来自两个来源的传入链接合并到一个排名中;同样,相同内容的多个URL也不利于缓存,当一条内容具有多个名称时,可能会在缓存中多次出现。
现在,浏览器知道“ http://www.facebook.com/”是正确的URL,因此它发出另一个GET请求:
标头含义同第一次请求!
服务器接收GET请求,对其进行处理,然后发送回响应。
其中间过程并不像上面的表述这般简单:
(1)Web服务器软件——Web服务器接收HTTP请求,并决定应执行哪个请求处理程序来处理此请求。请求处理程序是一个程序,用于读取请求并生成响应的HTML。
(2)请求处理程序——请求处理程序读取请求,其参数和Cookie,并且可能更新存储在服务器上的某些数据,然后生成HTML响应。
这是服务器生成并发回的响应:
该响应内容告诉浏览器:
(1)响应体用gzip算法压缩,解压缩后即可看到所需的HTML;
(2)Cache-Control标头指定是否以及如何缓存页面;
(3)Content-Type标头指定正文类型为text/html以及字符集编码utf-8,指示浏览器将响应内容呈现为HTML,而不是将其下载为文件。(浏览器通过各个标头来决定如何解释响应,但也会考虑其他因素,例如URL的扩展);
(4)Expires标头指定到期时间。
*浏览器在接收到整个HTML文档之前,就开始呈现该网站。
*当浏览器呈现HTML时,它会注意到需要获取其他URL的标记,此时浏览器将会发送GET请求以检索每个文件。
以下是原文作者访问facebook.com时检索到的一些URL:
这些URL中的每一个都将经历类似于HTML页面经历的过程,但是与动态页面有所不同,静态文件允许浏览器进行缓存,某些文件可能会从缓存中提供,而无需联系服务器。浏览器知道将特定文件缓存多长时间,因为返回该文件的响应包含Expires标头,此外每个响应还可能包含ETag标头,其作用类似于版本号,如果浏览器看到已具有该文件版本的ETag,它可以立即停止传输。
*即使呈现页面后,客户端仍然与服务器进行通信。
异步请求是通过编程构造的GET或POST请求,该请求将转到一个特殊的URL;这种模式有时也称为“AJAX”,代表“Asynchronous JavaScript And XML”,即“异步JavaScript和XML”。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。