一、简单介绍

If-Modified-Since:表示浏览器缓存记录中该文件的最后服务器修改时间,由客户端发送给服务器

(一般If-Modified-Since会与Last-Modified成对出现)

Last-Modified:表示服务器本地记录中的文件最后修改时间,由服务器发送给客户端

二、实验 [^1]

(一)步骤
1、清空IE浏览器缓存
2、启动Wireshark
3、在浏览器中输入以下URL
http://gaia.cs.umass.edu/wireshark-labs/HTTP-wireshark-file2.html
HTTP的请求头标签—IMS(If-Modified-Since)
4、在浏览器中快速输入相同的URL(或者选择浏览器上的刷新按钮)

5、停止Wire shark数据包捕获,并在“显示-筛选器-指定”窗口中输入“http”,以便只有捕获的HTTP消息将在稍后显示在数据包列表窗口中。
HTTP的请求头标签—IMS(If-Modified-Since)
(二)分析
1、查看从浏览器到服务器的第一个HTTP GET请求的内容,包含请求头如下:
HTTP的请求头标签—IMS(If-Modified-Since)
2、查看HTTP 200 OK返回的内容,包含请求头如下:
HTTP的请求头标签—IMS(If-Modified-Since)
3、查看从浏览器到服务器的第二个HTTP GET请求的内容,包含请求头如下:
HTTP的请求头标签—IMS(If-Modified-Since)


可以看到第二次GET包含的请求头多了If-Modified-Since和If-None-Match。[^2]

Q1:那为什么第一次没有包含IMS请求头,第二次却出现了呢?
Ans:正如刚才的介绍一样,If-Modified-Since是浏览器缓存记录中该文件的最后服务器修改时间。在浏览器第一次请求某一个URL时,服务器端的返回状态200,内容是请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间。客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过。

Q2:为什么第二次GET请求后,会先返回一个304,然后才200?
Ans:这是因为浏览器发送HTTP请求时,把If-Modified-Since一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较。
如果服务器端的资源没有变化,时间一致,自动返回HTTP状态码304(Not Changed.)状态码,内容为空,客户端接到之后,就直接把本地缓存文件显示到浏览器中,这样就节省了传输数据量。
如果服务器端资源发生改变或者重启服务器时,时间不一致,就返回HTTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中。
以上操作可以保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。


[^1]实验源自:《计算机网络:自顶向下 第七版》
[^2]参考资料:HTTP的请求头标签 If-Modified-Since与Last-Modified

相关文章: