本文描述了HTTP协议使用Etag对内容进行缓存以便减少不必要的网络传输以提高运行效率的机制。后面用英文写,但我的英文不太好,如有错误之处,希望大家帮我纠正,我的联系方式在后面。
This article describes the HTTP procotol mechanism of using Etag to cache resources and resume file download in order to reduce unnecessory network transfer so the performance can increase.
86Please respect copyright.PENANAmvJwCzSRlN
Section A. ETag
Etag is an identity of a resource, for example, we can use "10000_20241125150500" as the identity of a file where 10000 is the file size and 20241125150500 is the last modifed time of the file. We tell client browsers the etag of a file, then the browser cache the file and its etag, when next time the file is requested again, the browser can first just send the etag of the file to server, and if the server find the etag remain unchanged, then the browser can use the cache, no need to get the file from server once again.
The server send the etag of a resource by header like this:86Please respect copyright.PENANAvcPTAKSCnw
---------------http response with etag----------------86Please respect copyright.PENANAwBFZTnIK0I
HTTP/1.1 200 OK86Please respect copyright.PENANADuA0OmvyFR
Date: Mon, 25 Nov 2024 10:56:12 GMT86Please respect copyright.PENANAHpH161wgEQ
accept-ranges: bytes86Please respect copyright.PENANARX9JOBCJYj
ETag: "534231200_1732277116"86Please respect copyright.PENANANxCXed3pr8
Content-Length: 53423120086Please respect copyright.PENANARc9TuIASd5
Content-Type: application/octet-stream86Please respect copyright.PENANAkgmPrx62iS
Content-Disposition: attachment; filename="zen.iso"
(http body for the resource)86Please respect copyright.PENANAHln1pPxOfa
-----------------------------------------------------
86Please respect copyright.PENANAIvD1d5CFP1
Section B. if-none-match
The browser send back the etag to ask server if it has been changed by header like this:86Please respect copyright.PENANANRjJh8tCIZ
-----http request for a cached resource------86Please respect copyright.PENANA6vC60LVJVI
GET /zen.iso HTTP/1.186Please respect copyright.PENANABhaoJTwdHN
if-none-match: "534231200_1732277116"86Please respect copyright.PENANAUtqlSK8xwN
---------------------------------------------
If the etag is unchanged, the server response like this:
1. for get and head requests:86Please respect copyright.PENANAM0bUP9hsTU
-----------http response for unchanged resource------86Please respect copyright.PENANA93jUftF5rt
HTTP/1.1 304 Not Modified
(http body canbe empty, the client will used its cache)86Please respect copyright.PENANA43x3hevOsG
----------------------------------------------------
2. for other methods requests:86Please respect copyright.PENANARx12qB2MYd
-----------http response for unchanged resource------86Please respect copyright.PENANA74TgK6VBF9
HTTP/1.1 412 Precondition Failed
(http body canbe empty, the client will used its cache)86Please respect copyright.PENANAEB7D0Uw8PW
----------------------------------------------------
86Please respect copyright.PENANAqvXrfUV7on
If the etag changes, the server response 200 OK with the new file content like this:86Please respect copyright.PENANA7veVhRusG2
---------------http response with etag----------------86Please respect copyright.PENANACqa4tBVHAT
HTTP/1.1 200 OK86Please respect copyright.PENANAPpGAAPMoFg
Date: Mon, 25 Nov 2024 10:56:12 GMT86Please respect copyright.PENANAqywA2xfo2X
accept-ranges: bytes86Please respect copyright.PENANATfjUhsiyw4
ETag: "534231200_1732277116"86Please respect copyright.PENANAVpPK2SMAi9
Content-Length: 53423120086Please respect copyright.PENANAcn7GDB1BEx
Content-Type: application/octet-stream86Please respect copyright.PENANAkZw6GMhhQa
Content-Disposition: attachment; filename="zen.iso"
(http body for the resource)86Please respect copyright.PENANAhwMXNB6DpA
-----------------------------------------------------
86Please respect copyright.PENANALxh0kKfFYD
Section C. if-match
When resuming a download in the browser download manager, the browser sends a range request with the if-match header like this:86Please respect copyright.PENANAHxCSmiXYTf
------resume download request-------86Please respect copyright.PENANAfgnlT16Y1O
GET /zen.iso HTTP/1.186Please respect copyright.PENANANoQkMU7W78
Range: bytes=287718144-86Please respect copyright.PENANAk5SE8yaE36
If-Match: "534231200_1732277116"86Please respect copyright.PENANAPyyHjoO8bZ
-----------------------------------86Please respect copyright.PENANA1lSNkVUFMc
It tells the server to check the etag in If-Match, if unchanged, resume to get the remain content; otherwise, return 412 Precondition Failed.
The server response for unchanged etag is like this:86Please respect copyright.PENANAFsz0NBIRSy
-------------range response-------------------86Please respect copyright.PENANAzQpKOMdnM0
HTTP/1.1 206 Partial Content86Please respect copyright.PENANAlrILMfp08e
accept-ranges: bytes86Please respect copyright.PENANAFY3u9iMN6Y
content-range: bytes 287718144-534231199/53423120086Please respect copyright.PENANABJsDcJyePn
ETag: "534231200_1732277116"86Please respect copyright.PENANAv4ifGSvdFb
Content-Length: 24651305686Please respect copyright.PENANAzbIH8srhTe
Content-Type: application/octet-stream86Please respect copyright.PENANA2tQBhWSvQX
Content-Disposition: attachment; filename="zen.iso"
(http body is the remain file content)86Please respect copyright.PENANAlDHXsK8epM
-------------------------------------------
If the etag changes, response 412 like this:86Please respect copyright.PENANABNwUVZabWa
-----------http response for changed resource------86Please respect copyright.PENANAf5swUBDHCg
HTTP/1.1 412 Precondition Failed
(http body canbe empty, the client will stop downloading the resumed file)86Please respect copyright.PENANAgmaxgrHuy2
---------------------------------------------------
86Please respect copyright.PENANAlilEX5Q5eJ
Section D. if-range
If-Range is similar with If-Match, it's used by chrome when resuming a download in the download manager, whereas firefox use If-Match. They are the same except that when the etag changes, if-range response the resource content from beginning, so the resumed download will start downloading from beginning, while if-match just response the 412 error to stop the resumed download. I think chrome do a better job.
---resume download request by chrome---86Please respect copyright.PENANA1xFg3nRuws
GET /zen.iso HTTP/1.186Please respect copyright.PENANAolYPFkoUQt
Range: bytes=287718144-86Please respect copyright.PENANAnF7lCqwmx9
If-Range: "534231200_1732277116"86Please respect copyright.PENANAzShx9HCN4m
------------------------------------86Please respect copyright.PENANAf6byXACsEs
It tells the server to check the etag in If-Range, if unchanged, resume to get the remain content; otherwise, return 200 OK and the file content from the beginning.
The server response for unchanged etag is like this:86Please respect copyright.PENANArJWI46mVJB
-------------range response-------------------86Please respect copyright.PENANAUlOIaI1icO
HTTP/1.1 206 Partial Content86Please respect copyright.PENANAXKpePWuu8F
accept-ranges: bytes86Please respect copyright.PENANAzpTEeIJMV1
content-range: bytes 287718144-534231199/53423120086Please respect copyright.PENANA7TOtXweAFi
ETag: "534231200_1732277116"86Please respect copyright.PENANAsg8SWQSPHm
Content-Length: 24651305686Please respect copyright.PENANAznM5Prt0ZA
Content-Type: application/octet-stream86Please respect copyright.PENANAm73ZIbMKJn
Content-Disposition: attachment; filename="zen.iso"
(http body is the remain file content)86Please respect copyright.PENANAHXWXamxFiE
-------------------------------------------
If the etag changes, response 200 from beginning like this:86Please respect copyright.PENANAd0YgZrNm4A
-----------http response from the beginning------86Please respect copyright.PENANAbaDa0kC5a2
HTTP/1.1 200 OK86Please respect copyright.PENANAnnlYtKAQjG
Date: Mon, 25 Nov 2024 10:56:12 GMT86Please respect copyright.PENANAcPJr8xgzT2
accept-ranges: bytes86Please respect copyright.PENANArO2SioAnBa
ETag: "534231200_1732277116"86Please respect copyright.PENANAn0QPJ75org
Content-Length: 53423120086Please respect copyright.PENANAlVelWeB0W4
Content-Type: application/octet-stream86Please respect copyright.PENANApqxOLPo7lG
Content-Disposition: attachment; filename="zen.iso"
(http body for the resource)86Please respect copyright.PENANA58LOEjsduZ
---------------------------------------------------
86Please respect copyright.PENANAsL8LALtv4s
Section X. Thanks
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match86Please respect copyright.PENANAHeBElU3wX5
https://blog.csdn.net/catoop/article/details/13417465386Please respect copyright.PENANAuvBs7dR3sr
https://blog.csdn.net/phker/article/details/50722619
Section Y. Contacts Me
If you found any errors or have any suggestions for this article, please let me know, my wechat: si_jinmin, my email: [email protected]86Please respect copyright.PENANAey8EzhobNr
如果您发现本文有任何错误,或者对本文有好的建议,欢迎与我联系探讨,我的微信: si_jinmin, 我的email: [email protected]
如果您對C/C++ Programming, Linux, HTTP Protocol, Website Development, Vue, Git, VsCode感興趣,邀請您加入「Linux/C/C++ Website Development」微信群,請加我的微信(si_jinmin)以便拉您进群。
ns18.117.241.170da2