文章目录
一、URL的输入(域名找不到,需要转化)
URL: scheme://host.domain:port/path/filename
// 协议名 主机名 域名 端口号 文档路径
-
scheme - 定义因特网协议名。常见的协议有 http、https、ftp、file,其中最常见的类型是 http,而 https则是进行加密的网络传输。
-
host - 定义域主机名(http 的默认主机是 www)
-
domain - 定义因特网域名,比如 w3school.com.cn
-
port - 定义主机上的端口号(http 的默认端口号是 80)
-
path/filename - 定义服务器上的文档的路径(如果省略,则文档必须位于网站的根目录中)。
域名包括以上几个部分,输入URL后,浏览器不能直接通过域名找到对应的服务器,而是要通过 IP 地址找到对应的服务器,下一步要进行域名解析
二、URL域名解析(获取真的IP地址,可以访问了)
简称DNS: domain name resolution
-
浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。
-
操作系统缓存:如果浏览器缓存中找不到需要的 DNS 记录,那就去操作系统中找。
-
路由缓存:路由器也有 DNS 缓存。
-
DNS 服务器:ISP 是互联网服务提供商(Internet Service Provider)的简称,ISP 有专门的
DNS 服务器应对 DNS 查询请求。 -
根服务器:ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归DNS查询(DNS 服务器先问根域名服务器.com域名服务器的 IP 地址,然后再问.baidu 域名服务器,依次类推)
浏览器通过DNS获取到web服务器真的IP地址后,便向服务器发起TCP连接请求,通过TCP三次握手建立好连接后,浏览器便可以将HTTP请求数据通过发送给服务器了
三、TCP 三次握手(为发送请求做准备)
-
客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口(第一次握手,由浏览器发起,告诉服务器我要发送请求了)
-
服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息**(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧)**
-
客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧)
三次握手的作用:防止已失效的连接请求报文段又突然抽风儿传送到了服务端,因而产生错误”。
四、开始发送 HTTP 请求报文
- 请求行(request line):标明请求方法(Get,Post)、URL、协议版本(HTTP/1.1)
- GET和POST之间的区别:
参数位置:GET方法的数据参数是暴露在起始行的URL中的,而POST方法的数据参数是在报文主体中的。分
安全性:GET方法相对来说没有POST安全,因为它的数据参数可以直接从URL中获取,但是GET的效率更高。
大小限制:GET方法的数据参数大小有一定的限制(1024)(原因也是因为它的数据参数是放在URL中的),而POST对数据大小是没有限制的。
- GET和POST之间的区别:
- 请求头(header):请求头包含请求的附加信息,每一对关键字和值用英文冒号“:”分隔。
- 请求体(request body):请求参数被放在请求体中
五、服务器处理请求并返回 HTTP 响应报文
响应报文包括三部分
- 响应行(response line):包括协议版本(HTTP/1.1),状态码,状态码描述(200 OK)
- Status状态码规则如下:
1开头:信息状态码100–Continue 初始的请求已经接受,客户应当继续发送请求的其余部分
2开头:成功状态码200–表示请求已被成功接收、理解、接受。
3开头:重定向状态码302–要完成请求必须进行更进一步的操作。
4开头:客户端错误状态码404–请求有语法错误或请求无法实现。
5开头:服务器端错误状态码500–服务器未能实现合法的请求。
- Status状态码规则如下:
- 响应头(header):响应头包含请求的附加信息,每一对关键字和值用英文冒号“:”分隔。
- 响应体(response body):可以承载很多类型的数字数据:图片、视频、HTML 文档、软件应用程 序、信用卡事务、电子邮件等
六、浏览器解析渲染页面
1. 根据 HTML 解析出 DOM 树(渲染引擎线程执行)
- DOM解析和JS解析单方向互斥,JS解析时会阻塞Dom解析,但是Dom解析
2. 根据 CSS 解析出 CSS 规则树(开启异步线程执行)
- CSS解析和DOM树是并行的,因为遇到CSS元素时,是开启异步线程下载和构建CSS规则树
- CSS解析和JS解析双方向互斥,JS解析时会阻塞CSS解析,而CSS解析时也会阻塞JS解析
- CSS解析不会阻塞DOM的解析,CSS解析会阻塞DOM的渲染
3. 结合 DOM 树和 CSS 规则树,生成渲染树
- DOM 树和 CSS 规则树全部准备好了以后,浏览器才会开始构建渲染树。
- DOM树和渲染树的区别: 渲染树中并不包含DOM树中隐藏的元素,隐藏元素不需要显示
4. 渲染树布局(layout):根据渲染树计算出每个渲染树节点在屏幕中的位置
- 回流(reflow):当渲染树的一部分或全部元素结构发生改变(增加、删除、位置改变,显示或隐藏),浏览器都需要重新计算一遍DOM结构,重新对当前的页面进行渲染,这就是回流。每个页面至少需要一次回流,就是在页面第一次加载的时候
5. 渲染树绘制(painting):最后遍历渲染树并用UI后端组件将每一个节点绘制出来
- 重绘(repaint):元素外观的改变所触发的浏览器行为,这时浏览器只会重绘某一部分,重绘并不一定伴随重排。
- 重排(reflow):元素的几何属性的改变,浏览器需要重新计算元素的几何属性,同样其他元素的几何属性和位置也会因此受到影响。浏览器会使渲染树中受到影响的部分失效,并重新构造渲染树。这个过程称为重排。重排一定伴随着重绘。
(附加):DOM树的解析和CSSOM树的解析是串行还是并行
- CSS解析和DOM树是并行的,因为遇到CSS元素时,是开启异步线程下载和构建CSS规则树
七、四次挥手断开连接
- 发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1
状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧) - 被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2
状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧) - 被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK
状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧) - 发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT
状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)