从输入域名到浏览器展现,整个过程发生了什么?
本文语法参考
- Markdown - 官网地址:
http://markdown.cn/#paragraphs-and-line-breaks
本文参考资料 :
- https://www.html5rocks.com/en/tutorials/internals/howbrowserswork
- 网络各大技术博客,论坛 - - -
过程简单概括为
1.输入域名
2.域名解析
3.服务器处理
4.网站处理
5.浏览器处理
6.绘制网页
详细过程
1.输入域名
我们平时输入的域名只是为了方便记忆而诞生的一个URL的"代名词",实际URL比域名的范围要大一些,那么URL是什么呢?他是统一资源的定位符,用于定位互联网上的资源,URL是Uniform Resource Location的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。 URL的格式URL的格式由下列三部分组成: - 第一部分: 协议(或称为服务方式); - 第二部分: 存有该资源的主机IP地址(有时也包括端口号,为了方便记忆常用域名代替IP地址); - 第三部分: 主机资源的具体地址。如目录和文件名等。 第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。 例如:输入 http://www.baidu.com,其中http就是协议,这个协议还可以是、http、https、ftp、file协议等等,baidu.com是域名。那么端口号又去哪了呢?因为http协议默认的端口号是80。也就是说我们输入的实际是http://www.baidu.com:80,但由于默认的关系,输入http://www.baidu.com:80和http://www.baidu.com是一样的。然后我们由百度引擎继续搜索一个问题,这是在域名的后面会以/xxx的形式给出一个网址,这个”/“后面的就是资源路径,就是你需要找的资源的具体路径。
2.域名解析
输入域名后,DNS(域名系统)把域名解析成IP地址,首先,浏览器会查找浏览器缓存,如果没有找到就会从系统缓存Hosts文件中查找是否有该域名和对应IP,系统中hosts没有的话,就继续往上的路由器缓存中找,如果还是没有,就再上一级,在ISP DNS(本地名称服务器缓存)中找。如果本地名称服务器都找不到,则会继续往上查找直到从根域名服务器找到对应IP。 DNS服务器 [图片上传失败...(image-42d516-1539498778562)] DNS解析过程
3.服务器处理
当客户端的 HTTP 请求准备好后,浏览器会在传输层发起一条到达服务器的 TCP 连接,位于传输层的TCP协议为传输报文提供可靠的字节流服务。它为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地还原报文信息。TCP协议通过“三次握手”等方法保证传输的安全可靠。“三次握手”的过程是,发送端先发送一个带有SYN(synchronize)标志的数据包给接收端,在一定的延迟时间内等待接收的回复。接收端收到数据包后,传回一个带有SYN/ACK标志的数据包以示传达确认信息。接收方收到后再发送一个带有ACK标志的数据包给接收端以示握手成功。在这个过程中,如果发送端在规定延迟时间内没有收到回复则默认接收方没有收到请求,而再次发送,直到收到回复为止。 (引用简书 卐鑫卍 https://www.jianshu.com/p/d616d887953a)
4.网站处理
服务接收到客户端发送的HTTP请求后,服务器上的的 http 监听进程会得到这个请求,然后一般情况下会启动一个新的子进程去处理这个请求,同时父进程继续监听。http 服务器首先会查看重写规则,然后如果请求的文件是真实存在,例如一些图片,或 html、css、js 等静态文件,则会直接把这个文件返回,如果是一个动态的请求,那么会根据 url 重写模块的规则,把这个请求重写到一个 rest 风格的 url 上,然后根据动态语言的脚本,来决定调用什么类型的动态文件脚本解释器来处理这个请求。 我们以 php 语言为例来说的话,请求到达一个 php 的 mvc 框架之后,框架首先应该会初始化一些环境的参数,例如远端 ip,请求参数等等,然后根据请求的 url 送到一个路由器类里面去匹配路由,路由由上到下逐条匹配,一旦遇到 url 能够匹配的上,而且请求的方法也能够命中的话,那么请求就会由这个路由所定义的处理方法去处理。 请求进入处理函数之后,如果客户端所请求需要浏览的内容是一个动态的内容,那么处理函数会相应的从数据源里面取出数据,这个地方一般会有一个缓存,例如 memcached 来减小 db 的压力,如果引入了 orm 框架的话,那么处理函数直接向 orm 框架索要数据就可以了,由 orm 框架来决定是使用内存里面的缓存还是从 db 去取数据,一般缓存都会有一个过期的时间,而 orm 框架也会在取到数据回来之后,把数据存一份在内存缓存中的。 orm 框架负责把面向对象的请求翻译成标准的 sql 语句,然后送到后端的 db 去执行,db 这里以 mysql 为例的话,那么一条 sql 进来之后,db 本身也是有缓存的,不过 db 的缓存一般是用 sql 语言 hash 来存取的,也就是说,想要缓存能够命中,除了查询的字段和方法要一样以外,查询的参数也要完全一模一样才能够使用 db 本身的查询缓存,sql 经过查询缓存器,然后就会到达查询分析器,在这里,db 会根据被搜索的数据表的索引建立情况,和 sql 语言本身的特点,来决定使用哪一个字段的索引,值得一提的是,即使一个数据表同时在多个字段建立了索引,但是对于一条 sql 语句来说,还是只能使用一个索引,所以这里就需要分析使用哪个索引效率最高了,一般来说,sql 优化在这个点上也是很重要的一个方面。 sql 由 db 返回结果集后,再由 orm 框架把结果转换成模型对象,然后由 orm 框架进行一些逻辑处理,把准备好的数据,送到视图层的渲染引擎去渲染,渲染引擎负责模板的管理,字段的友好显示,也包括负责一些多国语言之类的任务。对于一条请求在 mvc 中的生命周期,可以参考这里,临摹了一个 PHP MVC 框架,在视图层把页面准备好后,再从动态脚本解释器送回到 http 服务器,由 http 服务器把这些正文加上一个响应头,封装成一个标准的 http 响应包,再通过 tcp ip 协议,送回到客户机浏览器。 (引用:卐鑫卍 https://www.jianshu.com/p/d616d887953a) 简单来说这两步就是服务器就收指令后,通过后台处理后返回信息(题主小白,只能这么理了,后期来完善)
5.浏览器处理
Html字符串被浏览器接受后被一句句读取解析,解析到link标签后重新发送请求获取CSS,解析到SCRIPT标签后发送请求获取JS,并执行代码,解析到IMG标签后发送请求获得图片资源。 ###6.绘制网页### 浏览器根据HTML,CSS计算得到的渲染树,绘制到屏幕上。 学到后面再来补充,看完一些资料才发现这个坑真的太大了。。。