前言
你指尖轻舞,承载你意志的比特流以光速呼啸而出,瞬间到达世界各个角落,再也没有比这更美好的时代了。
面试官:计算机网络的五层结构,http协议你了解多少,你说说强缓存和协商缓存
正文
1. 计算机网络的体系结构
悔大学没认真上课,后来补计算机网络的知识时,处在一种不知道怎么系统地学习,尽管网上都有,但这里看一点那里学一点难以成系统。推荐大家有空把大学那本谢希仁老师的书给看完。单纯准备面试的话看《图解HTTP》够用
1.1 计算机网络体系结构分为三种:OSI体系结构,TCP/IP体系结构,五层体系结构
OSI体系结构: 优点:结构概念清晰,理念完整 缺点:太过完美(复杂),制定该标准的专家缺乏实际经验缺乏商业驱动力,从以前的“国际标准”变成“仅供参考”
TCP/IP:已经被广泛应用,稳定,易实现。
五层协议结构:中和OSI和TCP/IP的有点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。
1.2 各层的作用
物理层:这一层设计到信号的传输,比如双绞线,光纤
数据链路层:这一层具体的传输数据类。数据帧的封装,传输和差错检测
网络层:这一层设计到IP到mac的解析,根据ip地址获取对应的物理地址。ARP地址解析协议。
运输层:这是计算机网络中最重要的一层,因为它里面有两个协议 -- tcp和udp,最重要的就是他们的区别。
应用层:这一层内容是与开发最接近的一层,比如DNS,HTTP,HTTPS等。
2. http协议
我们可以认为与前端最密切的协议是http,因为几乎所有的前端相关资源文件均是通过HTTP协议请求来完成的。
1.1 协议:what-why-how
什么是协议,网络设备通过协议来进行交流,使不同的系统不同的网络之间实现可靠的通讯,其实就是一个群体之间规定的规则(群体里有不国家的人,使用不同的语言),这个规则的目的是为了保证这个群体里面的人可以正常交流。
你把网络协议想象成人与人之间的礼仪行为,不同的场合有不同的礼仪行为,人是实施不同礼仪行为的主体。同样,网络设备是实施网络协议的主体,网络设备通过运行网络协议与其他的网络设备进行交流。同样的道理,你的电脑想要与网络设备交流,也要与网络设备一样运行网络协议,网络协议也是一个软件,是以系统组件的方式安装在你的电脑的操作系统里的。想象一下,你想在你的电脑上或手机上通过微信与心仪的女孩聊天的前提是不是你的电脑和朋友的电脑上都安装有微信这个软件?
那么很明显http协议就是客户端和服务器之间的通信方式,可以说,Web是建立在HTTP协议上通信的。
1.2 HTTP1.0和HTTP1.1的一些区别
- 长连接:设置keep-alive,服务器保持该链接的这段时间内,其他文件请求可以复用这个已经建立好的连接,节省请求建立和关闭的开销。
- 协议扩展切换:Websocket协议通信时典型的应用,Websocket协议通信时通过http的方式建立的,通信连接建立完成之后通知服务器换到webSocket协议来完成后面的数据通信。
- 缓存处理:1.0中主要使用Expires强缓存和last-modified搭配If-modified-Since协商缓存的机制,但是last-modified和Expires都受限于本地。HTTP1.1则引入了更多的缓存控制策略例如cache-control,Etag,If-None-Match等更多可供选择的缓存头来控制缓存策略。
1.3 HTTP/2
- 二进制格式:HTTP/1.x的解析是基于文本的。基于文本协议的解析存在天然缺陷,文本的表现形式有多样性,要做到全面性考虑的场景必然很多。二进制则不同,只识别0和1的组合。基于这种考虑HTTP/2.0的协议解析采用二进制格式,方便且强大。
- 多路复用:即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
- 头部压缩: HTTP/1.x的请求和响应头部带有大量信息,而且每次请求都要重复发送,HTTP/2.0使用encoder来减少需要传输的头部大小,通讯双方各自cache一份头部 fields表,既避免了重复头部的传输,又减小了需要传输的大小。
3. 长连接和多路复用的区别
长连接:长连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻了服务器端的负载。另外, 减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。 请求是一个接一个,所以前面的请求阻塞将会影响后面的。
请求1->响应1->请求2->响应2->请求3->响应3
多路复用:不用等待响应亦可直接发送下一个请求,这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。请求打包一次传输过去,响应打包一次传递回来。多路复用的前提是在持久连接下。
为啥需要复用:HTTP性能优化的关键并不在于高带宽,而是低延迟。TCP连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为TCP慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。
4. 为什么需要头部压缩?
随着 Web 功能越来越复杂,每个页面产生的请求数也越来越多,根据 HTTP Archive 的统计,当前平均每个页面都会产生上百个请求。越来越多的请求导致消耗在头部的流量越来越多,尤其是每次都要传输 UserAgent、Cookie 这类不会频繁变动的内容,完全是一种浪费。
实现技术:Hpack
5. 服务器推送
Server Push即服务端能通过push的方式将客户端需要的内容预先推送过去。
某些资源客户端是一定会请求的,这时就可以采取服务端push的技术,提前给客户端推送必要的资源,这样就可以相对减少一点延迟时间。当然在浏览器兼容的情况下你也可以使用 prefetch。 例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。
6. 强缓存和协商缓存
浏览器的缓存:良好的缓存策略可以降低资源的重复加载提高页面的整体加载速度。
通常浏览器缓存策略分为两种:强缓存和协商缓存 强缓存:强缓存可以通过两种响应头实现Expires和Cache-Control。强缓存表示在缓存期间不需要请求,state code 为200 . Expres是http/1.0的产物,受限于本地时间,如果修改了本地时间,可能会造成缓存失效。 Cache-control:max-age = 30,出现在http/1.1优先级高于expres。表示该资源会在30m后失效。
协商缓存:如果缓存过期了,我们就可以使用协商缓存来解决问题。协商缓存需要请求,如果缓存有效会返回304,协商缓存需要客户端和服务端共同实现。和强缓存一样,也有两种实现方式。 last-modified 表示本地文件最后修改日期,If-modified-Since会将last-modified的值发送给服务器,询问服务器是否在这个时间之后文件有更新,如果有更新就会将新的资源发送回来。 但是如果在本地打开了文件会造成last-modified改变,所以在http/1.1出现了Etag ETag类似于文件指纹, If-None-Match会将ETag发送给服务器,询问该资源,ETag是否变动,有变动就将新的资源发送回来。