本文描述了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.
99Please respect copyright.PENANAVrVi7JnklX
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:99Please respect copyright.PENANAKVTYzLgobp
---------------http response with etag----------------99Please respect copyright.PENANANDs3fcMdTg
HTTP/1.1 200 OK99Please respect copyright.PENANARUl3scxyjb
Date: Mon, 25 Nov 2024 10:56:12 GMT99Please respect copyright.PENANAyF9OM90ahE
accept-ranges: bytes99Please respect copyright.PENANAnSsro2yMZg
ETag: "534231200_1732277116"99Please respect copyright.PENANAdd3dFmRA1g
Content-Length: 53423120099Please respect copyright.PENANAHEiPayVYlE
Content-Type: application/octet-stream99Please respect copyright.PENANA9D3a0Jyhw3
Content-Disposition: attachment; filename="zen.iso"
(http body for the resource)99Please respect copyright.PENANAXGSbQEU7Lm
-----------------------------------------------------
99Please respect copyright.PENANAm8we3d0gjA
Section B. if-none-match
The browser send back the etag to ask server if it has been changed by header like this:99Please respect copyright.PENANAuiIMbBgwDN
-----http request for a cached resource------99Please respect copyright.PENANA3prDgBpcKA
GET /zen.iso HTTP/1.199Please respect copyright.PENANAq1XEqhqo9f
if-none-match: "534231200_1732277116"99Please respect copyright.PENANAbBJv0l1Jrq
---------------------------------------------
If the etag is unchanged, the server response like this:
1. for get and head requests:99Please respect copyright.PENANAVLHeWHbHKR
-----------http response for unchanged resource------99Please respect copyright.PENANAok94s9dKBZ
HTTP/1.1 304 Not Modified
(http body canbe empty, the client will used its cache)99Please respect copyright.PENANAKiOEQh9fxC
----------------------------------------------------
2. for other methods requests:99Please respect copyright.PENANACM5nDbKBAW
-----------http response for unchanged resource------99Please respect copyright.PENANAKrArahMvop
HTTP/1.1 412 Precondition Failed
(http body canbe empty, the client will used its cache)99Please respect copyright.PENANAqZ5QrsAHAt
----------------------------------------------------
99Please respect copyright.PENANAomza14pQIO
If the etag changes, the server response 200 OK with the new file content like this:99Please respect copyright.PENANANJOVJH0rqW
---------------http response with etag----------------99Please respect copyright.PENANACTpn6ysFCK
HTTP/1.1 200 OK99Please respect copyright.PENANAlCkTpWzfMa
Date: Mon, 25 Nov 2024 10:56:12 GMT99Please respect copyright.PENANAmRi5i5LDfr
accept-ranges: bytes99Please respect copyright.PENANAkwoLe5R32W
ETag: "534231200_1732277116"99Please respect copyright.PENANAPxRnhomeo8
Content-Length: 53423120099Please respect copyright.PENANAz9FiSWUruF
Content-Type: application/octet-stream99Please respect copyright.PENANAmwqRUcdKro
Content-Disposition: attachment; filename="zen.iso"
(http body for the resource)99Please respect copyright.PENANAOeAoRPUZvE
-----------------------------------------------------
99Please respect copyright.PENANAXZqVSJ9IhS
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:99Please respect copyright.PENANA6k8q6wSAi7
------resume download request-------99Please respect copyright.PENANAFYunpLY69z
GET /zen.iso HTTP/1.199Please respect copyright.PENANAl8RgBWCVST
Range: bytes=287718144-99Please respect copyright.PENANAcwakUoSne1
If-Match: "534231200_1732277116"99Please respect copyright.PENANAz4nsjBRj3u
-----------------------------------99Please respect copyright.PENANAyB3fMSHZUH
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:99Please respect copyright.PENANASPQOYcfv15
-------------range response-------------------99Please respect copyright.PENANAPPWUcgNYLx
HTTP/1.1 206 Partial Content99Please respect copyright.PENANADw9hAB6SLR
accept-ranges: bytes99Please respect copyright.PENANA7SthWgXrpc
content-range: bytes 287718144-534231199/53423120099Please respect copyright.PENANAIU11DstYwx
ETag: "534231200_1732277116"99Please respect copyright.PENANAEt93UyXLFa
Content-Length: 24651305699Please respect copyright.PENANA4ALPxiZ36G
Content-Type: application/octet-stream99Please respect copyright.PENANAMepfgSMkmH
Content-Disposition: attachment; filename="zen.iso"
(http body is the remain file content)99Please respect copyright.PENANA0YQPrVYsNb
-------------------------------------------
If the etag changes, response 412 like this:99Please respect copyright.PENANAnsEdiZMPmB
-----------http response for changed resource------99Please respect copyright.PENANAuF2O1N0VMp
HTTP/1.1 412 Precondition Failed
(http body canbe empty, the client will stop downloading the resumed file)99Please respect copyright.PENANAI2vjXgBM5y
---------------------------------------------------
99Please respect copyright.PENANAgWXfV1GEjk
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---99Please respect copyright.PENANAGw12v6PlLe
GET /zen.iso HTTP/1.199Please respect copyright.PENANABRF97wN9wB
Range: bytes=287718144-99Please respect copyright.PENANAi8reMQDZSj
If-Range: "534231200_1732277116"99Please respect copyright.PENANAPYA7PyiUy2
------------------------------------99Please respect copyright.PENANAdgyPje4wMn
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:99Please respect copyright.PENANAegyKWCT6BN
-------------range response-------------------99Please respect copyright.PENANASLPNRJGbaF
HTTP/1.1 206 Partial Content99Please respect copyright.PENANAbKrxzIM8Xq
accept-ranges: bytes99Please respect copyright.PENANAKI7QNwpN4R
content-range: bytes 287718144-534231199/53423120099Please respect copyright.PENANAeZQoE1rsxS
ETag: "534231200_1732277116"99Please respect copyright.PENANAhdiW2U0U4X
Content-Length: 24651305699Please respect copyright.PENANAXgfPlVbYaT
Content-Type: application/octet-stream99Please respect copyright.PENANA7Fm1atqhAP
Content-Disposition: attachment; filename="zen.iso"
(http body is the remain file content)99Please respect copyright.PENANAbSnEGPLSYR
-------------------------------------------
If the etag changes, response 200 from beginning like this:99Please respect copyright.PENANAsINt5lLXxJ
-----------http response from the beginning------99Please respect copyright.PENANATyZsJZKuKI
HTTP/1.1 200 OK99Please respect copyright.PENANA87TuiIb7Qm
Date: Mon, 25 Nov 2024 10:56:12 GMT99Please respect copyright.PENANAZaiEsadQdy
accept-ranges: bytes99Please respect copyright.PENANAMb2qPwBNQO
ETag: "534231200_1732277116"99Please respect copyright.PENANAVvSlzxXqIf
Content-Length: 53423120099Please respect copyright.PENANAMvN1hS1oly
Content-Type: application/octet-stream99Please respect copyright.PENANArgsguWds7W
Content-Disposition: attachment; filename="zen.iso"
(http body for the resource)99Please respect copyright.PENANAIFyz3uXC0k
---------------------------------------------------
99Please respect copyright.PENANA3kL6CFje88
Section X. Thanks
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match99Please respect copyright.PENANAIJN1wpIof2
https://blog.csdn.net/catoop/article/details/13417465399Please respect copyright.PENANA8jAmye3cxr
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]99Please respect copyright.PENANAmedL3rzN2t
如果您发现本文有任何错误,或者对本文有好的建议,欢迎与我联系探讨,我的微信: si_jinmin, 我的email: [email protected]
如果您對C/C++ Programming, Linux, HTTP Protocol, Website Development, Vue, Git, VsCode感興趣,邀請您加入「Linux/C/C++ Website Development」微信群,請加我的微信(si_jinmin)以便拉您进群。
ns18.221.35.244da2