《图解http》学习总结 第五章(2020.12.05)

168 阅读4分钟

大家好,因为个人水平有限,肯定会有不准确的地方,希望多多指教!

q1:代理,网关,隧道的概念?缓存代理的作用?

http通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理、网关和隧道。

代理

代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。

缓存代理:代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。

网关

网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非http协议服务。因此网关能提高通信的安全性。

隧道

隧道可按要求建立起一条与其他服务器的通信线路,届时使用 SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。

q2:缓存是什么?有啥用?浏览器缓存机制?有啥好处?

缓存是指代理服务器或客户端保存的资源副本,利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。

浏览器的缓存机制

浏览器发送请求前会首先查一下缓存中的数据是否过期,如果没有则使用该数据,不请求了,如果过期了,会向服务器发送请求去查一下该数据有没有被修改,如果没有就返回304,如果更新了,就返回新的数据,需要注意的是,在收到新的数据后,浏览器会将数据中的一些字段存储下来,作为验证是否过期,是否修改的凭据。
q2.1: 浏览器和服务器之间是怎么验证是否过期?是否修改的?
验证是否过期的字段:

expires:服务器返回一个expires字段,值为服务器的格林尼治时间,发送请求时会比较是否过期。

cache-control:服务器返回的cache-control字段,常见的值为:

​ public:所有内容都将被缓存(客户端和代理服务器都可缓存)

​ private:所有内容只有客户端可以缓存,Cache-Control的默认取值

​ no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定

​ no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存

​ max-age=xxx (xxx is numeric):缓存内容将在xxx秒后失效

expires使用的是绝对时间,当服务器和客户端时间不一致时可能会出现问题,而cache-control使用的是相对时间,二者都存在时,后者的优先级更高。

验证是否更新的字段:

Last-Modified / If-Modified-Since:浏览器发起请求时会携带If-Modified-Since字段,值为上一次服务器响应时Last-Modified的值(两个字段的值都为格林尼治时间),服务器根据If-Modified-Since字段保存的时间与上次修改的时间进行比对,根据比对结果分别返回304 not Modified 和200 success。 Etag / If-None-Match: 浏览器发起请求时会携带 If-None-Match字段,值为上一次服务器响应时Etag的值(两个字段的值都为服务器生成的hash值),服务器根据If-None-Match字段保存的hash值进行比对,根据比对结果分别返回304 not Modified 和200 success。 Etag / If-None-Match优先级高于Last-Modified / If-Modified-Since,原因同上。

q2.2: 强缓存与协商缓存?内存缓存与硬盘缓存?

强缓存与协商缓存是根据浏览器查看缓存的过程区分的,浏览器验证数据是否过期使用的就是强缓存,验证是否更新使用的是弱缓存。

内存缓存与硬盘缓存则是根据缓存存储的物理位置区分的,内存缓存中保存的是图片和js文件,需要快速加载的文件,硬盘缓存中保存的是css等其他文件。