每天一个面经系列--面经003:浏览器输入一个网址后的全过程
当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?请从技术的角度描述,如浏览器、网络(UDP、TCP、HTTP等),以及服务器等各种参与对象上由此引发的一系列活动,请尽可能的涉及到所有的关键技术点。
总体来说分为以下几个过程:
- DNS解析
- 客户端与服务器建立TCP连接(三次握手)
- 浏览器发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
这里总结一个全面的精简版:
一 DNS解析
- 浏览器查找浏览器缓存,如果有域名的 IP 地址则返回,如果没有继续查找;
- 系统查找系统缓存,如果有域名的 IP 地址则返回,如果没有继续查找;
- 路由器查找路由器缓存,如果有域名的 IP 地址则返回,如果没有继续查找;
- ISP服务器查找缓存,如果有域名的 IP 地址则返回,如果没有继续查找;
- 递归查询:
- 本地DNS服务器将目标域名转发到互联网上的根域名服务器
- 根域将所要查询域名中的顶级域(比如www.taobao.com的顶级域就是com)的服务器IP地址返回给本地DNS。
- 本地DNS根据返回的顶级域IP地址,向顶级域服务器发送目标域名,顶级域服务器再将域名中的二级域(比如www.taobao.com的二级域为taobao.com)的服务器IP地址返回给本地DNS。
- 本地DNS根据返回的二级域IP地址,向二级域服务器发送目标域名,重复这样的过程,直到本地DNS获得完整的服务器IP地址,并返回给浏览器。
二 客户端与服务器建立TCP连接(三次握手)
- 浏览器所在的客户端向服务器发出连接请求报文
- 服务器接收报文后,同意建立连接,向客户端发出确认报文
- 客户端接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文
- 此时客户端与服务器之间的 TCP 连接建立完成,开始通信
三 浏览器发送HTTP请求
- 构建HTTP请求报文并通过TCP协议中发送到服务器指定端口(HTTP协议80/8080, HTTPS协议443)
四 服务器处理请求并返回HTTP报文
- 对TCP连接进行处理,对HTTP请求(request)进行解析,结合配置文件,把不同请求委托给服务器上处理对应请求的程序进行处理
- 生成HTTP报文后,将响应发送给客户端浏览器。
五 浏览器解析渲染页面(边解析边渲染的过程)
- 浏览器解析HTML文件构建DOM树
- 解析CSS文件构建渲染树
- 浏览器开始布局渲染树并将其绘制到屏幕上
一些补充知识:
DNS缓存
DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。
DNS:域名和IP地址相互映射的一个分布式数据库。
域名结构为:三级域名.二级域名.一级域名
HTTP请求报文是由三部分组成: 请求行, 请求报头和请求正文。
HTTPS在传输数据之前需要客户端与服务器进行一个握手(TLS/SSL握手),在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL使用了非对称加密,对称加密以及hash等。具体过程请参考经典的阮一峰先生的博客TLS/SSL握手过程。
HTTPS相比于HTTP,虽然提供了安全保证,但是势必会带来一些时间上的损耗,如握手和加密等过程,是否使用HTTPS需要根据具体情况在安全和性能方面做出权衡。
MVC的处理过程是这样的:每个用户输入的请求,首先被控制器(C)接收,控制器决定用哪个模型(M)来处理,然后模型用业务逻辑来处理用户的请求,再然后控制器决定用哪个视图模型(V)来接收模型处理后的数据,最后由该视图模型对应的视图格式化模型来返回HTML字符串给浏览器。
HTTP响应报文也是由三部分组成: 状态码, 响应报头和响应报文
状态码
状态码是由3位数组成,第一个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息–表示请求已接收,继续处理。
- 2xx:成功–表示请求已被成功接收、理解、接受。
- 3xx:重定向–要完成请求必须进行更进一步的操作。
- 4xx:客户端错误–请求有语法错误或请求无法实现。
- 5xx:服务器端错误–服务器未能实现合法的请求。
响应报头
常见的响应报头字段有: Server, Connection...。
响应报文
服务器返回给浏览器的文本信息,通常HTML, CSS, JS, 图片等文件就放在这一部分。
HTTP报文是明文,如果中间被截取的话会存在一些信息泄露的风险。那么在进入TCP报文之前对HTTP做一次加密就可以解决这个问题了。HTTPS协议的本质就是HTTP + SSL(or TLS)。在HTTP报文进入TCP报文之前,先使用SSL对HTTP报文进行加密。从网络的层级结构看它位于HTTP协议与TCP协议之间。
具体可以参考以下文章:
https://segmentfault.com/a/1190000006879700
https://segmentfault.com/a/1190000009353010
https://www.nowcoder.com/questionTerminal/4150a74bd14d4bd3a0d3f133376c97c7