五、cookie和web缓存

一、cookie

因为HTTP是无状态的,但是网站希望可以识别用户和与用户交互的内容,因此,大多数网站都用了cookie来跟踪用户,来管理用户的状态。示意图如下

cookie有四个部分组成:1、HTTP响应报文中的cookie首部行。2、HTTP请求报文的cookie首部行。3、用户主机中的cookie文件。4、网站的后端数据库

用cookie跟踪用户的过程如下图

上图中,假设用户访问过eBay并且第一次访问Amazon,那么当第一次访问Amazon时,web服务端会产生一个唯一的识别码,web服务端的数据库通过该识别码产生一个表。在HTTP响应报文中的set-cookie字段会将cookie设置为该识别码1678。当用户的浏览器收到该响应报文后,浏览器会把set-cookie字段中的识别码写入cookie文件。之后,当用户再次访问Amazon时,浏览器会查询cookie文件并找到Amazon对应的cookie值,然后放到用户的请求报文中的cookie字段,发给Amazon服务器。这样,Amazon就知道该cookie对应的用户的行为记录在web后端cookie对应的表中,从而知道用户在Amazon都干了啥。然后可以通过用户的行为给用户定向推荐或者服务。

 

示例

下面的报文是访问某个网站时,cookie跟踪用户的过程

1、当第一次访问某个网站时,web服务端发出的响应报文如下,可以看到set-cookie字段被设置

 

2、当再次发送HTTP请求时,请求报文的cookie字段已经被设置,和服务器发送的响应报文的set-cookie字段的值相同

 

3、当过了十几分钟之后再次访问该网站后,请求报文中的cookie被设置成之前的值

cookie是一把双刃剑,网站可以通过cookie更好的服务,但是同时cookie也泄露了用户的隐私,如果cookie被劫持,那么第三方就可以将cookie写入到对应网站的HTTP请求报文中,从而可以不用知道用户的账号密码就可以直接登录某个网站,具体过程见博客https://www.cnblogs.com/AirCrk/p/6051829.html

二、web缓存

如果每个主机访问web网页时都直接向服务端请求,那么服务端的通信量就会大大增加并需要额外的费用增加带宽。此外,如果客户端发送响应报文后,服务端可能会因为各种原因并不能很快的发送响应报文,增加用户的等待时间,用户体验差。为解决这两个问题,web缓存出现了

web缓存也叫代理服务器。web缓存中存储的是用户最近请求过的对象或者资源。用户可以配置浏览器的代理服务器。配置之后,当访问一个网页时的过程如下:

1、浏览器会创建一个到缓存服务器的TCP连接,并向缓存发送一个HTTP请求报文

2、web缓存服务器会对本地资源进行检查,看看是否存在请求资源的副本,如果有,web缓存服务器就向浏览器发送HTTP响应报文

3、如果没有,web缓存服务器会向真正的web服务器发起TCP连接,并发送HTTP请求报文,真正的web服务器收到请求后,向web缓存服务器发送HTTP响应报文

4、当web缓存服务器收到HTTP的响应报文后,web缓存服务器备份一份资源并向客户端浏览器发送HTTP响应报文发送该副本资源

示意图如下

客户端、web缓存和真正的服务器三者之间的关系如下图

 

即便缓存服务器内有缓存,也不能保证每次都会返回OK。因为这关系到被缓存资源的有效性。当源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前的“旧”资源了。

即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器将会再次从源服务器上获取“新”资源。

示意图

缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。浏览器缓存如果有效,就不必再向服务器请求相同的资源了,可以直接从本地磁盘内读取。

和缓存服务器相同的一点是,当判定缓存过期后,会向源服务器确认资源的有效性。若判断浏览器缓存失效,浏览器会再次请求新资源。

 

报文示例

以下报文是访问http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file1.html时的报文

可见第一次请求时的响应报文返回OK,第二次请求的响应报文返回了一个304 Not Modified

第一次响应OK的报文如下

第二次请求的报文如下

可见,在第二次请求报文中出现了If-Modified-Since: Sat, 09 Jan 2021 06:59:01 GMT\r\。If-Modified-Since字段表示自从某个时间点之后,如果请求的资源被修改过,真正的服务端才会通过HTTP响应报文发送该资源给客户端浏览器

 

第二次响应报文如下

服务端发来HTTP/1.1 304 Not Modified\r\n,这意味着在第二次请求报文中If-Modified-Since字段的时间点之后,该资源没有被修改,所以,Web服务器通过web缓存发送该资源的副本给客户端,而且从响应报文中也可以看出,该响应报文没有携带资源

 

所以,通过上述分析,web缓存的作用实质是起到一个分流的作用,减缓web服务器的压力。通过缓存可以减少Web服务器数据传输,节省流量和带宽,缓解Web服务器带宽的瓶颈以及数据拥塞。对Web服务器的要求降低了。缓存也降低了延时, 因为从较远的地方传送响应报文会慢一些

 

参考

《图解HTTP》

《计算机网络自顶向下方法》

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值