18, 从输入 url 到网页最终展现到用户面前, 中间发生了什么?
1, 输入地址
2, 浏览器查找域名的 ip 地址
(包括 dns 查找: 浏览器缓存 ->系统缓存 ->路由器缓存)
dns 查找过程如下:
1, 浏览器缓存 -- 浏览器会缓存 dns 记录一段时间, 但是操作系统不会告诉浏览器存储 dns 的记录事件, 所以不同浏览器会自固定一个时间(2~30 分钟);
2, 系统缓存 -- 如果在浏览器缓存里没有找到需要的记录, 浏览器会做一个系统调用, 以便获得系统缓存中的记录;
3, 路由器缓存 -- 接着, 请求发向路由器, 它一般会有自己的 dns 缓存;
4,ISP(网络服务提供商)DNS 缓存 -- 接下来检查 ISP 缓存 DNS 的服务器. 这里一般能找到相应的缓存记录.
5, 递归搜索 --ISP 的 DNS 服务器从根域名服务器开始进行递归搜索, 从 com 顶级域名服务器到 example 的域名服务器.
3, 浏览器给 web 服务器发送一个 HTTP 请求
请求中可能包含存储该域名的 cookies, 也会存储登录用户名和密码以及一些用户设置等.
4,HTTP(超文本传输协议)请求的建立
建立 TCP(传输控制协议)链接: 在 HTTP 工作开始之前, web 浏览器首先要通过网络与 web 服务器建立连接, 该连接通过 TCP 来完成的, 该协议与 IP 协议共同构建 Internet, 即著名的 TCP/IP 协议族, 因此 Internet 又被称作是 TCP/IP 网络. HTTP 是比 TCP 更高层的应用层协议. 根据规则只有低层协议建立之后, 才能进行更高层协议的连接. 因此, 首先要建立 TCP 链接, 一般 TCP 链接的端口号是 80. 在 TCP/IP 协议中, TCP 协议提供可靠的连接服务, 采用三次握手建立一个连接.
第一次握手: 主机 A 发送位码 syn=1, 随机产生 seq(sequence 序列号) number=1234567 的数据包到服务器, 主机 B 由 syn=1 知道, A 要求建立联机;
第二次握手: 主机 B 收到请求后确认联机信息, 向 A 发送 ack(Acknowledgement 确认信息) number=(主机 A 的 seq+1),syn=1,ack=1. 随机产生 seq=7654321 的包;
第三次握手: 主机 A 收到后检查 ack number 是否正确, 即第一次发送的 seq number+1, 以及位码 syn 是否为 1, 若正确, 主机 A 会再发送 ack number=(主机 B 的 seq+1),ack=1; 主机 B 收到后确认 seq 值与 ack=1 则链接建立成功.
完成三次握手, 主机 A 与主机 B 开始传送数据.
一旦建立了 TCP 连接, web 浏览器就会向 web 服务器发送请求命令.
浏览器发送其求命令之后, 还要以头信息的形式向 web 服务器发送一些别的信息, 之后浏览器发送一空白行来通知服务器, 它已经结束了该头信息的发送.
5, 服务器的永久重定向响应
服务器给浏览器响应一个 301 永久重定向响应, 这样浏览器就会访问 "http://www.chenxixunhan.com/" 而非 "http://chenxixunhan.com/" http://www.chenxixunhan.com/%E2%80%9D%E8%80%8C%E9%9D%9E%22http://chenxixunhan.com/%22 ;.
为什么要重定向而不直接发回用户想看到的网页内容?
其中一个原因跟搜索引擎排名相关.
如果一个页面有两个地址, 就像 "http://www.chenxixunhan.com/" 和 "http://chenxixunhan.com/", 搜索引擎会认为他们是两个网站, 结果造成每一个的搜索链接都减少从而降低排名. 而搜索引擎知道 301 永久重定向, 会把访问带 www 的和不带 www 的地址归到同一个网站排名下 http://www.chenxixunhan.com/%E2%80%9D%E5%92%8C%22http://chenxixunhan.com/%22%EF%BC%8C%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E4%BC%9A%E8%AE%A4%E4%B8%BA%E4%BB%96%E4%BB%AC%E6%98%AF%E4%B8%A4%E4%B8%AA%E7%BD%91%E7%AB%99%EF%BC%8C%E7%BB%93%E6%9E%9C%E9%80%A0%E6%88%90%E6%AF%8F%E4%B8%80%E4%B8%AA%E7%9A%84%E6%90%9C%E7%B4%A2%E9%93%BE%E6%8E%A5%E9%83%BD%E5%87%8F%E5%B0%91%E4%BB%8E%E8%80%8C%E9%99%8D%E4%BD%8E%E6%8E%92%E5%90%8D%E3%80%82%E8%80%8C%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E7%9F%A5%E9%81%93301%E6%B0%B8%E4%B9%85%E9%87%8D%E5%AE%9A%E5%90%91%EF%BC%8C%E4%BC%9A%E6%8A%8A%E8%AE%BF%E9%97%AE%E5%B8%A6www%E7%9A%84%E5%92%8C%E4%B8%8D%E5%B8%A6www%E7%9A%84%E5%9C%B0%E5%9D%80%E5%BD%92%E5%88%B0%E5%90%8C%E4%B8%80%E4%B8%AA%E7%BD%91%E7%AB%99%E6%8E%92%E5%90%8D%E4%B8%8B .
还有一个原因是用不同的地址会造成缓存友好性变差. 当一个页面有好几个名字时, 它可能会在缓存里出现好几次.
- HTTP/1.1 301 Moved Permanently
- Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
- pre-check=0
- Expires: Sat, 01 Jan 2000 00:00:00 GMT
- Location: HTTP://www.facebook.com/ http://www.facebook.com/
- P3P: CP="DSP LAW"
- Pragma: no-cache
- Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
- path=/; domain=.facebook.com; httponly
- Content-Type: text/html; charset=utf-8
- X-Cnection: close
- Date: Fri, 12 Feb 2010 05:09:51 GMT
- Content-Length: 0
6, 浏览器跟踪重定向地址
现在, 浏览器知道了 "http://www.chenxixunhan.com/" 才是要访问的正确地址, 所以它会发送另一个获取请求也就是 http://www.chenxixunhan.com/%E2%80%9D%E6%89%8D%E6%98%AF%E8%A6%81%E8%AE%BF%E9%97%AE%E7%9A%84%E6%AD%A3%E7%A1%AE%E5%9C%B0%E5%9D%80%EF%BC%8C%E6%89%80%E4%BB%A5%E5%AE%83%E4%BC%9A%E5%8F%91%E9%80%81%E5%8F%A6%E4%B8%80%E4%B8%AA%E8%8E%B7%E5%8F%96%E8%AF%B7%E6%B1%82%E4%B9%9F%E5%B0%B1%E6%98%AF
- GET HTTP://www.facebook.com/ http://www.facebook.com/ HTTP/1.1
- Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]Accept-Language: en-US
- User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]Accept-Encoding: gzip, deflate
- Connection: Keep-Alive
- Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]Host: www.facebook.com
头信息以之前请求中的意义相同;
7, 服务器 "处理" 请求
服务器接收到获取请求, 然后处理返回一个响应.
8, 服务器发回一个 HTML 响应
HTTP/1.1 200 OKCache-Control: private, no-store, no-cache, must-revalidate, post-check=0,pre-check=0Expires: Sat, 01 Jan 2000 00:00:00 GMTP3P: CP="DSP LAW"Pragma: no-cacheContent-Encoding: gzipContent-Type: text/html; charset=utf-8X-Cnection: closeTransfer-Encoding: chunkedDate: Fri, 12 Feb 2010 09:05:55 GMT 2b3Tn@[...]整个响应大小为 35kB, 其中大部分在整理后以 blob(二进制)类型传输.
内容编码头告诉浏览器整个响应体用 gzip 算法进行压缩. 解压 blob 块后, 你可以看到 html 文档.
关于压缩, 头信息说明了是否缓存这个页面, 如果缓存的话如何去做, 有什么 cookies 要去设置 (前面响应没有这点) 和隐私信息等等.
注意: 报头中把 Content-type 设置为 "text/html". 报头让浏览器将该响应内容以 HTML 形式呈现, 而不是以文件格式下载它. 浏览器会根据报头信息决定如何解释该响应, 不过同时也会考虑像 URL 扩展内容等其他因素.
9, 浏览器开始显示 HTML
在浏览器没有完整接受全部 HTML 文档时, 它就开始显示这个页面了.
10, 浏览器发送获取嵌入在 HTML 中的对象
在浏览器显示 HTML 时, 它会注意到需要获取其它地址内容的标签. 这时, 浏览器会发送一个获取请求来重新获得这些文件.
下面几个是一个叫雷锋的作者访问 facebook.com 时需要重获取的几个 URL
来源: http://www.qdfuns.com/article/38026/3974934ac3e59b9ce09b7bdf45628a9f.html