HTTP缓存相关头

本文详细介绍了HTTP缓存的工作原理,包括Expires与Cache-Control如何控制缓存的有效期,Last-Modified与If-Modified-Since及ETag与If-None-Match如何实现条件请求,以及不同类型的浏览器刷新操作对缓存的影响。

在请求一个静态文件的时候(图片,css,js)等,这些文件的特点是文件不经常变化,将这些不经常变化的文件存储起来,对客户端来说是一个优化用户浏览体验的方法。那么这个就是客户端缓存的意义了。

windows下客户端的缓存文件存放在临时文件夹中,但是这里有个问题就是这个缓存文件存放多久呢?这个是由服务端进行设置的。

Expires/Cache-Control(响应)

例如:

HTTP头中的Expires和Cache-Control就是完成这个事情的。

当客户端第一次访问资源的时候,服务端在返回资源内容的同时也返回了Expires: Sun, 16 Oct 2016 05:43:02 GMT。

服务端告诉浏览器: 你Y的先把这个文件给我缓存起来,在这个过期时间之前,这个文件都不会变化了,你下次需要这个文件的时候,你就不要过来找我要了,你就去缓存中拿就好了,又快又好。

浏览器回答说:诺。

 

于是在第二次html页面中又要访问这个资源的时候,并且访问的日期在Sun, 16 Oct 2016 05:43:02 GMT之前,浏览器就不去服务器那边获取文件了,自己从缓存中自食其力了。

 

但 是呢,浏览器毕竟是在客户端的,客户端的时间可是不准确的,用户可以随着自己的喜好修改自己机器的时间,比如我把我机器的时间调成Sun, 16 Oct 2016 05:43:03 GMT,那么呢?我的浏览器就不会再使用缓存了,而每次都去服务器获取文件。于是,服务器怒了:给你个绝对时间,你由于环境被修改没法判断过期,那么我就 给你相对时间吧。于是就返回了Cache-Control: max-age:600,浏览器你给我缓存个10分钟去。于是浏览器只有乖乖的缓存10分钟了。

 

但是问题又来了,如果有的服务器同时设置了Expires和Cache-Control怎么办呢?(不是闲的没事干,而是由于Cache-Controll是HTTP1.1中才有的)那么就是根据更先进的设置Cache-Control来为标准。

 

好了,现在有个问题,我有个文件可能时不时会更新,服务端非常希望客户端能时不时过来问一下这个文件是否过期,如果没有过期,服务端不返回数据给你,只告诉浏览器你的缓存还没有过期(304)。然后浏览器使用自己存储的缓存来做显示。这个就叫做条件请求。

Last-Modified/ If-Modify-since (响应/请求)

例如:

 

 

客 户端第一次访问资源的时候,服务端返回资源内容的同时返回了Last-Modifed:Wed, 07 Aug 2013 15:32:18 GMT 服务端在告诉客户端:你获取的这个文件我最后的修改时间是Wed, 07 Aug 2013 15:32:18 GMT 。浏览器在获取这个文件存到缓存中的时候,给缓存中的文件同时记录上这个最后修改时间。

 

第二次访问的时候(我们假设这里没有设置expires或者cache-control)。那么服务端访问资源的时候会带上If-Modify-since:Wed, 07 Aug 2013 15:32:18 GMT ;

 

客户端询问服务端:喂,我需要的这个资源其实我这边已经有缓存了,我的缓存文件的最后修改时间是这个是,如果你那边的资源在这个时间以后没有修改的话,你就告诉我一下就好了,不需要返回实际的资源内容。反之,要是你有修改的话,你就把文件内容返回给我吧。

服务端回应说:哦。行为是看下资源是否在这个时间后没有修改过,如果没有修改返回个304告诉客户端,我没有修改过。如果有变化了,我就返回200,并且带上资源内容。

 

这个条件请求还有另外一种方法,打标签(Tag)。

ETag/ If-None-Match(响应/请求)

第一次客户端访问资源的时候,服务端返回资源内容的同时返回了ETag:1234,告诉客户端:这个文件的标签是1234,我如果修改了我这边的资源的话,这个标签就会不一样了。

第 二次客户端访问资源的时候,由于缓存中已经有了Etag为1234的资源,客户端要去服务端查询的是这个资源有木有过期呢?所以带上了If-None- Match: 1234。告诉服务端:如果你那边的资源还是1234标签的资源,你就返回304告诉我,不需要返回资源内容了。如果不是的话,你再返回资源内容给我就行 了。服务端就比较下Etag来看是返回304还是200。

各种刷新

理解了上面的缓存标签之后就很好理解各种刷新了。

刷新有三种

浏览器中写地址,回车

F5

Ctrl+F5

 

假设对一个资源:

浏览器第一次访问,获取资源内容和cache-control: max-age:600,Last_Modify: Wed, 10 Aug 2013 15:32:18 GMT

于是浏览器把资源文件放到缓存中,并且决定下次使用的时候直接去缓存中取了。

 

浏览器url回车

浏览器发现缓存中有这个文件了,好了,就不发送任何请求了,直接去缓存中获取展现。(最快)

 

下面我按下了F5刷新

F5就是告诉浏览器,别偷懒,好歹去服务器看看这个文件是否有过期了。于是浏览器就胆胆襟襟的发送一个请求带上If-Modify-since:Wed, 10 Aug 2013 15:32:18 GMT

然后服务器发现:诶,这个文件我在这个时间后还没修改过,不需要给你任何信息了,返回304就行了。于是浏览器获取到304后就去缓存中欢欢喜喜获取资源了。

 

但是呢,下面我们按下了Ctrl+F5

这个可是要命了,告诉浏览器,你先把你缓存中的这个文件给我删了,然后再去服务器请求个完整的资源文件下来。于是客户端就完成了强行更新的操作...

 

还有说一下,那个ETag实际上很少人使用,因为它的计算是使用算法来得出的,而算法会占用服务端计算的资源,所有服务端的资源都是宝贵的,所以就很少使用etag了。

为了演示体现缓存的作用,先删除所有的浏览器缓存,然后以如下四种方式访问baidu网站,期间使用Pagetest作为测试软件,这是一个搭配IE使用的软件,功能上类似HttpWatch,不过它是免费的,有关Pagetest的用法可以参考官方文章提供的教程

1. 打开IE,键入百度网址,按回车:
========================================================================================

========================================================================================
在此次访问中,因为客户端没有相应缓存,所以浏览器向每一个Web组件发出请求。

2. 打开IE,键入百度网址,按回车:
========================================================================================

========================================================================================在此次访问中,因为客户端已有部分缓存,所以浏览器的请求数明显减少。

3. 在一个已经打开百度网址的浏览器窗口里,按F5刷新:
========================================================================================

======================================================================================== 在此次访问中,客户端刷新,服务端判断缓存未过期便返回304(黄色部分),客户端继续使用缓存。在刷新过程中,浏览器在请求的时候,如果有缓存,会通过 发送If-Modified-Since或If-None-Match到服务器去验证缓存是否有效。

4. 在一个已经打开百度网址的浏览器窗口里,按Ctrl+F5强制刷新:
========================================================================================
======================================================================================== 在此次访问中,客户端强制刷新,不管客户端有没有缓存,每一个Web组件都重新请求。在强制刷新过程中,浏览器在请求的时候,即便有缓存,也不会发送 If-Modified-Since或If-None-Match,这样,任何Web组件都必须从服务器重新下载才能显示。

【源码免费下载链接】:https://renmaiwang.cn/s/nhrcw 深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法,它选择一个节点并尽可能深地探索其分支。在迷宫生成中,DFS被用来创建复杂的路径结构。以下是对给定内容的详细解释:1. **Python深度优先算法生成迷宫的原理**: 迷宫生成的基本思想是随机地在空白区域添加墙壁,形成一条可以从起点到终点的路径。DFS在这里的作用是从起始点开始,随机选择一个方向进行移动,并将该路径标记为已访问。当遇到障碍(已存在的墙壁)或者到达终点时,算法回溯到上一步,选择其他未尝试过的路径。2. **代码解析**: - 定义矩阵`dfs`来记录迷宫中每个单元格是否已被访问。 - 定义矩阵`maze`来表示最终生成的迷宫,其中`#`代表墙壁,空格代表可通行路径。 - `operation`字典存储了四个可能的方向(上、下、左、右)对应的坐标偏移量。 - `direction`列表包含所有可能的方向,用于随机选择移动方向。 - `stack`用于存储深度优先搜索过程中的路径。3. **函数说明**: - `show(graph)`:打印迷宫矩阵,便于观察迷宫结构。 - `showRouter(stack)`:打印DFS过程中访问的路径,展示从起点到终点的路径。 - `generateMaze(start)`:核心函数,使用DFS生成迷宫。首先将起始点标记为已访问,然后随机排序方向,依次尝试这些方向,如果新位置未被访问且在有效范围内,则打通墙壁并递归调用自身。4. **迷宫生成流程**: - 创建一个全墙的初始迷宫矩阵,奇数行和奇数列的位置代表实际的墙壁,偶数位置代表路径。 - 起点设为`(0, 0)`,调用`generateMaze((0,0))`开始生成迷宫。 - 在递归过程中,每次
内容概要:本文设计并实现了一个基于ZigBee无线传感器网络的火焰采集系统,旨在通过无线传感技术实现对监测区域火灾的实时检测与远程报警。系统由ZigBee火焰传感器节点、网关模块和远程通信终端(手机)组成,利用CC2530芯片和Z-Stack协议栈完成数据采集、无线传输与网络组网。传感器节点采集火焰信号后,通过ZigBee网络发送至网关,网关再通过GPRS将信息传输至手机端,实现远程监控。文中详细阐述了系统架构、需求分析、硬件电气原理图设计(包括感知节点与网关)、ZigBee协议栈开发、串口通信机制及节点入网流程,完成了驱动程序与通信协议的设计与调试。系统具备低功耗、高可靠性、自组织组网等特点,适用于古建筑、旧楼宇等场景的火灾预警。; 适合人群:具备嵌入式系统、无线通信基础知识的高校物联网、电子信息类专业学生或初级工程技术人员,熟悉C语言及基本电路设计者更佳;适合参与课程设计、毕业设计或从事无线传感网络开发的技术人员参考。; 使用场景及目标:①用于室内或复杂环境中火灾的早期监测与自动报警;②作为物联网与无线传感器网络的教学实践项目,掌握ZigBee协议栈、传感器驱动、串口通信、网络拓扑构建等核心技术;③为智慧消防、智能家居等应用场景提供低成本、易部署的技术方案原型。; 阅读建议:建议结合ZigBee实验箱与IAR开发环境同步实践,重点关注协议栈事件处理机制、串口与无线数据转发逻辑、节点入网流程的代码实现,配合电气原理图理解硬件连接关系,调试过程中注意信道选择、PAN ID设置与数据帧格式校验,以提升系统稳定性与通信可靠性。
【源码免费下载链接】:https://renmaiwang.cn/s/rbkv9 在计算机科学和技术领域中,计算机网络是不可或缺的一环,其实践性教学环节是掌握该学科核心知识的重要途径。华中科技大学的《计算机网络实验详解》课程为学生提供了全面而系统的动手实践机会,涵盖了socket连接建立、可靠数据传输机制设计和CPT(Cisco Packet Tracer)网络模拟与构建等关键实验项目。这些实践内容不仅强化了学生的编程能力,还帮助其深入理解了网络通信的基本原理及其在实际应用中的具体实现方式。通过 socket连接建立实验,学生能够掌握进程间通信的核心技术,并利用socket接口完成客户端与服务器端之间的信息交互。具体而言,该过程包括socket对象创建、绑定IP地址和端口号、监听连接请求、接受连接建立以及数据传输等步骤。这些实践环节让学生深入理解了TCP/IP协议族的工作机制及其在现代网络体系中的重要地位。此外,通过可靠数据传输实验,学生得以探索如何在不稳定的网络环境下确保数据完整性这一技术难点。互联网的特殊性质导致数据可能经历丢失、重复或顺序错误等问题,因此设计和实现一套完善的传输可靠性机制成为课程的重点内容。该部分实践涉及滑动窗口协议、停等协议以及自动重传请求(ARQ)等关键技术,这些方法均建立在经典的TCP协议之上,并通过实验验证了其在提高数据传输可靠性的有效性。最后,CPT组网实验为学生提供了一个模拟真实网络环境的平台,在此环境中他们可以搭建路由器和交换机设备、配置IP地址并设计路由策略,从而实现网络的互联互通。通过这一系列实践环节,学生不仅能够巩固理论知识,还能够在实际操作中掌握网络设备的配置与管理技能。综合来看,《计算机网络实验详解》课程通过 socket连接建立、可靠数据传输机制设计和CPT组网等三大模块的学习,为学生构建了扎实的专业基础,并为其未来从事网络相
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值