当你在浏览器输入一个网址,好比http://www.taobao.com,按回车以后发生了什么?请从技术的角度描述,如浏览器、网络(UDP、TCP、HTTP等),以及服务器等各类参数与对象上由此引起的一系列活动,请尽量涉及到全部的关键技术点。 php
1、浏览器查找域名的IP地址 css
一、浏览器缓存:浏览器会缓存DNS记录一段时间。每一个浏览器存储各自固定的一个时间 html
二、系统缓存:若是再浏览器缓存里没有找到须要的记录,浏览器会作一个系统调用(windows里是gethostbyname),这样即可得到系统缓存记录。 web
三、ISP DNS缓存:在这通常能找到相应缓存记录 ajax
四、递归搜索:你的ISP的DNS服务器从根域名开始进行递归搜索,从.com顶级域名服务器到taobao的域名服务器。通常DNS服务器的缓存中会有.com域名服务器中的域名 算法
DNS有一点使人担心,这就是像wikipedia.org 或者 facebook.com这样的整个域名看上去只是对应一个单独的IP地址。还好,有几种方法能够消除这个瓶颈: 数据库
大多数DNS服务器使用Anycast来得到高效低延迟的DNS查找。 apache
2、浏览器给web服务器发送一个HTTP请求
由于像taobao主页这样的动态页面,打开后在浏览器缓存中很快甚至立刻就会过时,毫无疑问他们不能从中读取。 windows
因此,浏览器会把如下请求发送到taobao所在的服务器: 浏览器
GET http://taobao.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[...]GET这个请求定义了要读取的URL,浏览器自定义(User-Agent头)和它但愿接受什么类型的相应(Accept and Accept-Encoding头)Connection头要求服务器为了后边的请求不要关闭TCP链接。
请求中也包含浏览器存储的该域名的cookies,在不一样页面请求当中,cookie是与跟踪一个网站状态相匹配的键值。这样cookies会存储登陆用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。
3、facebook服务的永久重定向响应
图中所示为taobao服务器发回给浏览器的响应:
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/ 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服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”。
为何服务器必定要重定向而不是直接发回用户想看的网页内容?这个问题有好多有意思的答案。
其中一个缘由跟搜索引擎排名有 关。你看,若是一个页面有两个地址,就像http://www.igoro.com/ 和http://igoro.com/,搜索引擎会认为它们是两个网站,结果形成每个的搜索连接都减小从而下降排名。而搜索引擎知道301永久重定向是 什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。
还有一个是用不一样的地址会形成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几回。
4、浏览器跟踪重定向地址如今浏览器知道了http://www.facebook.com/ 才是要访问的正确地址,因此他会发送另外一个获取请求:
GET 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.com5、服务器“处理”请求
服务器接收到获取请求,而后处理并返回一个相应。
一、web服务器软件
web服务器软件(像IIS和apache)接收HTTP请求,而后肯定执行什么请求处理来处理它,请求处理就是一个可以读懂请求而且能生成HTML来进行相应的程序(像ASP.NET,PHP,RUBY。。。)
举一个简单的例子,需求处理能够以映射网站地址结构的文件层次存储。像http://example.com/folder1/page1.aspx这个地 址会映射/httpdocs/folder1/page1.aspx这个文件。web服务器软件能够设置成为地址人工的对应请求处理,这样 page1.aspx的发布地址就能够是http://example.com/folder1/page1。
二、请求处理
请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上,而后需求处理会生成一个html相应。
全部动态网站都面临一个有意思的难点-如何存储数据,小网站通常都会有一个SQL数据库来存储数据,存储大量数据和访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案有:sharding(基于主键值将数据表分散到多个数据库中),复制,利用弱语义一致性简化数据库。
委托给批处理是一个廉价保持数据更新的技术。
6、服务器发回一个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 2b3Tn@[...]整个响应大小为35kB,其中大部分在整理后以blob类型传输
内容编码头告诉浏览器整个响应体用gzip算法进行压缩。解压blob块后,你能够看到以下指望的HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" id="facebook" class=" no_js"> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-language" content="en" /> ...
关于压缩,头信息说明了是否缓存这个页面,若是缓存的话如何去作,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等等。
请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其余因素。
7、浏览器开始显示HTML浏览器没有完整接受所有HTML文档时,它就已经开始显示整个页面了:
8、浏览器发送获取嵌入在HTML中的对象
在浏览器显示HTML时,它会注意到须要获取其余地址内容的标签。这时,浏览器会发送一个获取请求来从新得到这些文件。
下面是几个咱们访问facebook.com时须要重获取的几个URL:
这些地址都要就离一个和HTML读取相似的过程。因此浏览器会在DNS中查找这些域名,发送请求,重定向等等。。
但不像动态页面那样,静态文件会容许浏览器对其进行缓存。有的文件可能会不须要与服务器通讯,耳聪缓存中直接读取。服务器的响应中包含了静态文件保存的期限信息,因此浏览器知道要把它们缓存多长时间。还有还有,每一个响应均可能包含像版本号同样工做的ETag头(被请求变量的实体值),若是浏览器观察到文件的版本 ETag信息已经存在,就立刻中止这个文件的传输。
试着猜猜看“ fbcdn.net ”在地址中表明什么?聪明的答案是"Facebook内容分发网络"。Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件。因此,这些文件会在全球不少CDN的数据中心中留下备份。静态内容每每表明站点的带宽大小,也能经过CDN轻松的复制。一般网站会使用第三方的CDN。例如,Facebook的静态文件由最大的CDN提供商Akamai来托管。
举例来说,当你试着ping static.ak.fbcdn.net的时候,可能会从某个akamai.net服务器上得到响应。有意思的是,当你一样再ping一次的时候,响应的服务器可能就不同,这说明幕后的负载平衡开始起做用了。
9、浏览器发送异步请求(AJAX)
在web 2.0伟大精神的指引下,页面显示完成后客户端仍与服务器端保持着联系。
以Facebook的聊天功能为例,它会持续与服务器保持联系来及时更新好友状态。为了更新这些好友状态,在浏览器中执行的JavaScript代码会给服务器发送异步请求。这个异步请求地发送给特定的地址,它是按照程式构造的获取或发送请求。仍是在Facebook这个例子中,客户端发送给http://www.facebook.com/ajax/chat/buddy_list.php一个发布请求来获取你好友里哪一个 在线的状态信息。
AJAX——“异步JavaScript和XML”虽然服务器为何用XML格式来进行相应也没有个一清二楚的缘由。对于异步请求,Facebook会返回一些JavaScript的代码片断。
fiddler这个工具可以让你看到浏览器发送的异步请求,事实上,你不只能够被动的做为这些请求的看客,还能主动出击修改和从新发送它们。AJAX请求这么容易被蒙,让那些计分的在线游戏开发者们郁闷。
Facebook聊天功能提供了关于AJAX的一个有意思的案例:把数据从服务器端推送到客户端。由于HTTP是一个请求-响应协议,因此聊天服务器不能把新消息发给客户。取而代之的是客户端不得不隔几秒就轮询下服务器端看本身有没有新消息。