当客户端浏览器从Web服务器请求文件时,我知道会执行某种检查,因为Web服务器所需的文件可能已被Web浏览器caching。 所以,如果caching中存在文件,则不会发送文件。 但是,如果文件在浏览器中caching后,服务器上的文件发生了变化,则无论如何都会发送和更新文件。
然后,如果您在服务器上启用了压缩function(例如gzipping),则要提供给客户端的文件必须在途中进行gzip压缩,这需要进行一些服务器端处理。
但是,这是如何pipe理的? 在我看来,逻辑的方法是,Web服务器也应该有一个caching,包含在一定的时间范围内所请求的所有文件的最新版本,因此这些文件的压缩版本,以便压缩不必每次请求文件时都要完成。
而且,文件最终是如何请求的? 浏览器是否要求input文件,每次在HTML代码中遇到一个文件,并且该文件没有存储在本地caching中,还是将所有需要的文件求和并同时要求整个文件?
但是这只是从编程的angular度来猜测,而我并不知道。
如果Web服务器系统中的答案非常不同,我主要对Apache感兴趣,但其他答案也是值得赞赏的。
您可以在HTTP规范中以高昂的细节阅读它,但这里的要点是:当浏览器需要请求文件时,它首先检查本地caching。 有三个主要的可能性:
If-Modified-Since标题,其中包含上次访问文件的时间。 If-Modified-Since标头,其中包含上次访问文件的时间。 If-Modified-Since标题的请求。 当请求到达服务器时,基本上可能会发生一些事情。 如果请求中不包含If-Modified-Since标头,则服务器将继续并使用HTTP 200(OK)响应代码发回文件。 (或者它会发送一个404文件未find,或403禁止,或任何适当的)但如果请求确实包括一个If-Modified-Since标题,服务器知道它只需要发回文件,如果它自包含在标题中的时间以来进行了修改。 现在,如果从那时起文件被修改了,那么服务器会再次发送一个代码为200或403,404的文件。 但是,如果文件自指定的时间以来没有被修改过 – 请记住,这意味着浏览器的caching版本仍然是最新的 – 服务器可以使用304(未修改)代码进行响应,而忽略文件本身的内容。 这可以节省一些networkingstream量。
现在,假定服务器将会以文件的全部内容作出响应,根据服务器的写入和/或configuration方式,有几种方法可以解决这个问题。 显然,每次请求进来时它都可以从磁盘读取文件(或者运行程序生成它,如果它是一个dynamic页面的话),然后发送回去,但是正如你所知道的那样,效率很低。 如果浏览器在请求中指定了Accept-Encoding: gzip ,服务器可以做的一件事就是发回gzip版本的文件。 服务器保留gzip文件的caching版本确实是有意义的,Apache(也可能是大多数其他服务器)可以configuration为这样做。 当服务器准备发回gzip的响应时,它会检查gzip的caching版本的修改时间与原始文件的修改时间,如果原始文件已经更新,它将再次运行gzip并replace旧版本在caching中与新版本。
有时服务器也可以cachingRAM中的文件,如果频繁请求的话。 我认为Apache可以configuration,但我不确定。 (正如你现在可以猜到的那样,使用Apache就是所有的configuration。)
关于如何请求文件的问题,浏览器确实每次都要求input一个文件。 每个HTML页面,CSS文件,Javascript文件,图像文件等都对应于一个单独的HTTP请求。 像Wireshark这样的工具实际上可以让你看到个别的HTTP请求和响应来自你的电脑,如果你有兴趣。 但为了节省资源,TCP / IP连接通常通过一整套请求保持打开状态。 例如,如果你有一个带有3张图片和CSS样式表的网页,你可能会得到如下的序列:
Connection: close header来请求图像3 Connection: close标头可以由任一方发送,以指定在该请求完成之后应该closuresTCP / IP连接。
希望大部分得到你所要求的,但是HTTP规范是一个巨大的文件,并且我忽略了许多微妙的东西。 实际上我觉得它是适度有趣的阅读,所以我build议你去看看它(然后,我可能有点奇怪)。