小cc:火云大神,我每天用着浏览器,偷着别人的代码,看着电影和新闻,读着段子,突然很好奇,当我
输入一个个网址的时候,浏览器背后到底做了什么?
光头火云大神:小cc,快点端着小板凳,看着我的小黑板,听我娓娓道来。
小cc扭扭屁股,抹抹鼻涕,眯着崇拜的小眼睛,端起小板凳,坐在火云大神的面前,准备大神传经布道。
光头火云大神:敲着小黑板,平时我们看到的浏览器长这个样:有用来输入URL的地址栏,前进和后退按钮,书签。。。。。。
小cc:很不耐烦的说,这个我知道,我天天都在用,我知道它长什么样。
光头火云大神:好了,那就看看这幅图吧,
这个是大部分浏览器的一个内部架构图,表示了浏览器内部大体有哪些部分,各个部分之间的关系,浏览器接受用户的输入,然后交给浏览器引擎进行分发处理,最终将所有请求的资源进行渲染呈现给用户。
小cc:原来浏览器内部还有这么复杂的机制呢?那一般我们说的浏览器内核是就是Browser Engine么?
光头火云大神:那当然了,浏览器其实要做帮我们做很多事情的,浏览器内核一般指的是渲染引擎和js引擎。但是由于现在js引擎慢慢的开始越来越独立了,所以浏览器内核主要指的是渲染引擎。来看看现在市面上主流浏览器都用的是什么内核,值得一提的是谷歌的chrome之前一直用的是apple的webkit,后来怕受制于人,于是就在webkit的基础上和Opera一起开发出了Blink内核,特点就是渲染速度快,兼容性好。
小cc: 那么渲染引擎主要做了什么啊?
光头火云大神:渲染引擎主要就是将从服务器请求的资源,进行解释加工,翻译成内核中需要的DOM树(Document Object Model Tree,DOM Tree),然后加工成Render树,最终将Render树映射成可视的图形,呈现成为用户看的实际页面,整个过程可以看做一个流水线的过程。
当然,渲染内核执行的详细过程大致如下:
当然,这里面还有很多细节的东西,解析算法,DOM树和渲染树之间的关系,样式和布局处理,绘制顺序等等。这次就不详细说。现在浏览器处理资源的大概过程已经大致了解了,但是浏览器处理的资源怎么得到呢?
小cc: 当然是网络请求啦,用的是HTTP协议!
光头火云大神:对的,浏览器里面我们一般输入的是一个URL(Uniform Resoure Locator) 统一资源定位
,这个URL包含了好几个部分,举例http://helloworld.com/index.html, http:// 这部分是协议,http://helloworld.com是域名,/根目录,index.html就是资源文件了,浏览器就是使用url来定位全球的网上资源的,那浏览器拿到这个url就要去通过网络来找到这个资源了,首先浏览器要知道这个资源在那一台服务器,那就需要这台服务器的ip地址,首先,浏览器会缓存浏览过的网址的ip一段时间,所以浏览器需要先去缓存看看有没有这ip,没有的话就会去找本机的host文件要,如果没有的话,那就需要费点劲去向DNS(Domain Name System,域名系统)请求啦,它帮我们维护了一个域名和ip地址相互映射的分布式数据库。DNS协议是构建在UDP协议之上,那么抓包的话,我们能看到会有一个UDP包发出。这样就可以获得ip了,
什么?没有获取到,是不是域名不存在啊,袄,还有可能你访问了不该访问的网址了,有一个伟大的“墙”,Great Wall of China会采取一些技术手段,比如DNS劫持,去帮我们解析到一个虚拟的ip地址,那你就访问不到你想要的资源了哈。
终于拿到IP了,浏览器发现你使用的是http协议啊,来来来,复习一下,看看OSI模型,看看我们的http协议是在应用层,并且是构建在的TCP协议之上的啊。
http需要发送一个TCP包来发送自己的请求协议,那自然少不了tcp的三次握手啦,。。Hello 你好,服务端,我是客户端小弟;服务端点点头说小弟你好。小弟很高兴地说耶耶耶,从此可以源源不断的给服务器大哥送东西啦。送什么啊,当然送甜甜的HTTP甜甜包啊。
就是这么一坨精心制作的蛋糕,里面有好多的东西,开开心心的送到了服务端,看到小弟送来这么多东西,服务端想到哪有免费的午餐,很快发现了小弟想要他想要的东西,web服务端果然在家里小弟告诉他的位置(url)找到小弟弟想要的东西,就噼里啪啦的把东西送过去,小弟拿到后愉快的挥挥小手手,
小弟弟: 大哥,我走了啊。FIN
大哥:好的,你走吧。ACK
大哥:心里惦记着好吃的蛋糕,就赶紧又补了一句,小弟下次再来啊。FIN
小弟: 好的,好的。
这样,小弟弟带着资源经过下面的电缆光纤来到浏览器的面前啦。
图片来自https://www.submarinecablemap.com/#/,显示了全球的海底电缆分布。
终于拿到了资源,可以解析了。小cc,这就是简单个过程,我这里就简单的说下,后面再给你一个一个点的剖析。
小cc:Zzzzzzzz 若有错误请多多指正。
小cc: 关注公众号回复python,即可获得一套完美的python视频教程。发现更多惊喜。
参考:
https://www.cnblogs.com/xiaohuochai/p/9174471.html
http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/
http://www.cnblogs.com/geaozhang/