一道经典的面试题:你输入网址后到页面显示出来,中间发生了什么?
第一步 浏览器查找该域名的 IP 地址
第二步 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求
第三步 服务器收到请求并进行处理
第四步 服务器返回一个响应
第五步 浏览器对该响应进行解码,渲染显示。
第六步 页面显示完成后,浏览器发送异步请求。
下面对每个环节做进一步分析:
第一步 浏览器查找该域名的 IP 地址
浏览器把域名发送给系统默认DNS服务器。如果该服务器本地有缓存,且缓存未过期,则直接返回结果
否则向上一级DNS服务器查询,直到DNS根服务器。DNS协议最终会返回A记录(IPv4)或者AAAA记录(IPv6)或者Alias(别名)等。如果DNS失败,浏览器会提示域名找不到或者DNS错误。
DNS解析过程如下:
第二步 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求
到此为止,浏览器知道了网址的对应服务器IP地址和端口,然后就通过TCP协议发起网络请求。
通过DNS获取到IP后,目标IP和本机IP分别与子网掩码相与的结果相同,那么它们在一个子网,那么通过ARP协议可以查到目标主机的MAC地址,否则的话,需要通过网关转发,也就是目标MAC是网关的MAC。
请求需要进行编码,生成一个HTTP数据包,依次打上TCP、IP、以太网协议的头部。其中TCP头部主要信息是本机端口和目标端口号等信息,用于标识同一个主机的不同进程,对于HTTP协议,服务器端的默认端口号是80,本机浏览器的话生成一个1024到65535之间的端口号。IP头部主要包含本地IP和目标IP等信息。以太网协议头部主要是双方的MAC地址,目标MAC可以由第一条所诉方法得到。以太网数据包的数据部分,最大长度为1500字节,所以如果IP包太大的话还要拆包,比如IP包5000字节,要分为4包,每一包都包含一个IP头部。
第三步 服务器收到请求并进行处理
终于到达处理HTTP协议的软件了。这类软件叫做Web Server。主流的包括Windows系统上的IIS,开源的Apache,Nginx等
HTTP协议处理
Web Server最重要的角色就是处理HTTP协议,给浏览器规范的应答。处理网络请求和相关连接。因此吞吐量和性能是一个重要的指标。开源软件中Nginx是高性能Web服务器的主流选择,IIS是Windows上的标准软件。
HTTPS协议处理
HTTPS协议相关的证书、加解密、签名等也需要Web服务器处理。但是开源软件中,一般选择调用OpenSSL处理,而IIS是微软自行实现的加密库。
第四步 服务器返回一个响应
静态文件
Web Server能够直接处理的只有静态文件。比如请求http://upload.jianshu.io/admin_banners/web_images/2870/48782c3773b1132ee6c594e56211f64499669099.jpg,那么Web服务器根据网址在服务器磁盘上找到这个路径的文件,返回文件内容。
动态内容接口
但是现在的网站除了css、js和图片等资源外,大量的内容都是动态内容。Web服务器需要一个标准接口与不同语言的代码配合,来动态生成网页内容。这个接口包括CGI、FastCGI、ISAPI等。其中ISAPI属于IIS,开源服务器一般支持CGI和FastCGI等。
应用服务器
请求到达应用服务器之后,就开始网站自己的活了。应用服务器通过CGI、FastCGI、ISAPI等接口与Web服务器通信,获得HTTP请求,返回HTTP应答。主流应用服务器根据语言和平台分:
Windows和.NET:IIS。IIS放在这里是因为ASP.NET深度集成,无法分出。
Java:Jetty,JBoss,Tomcat,WebLogic等
PHP:php-cgi
应用服务器可以作为dll运行在Web服务器中(比如IIS,但是IIS也支持FastCGI),或者作为独立进程,通过IPC与Web服务器通信。
接下来就是程序内部的事情了。省略。
数据库服务器
应用服务器在生成网站内容的过程中一般需要连接数据库存取数据。目前主流数据库包括:
MySQL:开源软件,SUN公司被收购后由Oracle负责
MariaDB:SUN被收购后,因为社区与Oracle的纠纷,从MySQL分支出来的版本。
SQL Server:微软开发的商用数据库。其中Express Edtion免费。
Oracle:Oracle公司开发的商用数据库。
PostgreSQL:开源软件,号称开源中功能最强。
DB2:IBM公司开发的商用数据库。
Redis: NoSQL,支持多种数据结构
MongoDB: NoSQL
第五步 浏览器对该响应进行解码,渲染显示
HTML和CSS解析
最终应用服务器生成了HTML,然后给Web Server。Web Server生成HTTP应答,然后通过复杂的网络线路回到用户电脑中。用户电脑的操作系统把应答给浏览器。浏览器开始渲染。
以下是浏览器渲染的主要过程:
开始从头到尾解析HTML,并生成DOM树。其中如果有外链资源,需要再次通过网络层以此下载。如果是"script"标签,则需要调用JS引擎执行脚本。如果是css,则开始解析CSS,得到一系列样式规则。DOM树生成之后,与样式规则拼接,得到渲染树。
渲染树经过排版引擎得到最终的渲染位置和样式,然后调用操作系统的绘图API绘制页面(部分内容会调用显卡进行硬件加速)。
第六步 页面显示完成后,浏览器发送异步请求。
过程:
页面显示完成后客户端仍与服务器端保持着联系。
它会持续与服务器保持联系来及时更新一些页面信息。在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。