作为一个软件开发,你一定十分了解 web 应用程序如何工作并且有什么技术涉及其中:浏览器,HTTP,HTML,web 服务器,请求处理等等。
在这篇文章中,我们将会深入的了解一下,当你在浏览器地址栏输入 URL 的时候,实际上发生了什么

1、你在地址栏输入了一个 URL 地址

2、浏览器查询域名对应的 IP 地址


首先浏览器先去寻找访问过的域名的 IP 地址,DNS 查询的过程如下:

  • Browser cache
    浏览器缓存 DNS 记录。有趣的是,操作系统没有告诉浏览器每一个 DNS 记录存活时长,因此浏览器缓存记录是一个固定的时长。(根据浏览器的不同而不同,一般是 2-30 分钟)
  • OS cache
    如果浏览器没有查询到用户查询的记录。那么会查询操作系统是否存在这条记录
  • Router cache
    如果用户的操作系统也没有查询到,那么会继续查询路由(router),一般可以查询到 DNS 缓存
  • ISP DNS cache
    如果没有在 router 中查询到,下一个查询的的地方是 ISP 的 DNS 的服务器。
  • Recursive search
    你的 ISP 的 DNS 服务器开始递归搜索,从根域名服务器开始,经过.com 顶级域名服务器,一直到脸谱网的域名服务器。通常情况下,DNS 服务器可以查询到 COM 域名服务器的缓存,所以向根域名服务器查询一般不必要的。

如下是 DNS 查询递归示意图

3、浏览器向 web 服务器发送 HTTP


可以很确定的是一个网站的页面是不会缓存在浏览器中的,因为一个动态页面很快就会过期
因此浏览器将要向服务器发送请求

以上是指向http://facebook.com/  发起了 GET 请求。浏览器通过(user agent)标示自己,通过(Accept and Accept-Encoding headers)告诉服务器希望接受的字符串编码和数据类型。(Connection header)会告诉服务器在未来的一段时间内保持 TCP 链接

该请求还包含浏览器对该域的 cookie。正如您可能已经知道的,cookie 是键值值对,它们跟踪不同页面请求之间的 Web 站点的状态。因此,cookie 存储登录用户的名称、服务器分配给用户的密钥、用户的一些设置等。cookie 将存储在客户机的文本文件中,并随每个请求发送到服务器。

4、服务器永久重定向响应

对于浏览器的请求,服务器发送如下响应

服务器响应 301(永久重定向),告诉浏览器去  http://www.facebook.com/  请求 而不是“http://facebook.com/”

5、浏览器遵循重定向


浏览器知道了  http://www.facebook.com/  是正确的 URL 地址,重新发送一个请求

6、服务器处理请求

服务器接受 get 请求,处理它然后发送响应
他看上去是一个简单的任务,实际上有很多有趣的东西发生

  • web server software
    web 服务器软件(例如 IIS 或则 apache)接受 http 请求并且决定哪一个请求处理器去执行并处理这个请求。一个请求处理器就是一段代码(ASP,NET,PHP…),这段代码用于分析请求并且生成 HTML 代码作为响应。
  • request handler
    请求处理器处理请求参数,cookies 等。他将会处理并更新一些保存在服务器上的数据。然后生成 HTML 响应代码

7、服务器返回 html 响应


如下是服务器生成并发送回来的响应

这个(Content-encoding)告诉浏览器这个响应的内容是经过 gzip 算法压缩过的,解压后将看到 html 结构

除了压缩以外,headers 还标示了是否缓存页面,cookies 信息和一些隐私信息等。

8、浏览器渲染 HTML

当浏览器接受到整个 HTML 文档之前,就开始渲染页面

9、浏览器对嵌入在 html 中的资源发送请求


当浏览器渲染 HTML 的时候,他会注意到包含其它地址的标签。浏览器将会发送请求去获取这些文件

每一个 URL 所要经历的过程是和 HTMl 页面经历过程一样的。因此,浏览器也会经历:查询 DNS,发送请求,重定向等。
对于静态资源(不像动态的页面)浏览器是可以去缓存他的。一些文件资源可以不请求服务器获取,而直接从缓存获取。浏览器知道缓存一个资源多久因为服务器响应包含一个过期头信息(Expires header)。除此之外,每一个响应也包含 ETag(一个版本号)–如果浏览器发现一个已经存在的文件有 Etag,他将立即停止请求。

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


在 web2.0 时代,即使在页面呈现后,客户机仍继续与服务器通信。
例如,facebook 聊天将继续更新你的登录朋友的名单.为了更新登录好友的列表,浏览器中执行的 JavaScript 必须向服务器发送异步请求。异步请求是一个以编程方式构建的 GET 或 POST 请求,该请求指向一个特殊 URL。在 facebook 的例子中,客户端发送一个 POST 请求到 ‘http://www.facebook.com/ajax/chat/buddy_list.php’  去取名单您的在线的朋友。
这种模式有时被称为“Ajax”,它代表“异步 JavaScript 和 XML”,没有特定要求服务器必须将响应格式化为 XML。例如,facebook 响应异步请求返回 JavaScript 代码片段。

原文链接:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/