1、http 和 https 的基本概念
http: 是⼀个客户端和服务器端请求和应答的标准(TCP),⽤于从 WWW 服务器传输超⽂本到本地浏览器的超⽂本传输协议。
https:是以安全为⽬标的 HTTP 通道,即 HTTP 下 加⼊ SSL 层进⾏加密。其作⽤是:建⽴⼀个信息安全通道,来确保数据的传输,确保⽹站的真实性。
2、http 和 https 的区别及优缺点?
http 是超⽂本传输协议,信息是明⽂传输,HTTPS 协议要⽐ http 协议 安全 ,https 是具有安全性的 ssl 加密传输协议,可防⽌数据在传输过程中被窃取、改变,确保数据的完整性(当然这种安全性并⾮绝对的,对于更深⼊的 Web 安全问题,此处暂且不表)。
http 协议的 默认端⼝ 为 80,https 的默认端⼝为 443。
http 的连接很简单,是⽆状态的。https 握⼿阶段⽐较 费时 ,会使⻚⾯加载时间延⻓ 50%,增加 10%~20%的耗电。https 缓存 不如 http ⾼效,会增加数据开销。
Https 协议需要 ca 证书,费⽤较⾼,功能越强⼤的 证书费 ⽤越⾼。
SSL 证书需要绑定 IP ,不能再同⼀个 IP 上绑定多个域名,IPV4 资源⽀持不了这种消耗。
3、https 协议的⼯作原理
- 客户使用
https
的URL
访问Web
服务器,要求与Web
服务器建立SSL
连接。 Web
服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。- 客户端的浏览器与
Web
服务器开始协商SSL
连接的安全等级,也就是信息加密的等级。 - 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
Web
服务器利用自己的私钥解密出会话密钥。Web
服务器利用会话密钥加密与客户端之间的通信。
4、TCP三次握⼿
- 客服端首先发送一个连接试探。
- 服务器监听到连接请求报文后,如果同意建立连接,则向
Client
发送确认。 Client
收到确认后还需要再次发送确认,同时携带要发送给Server
的数据。
5、为什么要三次握手?
- 验证服务端和客户端是否遵循
TCP/IP
协议 - 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
6、TCP 四次挥⼿
- 客户端进程发出连接释放报文,并且停止发送数据。
- 服务器收到连接释放报文,发出确认报文,此时,服务端就进入了
CLOSE-WAIT
(关闭等待)状态。(客户端向服务器方向释放了,但是服务器发送数据,客户端依然要接受) - 客户端收到服务器的确认请求后,客户端就进入
FIN-WAIT-2
(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。 - 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了
LAST-ACK
(最后确认)状态,等待客户端的确认。 - 客户端收到服务器的连接释放报文后,必须发出确认,客户端就进入了
TIME-WAIT
(时间等待)状态。 - 服务器只要收到了客户端发出的确认,立即进入
CLOSED
状态。同样,撤销TCB
后,就结束了这次的TCP
连接。(服务器结束TCP连接的时间要比客户端早一些。)
7、域名发散和域名收敛
域名发散:为了突破浏览器对于同一域名并发请求数的限制,http
静态资源采用多个子域名,通常为2~4个。
目的是充分利用现代浏览器的多线程并发下载能力。
域名收敛:域名收敛和域名发散正好相反:就是将静态资源只放在一个域名下面,而非发散情况下的多个域名下。 主要是为了适应移动端的发展需求。
8、TCP和UDP的区别
. TCP是⾯向 链接 的,⽽UDP是⾯向⽆连接的。
. TCP仅⽀持 单播传输 ,UDP 提供了单播,多播,⼴播的功能。
. TCP的三次握⼿保证了连接的 可靠性 ; UDP是⽆连接的、不可靠的⼀种数据传输协议,⾸先不可靠性体现在⽆连接上,通信都不需要建⽴连接,对接收到的数据也不发送确认信号,发送端不知道数据是否会正确接收。
. UDP的 头部开销 ⽐TCP的更⼩,数据 传输速率更⾼ , 实时性更好 。
9、HTTP 请求跨域问题
跨域,是指浏览器不能执⾏其他⽹站的脚本。它是由浏览器的 同源策略 造成的。
同源策略,是浏览器对 JavaScript 实施的安全限制,只要 协议、域名、端⼝ 有任何⼀个不同,都被当作是不同的域。跨域原理,即是通过各种⽅式, 避开浏览器的安全限制 。
1、JSONP:
ajax 请求受同源策略影响,不允许进⾏跨域请求,⽽ script 标签 src 属性中的链 接却可以访问跨域的 js 脚本,利⽤这个特性,服务端不再返回 JSON 格式的数据,⽽是 返回⼀段调⽤某个函数的 js 代码,在 src 中进⾏了调⽤,这样实现了跨域。
步骤:
. 去创建⼀个script标签
. script的src属性设置接⼝地址
. 接⼝参数,必须要带⼀个⾃定义函数名,要不然后台⽆法返回数据
. 通过定义函数名去接受返回的数据
JSONP 的缺点: JSON 只⽀持 get,因为 script 标签只能使⽤ get 请求; JSONP 需要后端配合返回指定格式的数据。
2、document.domain 基础域名相同 ⼦域名不同:通过修改document.domain形成同域操作
3、window.name 利⽤在⼀个浏览器窗⼝内,载⼊所有的域名都是共享⼀个window.name:通过iframe处理
4、CORS CORS(Cross-origin resource sharing)跨域资源共享 服务器设置对CORS的⽀持原理:服务器设置Access-Control-Allow-Origin HTTP响应头之后,浏览器将会允许跨域请求
5、proxy代理 ⽬前常⽤⽅式,通过服务器设置代理
6、window.postMessage() 利⽤h5新特性window.postMessage()
10、DNS 域名如何解析的?
DNS
域名解析采用的是递归查询的方法
先去找DNS
缓存->缓存找不到就去找根域名服务器->根域名又会去找下一级,递归查找之后,找到了,给我们的web
浏览器。
-
浏览器首先搜索自身的DNS缓存,看缓存中是否有
www.abc.com
这个域名,有而且没有过期的话,解析结束。 -
如果浏览器自身的缓存中没有找到,则会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索,解析到此结束。
-
如果在操作系统的DNS缓存中也没有找到,那么尝试读取hosts文件,有则解析成功,解析到此结束。
-
如果在hosts文件中也没有找到,浏览器会发起一个DNS(Domain Name System:域名服务协议)系统调用,向本地配置的首选DNS服务器发起域名解析请求(递归请求)
11、从输⼊URL到⻚⾯加载的全过程
1、⾸先在浏览器中输⼊URL
2、查找缓存:浏览器先查看浏览器缓存-系统缓存-路由缓存中是否有该地址⻚⾯,如果有则显示⻚⾯内容。如果没有则进⾏下⼀步。
. 浏览器缓存:浏览器会记录DNS⼀段时间,因此,只是第⼀个地⽅解析DNS请求;
操作系统缓存:如果在浏览器缓存中不包含这个记录,则会使系统调⽤操作系统, 获取操作系统的记录(保存最近的DNS查询缓存); 路由器缓存:如果上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。
3、DNS域名解析:浏览器向DNS服务器发起请求,解析该URL中的域名对应的IP地址。 DNS服务器是基于UDP的,因此会⽤到UDP协议
4、建⽴TCP连接:解析出IP地址后,根据IP地址和默认80端⼝,和服务器建⽴TCP连接
5、发起HTTP请求:浏览器发起读取⽂件的HTTP请求,,该请求报⽂作为TCP三次握⼿的第三次数据发送给服务器
6、服务器响应请求并返回结果:服务器对浏览器请求做出响应,并把对应的html⽂件发送给浏览器
7、关闭TCP连接:通过四次挥⼿释放TCP连接
8、浏览器渲染:客户端(浏览器)解析HTML内容并渲染出来,浏览器接收到数据包后的解析流程为:
构建DOM树 -》构建render树 -〉绘制 -》JS引擎解析 -〉 创建window对象 -》 加载⽂件 -〉 预编译 -》解释执⾏
12、浏览器重绘与重排的区别?
重排/回流(Reflow) :当 DOM 的变化影响了元素的⼏何信息,浏览器需要重新计算元素的⼏何属性,将其安放在界⾯中的正确位置,这个过程叫做重排。表现为重新⽣成布局,重新排列元素。
重绘(Repaint) : 当⼀个元素的外观发⽣改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变
单单改变元素的外观,肯定不会引起⽹⻚重新⽣成布局,但当浏览器完成重排之后,将会重新绘制受到此次重排影响的部分
重排和重绘代价是⾼昂的,它们会破坏⽤户体验,并且让UI展示⾮常迟缓,⽽相⽐之下重排的性能影响更⼤,在两者⽆法避免的情况下,⼀般我们宁可选择代价更⼩的重绘。
『重绘』不⼀定会出现『重排』,『重排』必然会出现『重绘』
任何改变⽤来构建渲染树的信息都会导致⼀次重排或重绘
13、介绍下304过程
1、浏览器请求资源时⾸先命中资源的Expires 和 Cache-Control,Expires 受限于本地时间,如果修改了本地时间,可能会造成缓存失效,可以通过Cache- control: max-age指定最⼤⽣命周期,状态仍然返回200,但不会请求数据,在浏览器中能明显看到from cache字样。
2、强缓存失效,进⼊协商缓存阶段,⾸先验证ETagETag可以保证每⼀个资源是唯⼀的,资源变化都会导致ETag变化。服务器根据客户端上送的If-None-Match值来判断是否命中缓存
3、协商缓存Last-Modify/If-Modify-Since阶段,客户端第⼀次请求资源时,服务服返回的header中会加上Last-Modify,Last-modify是⼀个时间标识该资源的最后修改时间。再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根 据资源的最后修改时间判断是否命中缓存。
14、浏览器的缓存机制 强制缓存 && 协商缓存
浏览器与服务器通信的⽅式为应答模式,即是:浏览器发起HTTP请求 – 服务器响应该请求。那么浏览器第⼀次向服务器发起该请求后拿到请求结果,会根据响应报⽂中HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存⼊浏览器缓存中
1、强制缓存就是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使⽤该缓存结果的过程。
当浏览器向服务器发起请求时,服务器会将缓存规则放⼊HTTP 响应报⽂的HTTP头中和请求结果⼀起返回给浏览器,控制强制缓存的字段分别是 Expires 和 Cache-Control ,其中Cache-Control优先级⽐Expires⾼。
强制缓存的情况主要有三种(暂不分析协商缓存过程),如下:
. 不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求(跟第⼀次发起请求⼀致)。
. 存在该缓存结果和缓存标识,但该结果已失效,强制缓存失效,则使⽤协商缓存。
. 存在该缓存结果和缓存标识,且该结果尚未失效,强制缓存⽣效,直接返回该结果
2、协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使⽤缓存的过程 ,同样,协商缓存的标识也是在响应报⽂的HTTP头中和请求结果⼀起返回给浏览器的,控制协商缓存的字段分别有: Last-Modified / If-Modified-Since 和 Etag / If-None-Match ,其中Etag / If-None-Match的优先级⽐Last-Modified / If-Modified-Since⾼。协商缓存主要有以下两种情况:
. 协商缓存⽣效,返回304
. 协商缓存失效,返回200和请求结果结果
15、get和post的区别
1、get在浏览器回退的时候是无害的,post会再次提交请求
2、get请求会被浏览器主动cache,而post不会,除非手动设置
3、GET请求只能进行url编码,而POST支持多种编码方式
4、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
5、GET请求在URL中传送的参数是有长度限制的,而POST没有
6、GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息