一、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》
《计算机网络自顶向下方法》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出