从浏览器到服务器的整体过程感觉是一个前端开发的最基础知识,越是基础越是容易让人忽略,这里也做个思路笔记。
在输入地址栏之前,浏览器会对输入的内容进行检查,如果是一个符合格式的正确 url 就会执行 DNS解析,如果不是,比如输入了一些字符串,那么就会执行搜索功能。如图:
首先,在访问一个网站的时候并不是只靠一个网址就可以找到对应的服务器,而是需要一个 ip地址。网址只是为了方便大家记忆,而并不是一个准确的地址。
比如,我需要打电话给某个人,我知道这个人的名字是没有用的,我必须通过电话本查找到他的电话号码,我才能打给他。而这个对应过来就是
而DNS 的解析又不是像查电话本那样从头查到尾那么简单,而是一层层逐级向上的查找,下面是我画的一张 DNS 解析流程图。
首先,在浏览器输入 www.qq.com 之后 ,输入的 url 符合地址格式执行 DNS解析。而 DNS 解析的解析步骤为:
这里也说明一下,一个 url 是怎么分根域名,和顶级域名的。
例如: 这个域名 : www.ac.qq.com
他的域名分布是这样的 : www( 主机 ). ac( 三级域名 ). qq( 二级域名 ) .( 根域名 ) .com( 顶级域名 )
DNS 缓存和 DNS 重定向是 DNS 优化的重要手段,其核心就是减少请求次数。
从上面的流程得知,DNS的解析是层层向上,查找到再返回 ip 地址。那么,在这个过程中也可以将找到的 ip 地址保留下来,下次就可以直接地读取。
DNS 缓存就是把查找到的 IP 地址,临时保存下来,而保存这个 ip 的也有很多的环节。比如,浏览器缓存,客户端系统本身的缓存,路由器缓存,根域名服务器缓存 ,ISP 服务器缓存。
比如,浏览器缓存,二次请求的时候,就不需要层层解析了,浏览器已经记下了这个服务器的 ip 地址,直接访问即可。
DNS 重定向就是把请求的距离缩短,可以根据距离用户最近或者是负载量较小的服务器给出相应的 ip 地址,这个也叫 DNS负载均衡。
一直所用到的 CDN 资源,利用的也是这个原理,DNS 服务器会返回一个用户最近的 ip 地址,CDN节点的服务器负责响应提供数据。
在经过了 DNS 的解析之后,确认了服务器的位置之后,就开始发起请求,而这个过程我们称为 “三次握手”。
有一次脱口秀上有个叫庞博的工程师,他用最简单的语言解释了什么是三次握手,我到现在还记得,是这样说的,有个人在敲门:
这个就是三次握手。
下面还是简述一下什么是三次握手的过程,如图:
之所以需要三次而不是两次,是因为要防止已经失效的请求报文又传递给了服务器。就比如,客户端发了一个请求 A 给服务器,请求 A 因为延迟等关系还没有到达服务器,
这个时候,客户端又发送了一个 请求 B ,这个时候服务器先接收到了。
收到之后,请求 A 也到了,而服务器会误以为 是一个新的请求,那么就和 A连接上了,并且向客户端发送确认,但此时客户端的请求已经不是之前的那一次,就会产生错误。
在进行了三次握手的确认之后,就开始发起 请求报文。HTTP 的请求就是构建请求报文同时通过 tcp
协议发送到指定的服务器端口。
HTTP协议是80/8080,HTTPS的端口是443
请求的报文是由请求行,请求头,请求空行和请求体组成的。
响应报文由响应行、响应头部、响应主体三个部分组成。
相应的状态码 大致的参数解释就是:
前端的同学只要看到 5xx, 那么就是时候去找你的后台好基友了。
浏览器是一遍解析一遍渲染的一个过程,浏览器在拿到 html 文本之后 就会进行解析,之后再加载其他的 css 或者 js 等文件。
请求的时候根据浏览器的不同,并发的请求数量也不一样,比如像谷歌浏览器的并发请求是6次。加载回来的资源也不一定是按顺序回来,有一些体积比较小的文件可能就会优先回来。
这里有个小点,就是问什么很一般会把js 文件的加载放在底部,是因为要确保节点生成之后才进行一些节点的操作,否则在节点还没有生成的时候执行绑定操作是会失效的。
页面渲染的过程,大致分为 5个过程:
整理如图:
这里的 layout 为什么是双线箭头,是因为如果布局节点发生变化就会触发回流计算,之后再执行 paint 。
当数据传送完毕,这个时候就需要断开 tcp 协议,也称四次挥手,过程是:
如下图:
HTTP 协议如果深挖其实还有很多东西,一般也不需要全部吃得透透的,但是大致的流程还是要了解。至少要说得清楚是怎么一回事。
image 的草莓千层雪太甜了。。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。