一道面试题是如何引发深层次的灵魂拷问? (4)

cookie 是浏览器的一种本地存储方式,一般用来帮助客户端和服务端通信的,常用来进行身份校验,结合服务端的 session 使用。

在登陆页面,用户登陆了 此时,服务端会生成一个session,session中有对于用户的信息(如用户名、密码等) 然后会有一个sessionid(相当于是服务端的这个session对应的key) 然后服务端在登录页面中写入cookie,值就是:jsessionid=xxx 然后浏览器本地就有这个cookie了,以后访问同域名下的页面时,自动带上cookie,自动检验,在有效时间内无需二次登陆。

一般来说,cookie 是不允许存放敏感信息的(千万不要明文存储用户名、密码),因为非常不安全,如果一定要强行存储,首先,一定要在 cookie 中设置 httponly(这样就无法通过 js 操作了),另外可以考虑 rsa 等非对称加密(因为实际上,浏览器本地也是容易被攻克的,并不安全)

比如这样的场景:

客户端在域名A下有cookie(这个可以是登陆时由服务端写入的) 然后在域名A下有一个页面,页面中有很多依赖的静态资源(都是域名A的,譬如有20个静态资源) 此时就有一个问题,页面加载,请求这些静态资源时,浏览器会默认带上cookie 也就是说,这20个静态资源的http请求,每一个都得带上cookie,而实际上静态资源并不需要cookie验证 此时就造成了较为严重的浪费,而且也降低了访问速度(因为内容更多了)

当然了,针对这种场景,是有优化方案的(多域名拆分)。具体做法就是:

(1)将静态资源分组,分别放到不同的域名下(如 static.base.com)

(2)而 page.base.com(页面所在域名)下请求时,是不会带上 static.base.com 域名的 cookie 的,所以就避免了浪费

说到多域名拆分,还有一个问题?

(1)在移动端,如果请求的域名数过多,会降低请求速度(因为域名整套解析流程很浪费时间,而且移动端一般带宽比不上 PC)。

(2)这时候有个优化方案:dns-prefetch(这个是干嘛的?就是让浏览器空闲时提前解析 dns 域名,不过请合理使用)

关于 cookie 的交互,可以看下图总结

iamge

3、gzip 压缩

首先,gzip 是请求头里的 Accept-Encoding:浏览器支持的压缩类型之一。gzip 是一种压缩格式,需要浏览器支持才有效(一般浏览器都支持),而且 gzip 的压缩率很好(高达 70%);

然后 gzip 一般是 apach,nginx,tomcat 等 web 服务器开启。

除了 gzip 的压缩格式,还有 deflate,没有 gzip 高效,不流行。

所以一般只需要在服务器上开启 gzip 压缩,然后之后的请求都是基于 gzip 压缩格式的,非常方便。

4、长连接和短连接

首先我们看一下 tcp/ip 的定义:

(1)长连接:一个 tcp/ip 连接上可以连续发送多个数据包,tcp 连接保持期间,如果乜有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(类似于心跳包)。

(2)短连接:通信双方有数据交互是,简历一个 tcp 连接,数据发送完成后,则断开此 tcp 连接。

我们再看一下 http 层面上:

(1)http1.0 中,默认是使用的短连接,浏览器每进行一次 http 操作,就建立一次连接,任务结束就中断连接,比如每一个静态资源请求都是一个单独的连接

(2)http1.1 开始,默认是使用长连接,长连接会设置 connection: keep-alive,在长连接的情况下,当一个网页打开后,客户端和服务端之间用于传输 http 的 tcp 连接不会关闭,如果客户端再次访问服务器这个页面,会继续使用这一条已经建立起来的连接。

注意:kee-alive 不会永远保持,他有一个持续时间,一般服务中进行配置,另外长连接是需要客户端和服务器端都支持才有效。

5、http2.0

http2.0 不是 https,它相当于 http 的下一代规范(https 也可能是 http2.0 规范)

比较一下 http1.1 和 http2.0 显著不同地方:

(1)http1.1 中,每请求一个资源,都是需要开启一个 tcp/ip 连接的,所以对应的结果是:每一个资源对应一个 tcp/ip 请求,由于 tcp/ip 本身有个并发数的限制,资源一旦多了,速度会下降慢下来。

(2)http2.0 中,一个 tcp/ip 请求可以请求多个资源,也就说,只要一次 tcp/ip 请求,就可以请求多个资源,分隔成更小的帧请求,速度明显提升。

所以,如果 http2.0 全面应用的,很多 http1.1 中的优化方案无需用到(比如:精灵图,静态组员多域名拆分等)。

现在介绍一下 http2.0 的一些特性:

(1)多路复用(一个 tcp/ip 可以请求多个资源);

(2)首部压缩(http 头部压缩,减少体积);

(3)二进制分帧(在应用层跟传输层之间增加一个二进制分帧层,改进传输性能,实现低延迟和高吞吐);

(4)服务器端推送(服务端可以对客户端的一个请求发出多个响应可以主动通知客户端);

(5)请求优先级(如果流被赋予了优先级,就会基于这个优先级来处理,有服务器决定需要多少资源来处理该请求)

6、https

https 就是安全版本的 http,比如一些支付操作服务基本上都是基于 https 的,因为 http 请求的安全系数太低了。

简单来看,https 和 http 区别是:在请求前,会建立 ssl 链接,确保接下来的通信都是加密的,无法轻易截取分析。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsszjw.html