输入网址后到底发生了什么?
初学前端,总结一下入门知识,如有错误,不吝赐教。感谢各位阅读。
当用户打开浏览器比如谷歌的Chrome、微软的Microsoft Edge等,输入网址比如www.baidu.com之后,浏览器页面便会展示百度的首页,那么这其中到底发生了什么使得浏览器得以发送用户输入的信息并从网络上接收相应信息并展示给用户呢?
域名解析
当用户在浏览器输入一个网址比如www.baidu.com之后,浏览器就会把域名.baidu.com解析,并查找对应的IP地址,简单来说,有以下流程。
1.浏览器缓存:首先查询浏览器是否有缓存域名对应的IP地址,比如用户近期浏览过相应域名的网址,便会有缓存记录。
2.系统缓存:若浏览器无缓存,便会查询系统(Windows、macOS、Linux等)Hosts文件里是否有相应缓存和对于IP地址。
3.路由器缓存:查询本地路由器的DNS是否有相应缓存信息。
4.ISP DNS缓存:查询互联网服务提供商(如中国电信、美国的AT&T等)是否有对于域名的缓存信息。
5.如果以上几种方法都没有查找到对于IP地址的话,就会向根域名服务器(此例中为.com域名服务器)查找对应的IP,根域名服务器会向下级服务器转送请求并层层下发,直到找到对应IP为止。
服务器处理
当找到对于IP后,与目标服务器发生连接,通过协议向目标主机发送请求。请求就发送给IP所在的服务器,由服务器上安装的处理请求的应用(web server)处理,常见的web server包括apache、nginx、IIS或Lighttpd等。对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理对应请求的程序进行处理(例如CGI脚本,JSP脚本,servlets,ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应。
网站处理
网站处理即后台处理,一般遵循MVC模式,即模型(Model)、视图(Viewer)、控制器(Controller)。
1.视图层:直接面向用户,它提供给用户操作界面,是程序的最外层。
2.数据层:是最底层,也是最重要的一层,称为Model。它负责根据相关指令操作数据或者信息。
3.控制器:根据用户在视图层输入的指令,选取对应数据层的数据,并对其进行相应操作,并将结果填充到视图层发送给用户。
总而言之,控制器接收用户请求并发生给模型,模型调用数据库返回数据给控制器,控制器将模型中反馈的数据填充到视图中。最后返回html字符串给浏览器。
浏览器处理
通过后台处理返回的html字符串结果会被浏览器读取解析,对应就是html页面加载、解析、渲染的工作。
1.加载:浏览器对一个html页面的加载顺序是从上而下的,并在加载过程并行进行解析渲染处理。在这个过程中遇到link标签、image标签、script标签时,浏览器会再次向服务器发送请求获取css文件、图片资源、js文件,并执行js代码,同步进行加载解析。
2.解析、渲染:解析的过程,其实就是生成解析树,即DOM树(文档对象模型)。DOM树是由DOM元素及属性节点组成,加上CSS解析的样式对象和js解析后的动作实现。而渲染,就是将DOM树进行可视化表示。
绘制网页
构建渲染树使页面以正确的顺序(HTML内容控制)绘制出来,遵循一定的渲染规则(CSS语法控制),经过一系列的渲染工作,实现网站页面的绘制,由此最终完成了页面展示。