放假在家是不是无聊的很?身为程序猿,有没有光顾过宇宙无敌最萌最霸气的博客——柏顺哥の博客呢?(blog.dongbaishun.com或者baishun.ml都可以访问,重要的话说三遍:baishun.ml;柏顺美丽;柏顺是我)。欢迎来到柏顺小讲堂——浅谈一个网页的打开过程
概要
从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程。下面我将依靠自己的经验,总结一下整个过程。如有错漏,欢迎指正。感兴趣的可以一起交流~(来,交个朋友吧!)
DNS解析
什么是DNS解析?当用户输入 baishun.ml 并按下回车键的时候,浏览器得到了一个域名。而在实际通信过程中,我们需要的是一个IP地址。因此我们需要先把域名转换成相应的IP地址,这个过程称作DNS解析。浏览器首先搜索浏览器自身缓存的DNS记录 或许很多人不知道,浏览器自身也带有一层DNS缓存。Chrome 缓存1000条DNS解析结果,缓存时间大概在一分钟左右。 (Chrome浏览器通过输入:chrome://net-internals/#dns 打开DNS缓存页面)搜索hosts文件和操作系统缓存 如果浏览器缓存中没有找到需要的记录或记录已经过期,则搜索hosts文件和操作系统缓存。 在Windows操作系统中,可以通过 ipconfig /displaydns 命令查看本机当前的缓存。 通过hosts文件,你可以手动指定一个域名和其对应的IP解析结果,并且该结果一旦被使用,同样会被缓存到操作系统缓存中。 机智的天朝小伙伴们也通过这一机制,成功翻墙感受到外面的世界~向域名解析服务器发送解析请求 如果在hosts文件和操作系统缓存中没有找到需要的记录或记录已经过期,则向域名解析服务器发送解析请求。 其实第一台被访问的域名解析服务器就是我们平时在设置中填写的DNS服务器一项,当操作系统缓存中也没有命中的时候,系统会向DNS服务器正式发出解析请求。这里是真正意义上开始解析一个未知的域名。 常见的免费提供域名解析服务的有:国内最大的域名解析商DNSPod,DNS.com,还有阿里万网、中国数码新网这些域名服务商。开始递归+迭代解析 如果域名解析服务器也没有该域名的记录,则开始递归+迭代解析。 这里我们举个例子,如果我们要解析的是 baishun.ml 首先我们的域名解析服务器会向根域服务器(全球只有13台)发出请求。显然,仅凭13台服务器不可能把全球所有IP都记录下来。所以根域服务器记录的是com域服务器的IP、cn域服务器的IP、org域服务器的IP……。如果我们要查找.com结尾的域名,那么我们可以到com域服务器去进一步解析。所以其实这部分的域名解析过程是一个树形的搜索过程。
根域服务器告诉我们com域服务器的IP。接着我们的域名解析服务器会向com域服务器发出请求。根域服务器并没有blog.dongbaishun.com的IP,但是却有dongbaishun.com域服务器的IP。接着我们的域名解析服务器会向dongbaishun.com域服务器发出请求。… 如此重复,直到获得blog.dongbaishun.com的IP地址。 为什么是递归:问题由一开始的本机要解析变成域名解析服务器要解析blog.dongbaishun.com,这是递归。 为什么是迭代:问题由向根域服务器发出请求变成向com域服务器发出请求再变成向dongbaishun.com域发出请求,这是迭代。 获取域名对应的IP后,一步步向上返回,直到返回给浏览器。
现在已经拥有了目标ip和端口号,这样我们就可以打开socket连接了。发起TCP请求 浏览器会选择一个大于1024的本机端口向目标IP地址的80端口发起TCP连接请求。经过标准的TCP握手流程,建立TCP连接。 关于TCP协议的细节,这里就不再阐述。这里只是简单地用一张图说明一下TCP的握手过程。 请求连接成功建立后,开始向web服务器发送请求,这个请求一般是GET或POST命令(之后会有文章详细介绍这两种请求方式)
发起HTTP请求
其本质是在建立起的TCP连接中,按照HTTP协议标准发送一个索要网页的请求。 应答web服务器收到这个请求,进行处理。从它的文档空间中搜索子目录文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。常用的HTTP头信息有: ① HTTP 1.0 200 OK 这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码"200 OK"表示请求完成。 ② MIME_Version:1.0 它指示MIME类型的版本。 ③ content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html指示传送的数据是HTML文档。 ④ content_length:长度值 它指示HTTP体信息的长度(字节)
负载均衡 什么是负载均衡?当一台服务器无法支持大量的用户访问时,将用户分摊到两个或多个服务器上的方法叫负载均衡。 什么是Nginx?Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 负载均衡的方法很多,Nginx负载均衡、LVS-NAT、LVS-DR等。关于负载均衡的多种方法详情大家可以Google一下(至于怎么翻墙,上文已经提到了更改host)。 浏览器渲染
1) 浏览器根据页面内容,生成DOM Tree。根据CSS内容,生成CSS Rule Tree(规则树)。调用JS执行引擎执行JS代码。 2) 根据DOM Tree和CSS Rule Tree生成Render Tree(呈现树) 3) 根据Render Tree渲染网页。但是在浏览器解析页面内容的时候,会发现页面引用了其他未加载的image、css文件、js文件等静态内容,因此开始了第二部分。
网页静态资源加载
以阿里爸爸的淘宝网首页的logo为例,其url地址为 img.alicdn.com/tps/i2/TB1bNE7LFXXXXaOXFXXwFSA1XXX-292-116.png_145x145.jpg 我们清楚地看到了url中有cdn字样。 什么是CDN?如果我在家访问杭州的淘宝网,跨省的通信必然造成延迟。如果淘宝网能在广东建立一个服务器,静态资源我可以直接从就近的天津服务器获取,必然能提高整个网站的打开速度,这就是CDN。CDN叫内容分发网络,是依靠部署在各地的边缘服务器,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度。 接下来的流程就是浏览器根据url加载该url下的图片内容。本质上是浏览器重新开始第一部分的流程,所以这里不再重复阐述。区别只是负责均衡服务器后端的服务器不再是应用服务器,而是提供静态资源的服务器。
小结 本文只是粗略描述下打开一个网页的过程,具体环节涉及还会到的数据包在网络中的穿行过程、tcp/ip基本模型。如果我能研究明白,在之后会给大家奉上文章~
长按左上角“我的微博”,低调吸粉????????????