自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Http 響應頭中的 ETag 值是如何生成的

網(wǎng)絡 網(wǎng)絡管理
1. 盡量便于計算,不會特別耗 CPU。這樣子利用摘要算法生成 (MD5, SHA128, SHA256) 需要慎重考慮,因為他們是 CPU 密集型運算。

?關于 etag 的生成需要滿足幾個條件,至少是寬松滿足

  1. 當文件更改時,etag 值必須改變。
  2. 盡量便于計算,不會特別耗 CPU。這樣子利用摘要算法生成 (MD5, SHA128, SHA256) 需要慎重考慮,因為他們是 CPU 密集型運算
  3. 必須橫向擴展,分布式部署時多個服務器節(jié)點上生成的 etag 值保持一致。這樣子 inode 就排除了

以上幾個條件是理論上的成立條件,那在真正實踐中,應該如何處理?

我們來看一下 nginx 中是如何做的

nginx 中 ETag 的生成

我翻閱了 nginx 的源代碼,并翻譯成偽代碼如下:由 last_modified 與 content_length 拼接而成

etag = header.last_modified + header.content_lenth

可見源碼位置,并在以下貼出: ngx_http_core_modules.c

etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
r->headers_out.last_modified_time,
r->headers_out.content_length_n)
- etag->value.data;

總結(jié):nginx 中 etag 由響應頭的 Last-Modified 與 Content-Length 表示為十六進制組合而成。

隨手在我的k8s集群里找個 nginx 服務測試一下

$ curl --head 10.97.109.49
HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Tue, 10 Dec 2019 06:45:24 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 23 Apr 2019 10:18:21 GMT
Connection: keep-alive
ETag: "5cbee66d-264"
Accept-Ranges: bytes

由 etag 計算 Last-Modified 與 Content-Length,使用 js 計算如下,結(jié)果相符

> new Date(parseInt('5cbee66d', 16) * 1000).toJSON()
"2019-04-23T10:18:21.000Z"
> parseInt('264', 16)
612

Nginx 中的 ETag 算法及其不足

協(xié)商緩存用來計算資源是否返回 304,我們知道協(xié)商緩存有兩種方式

  • Last-Modified/if-Modified-Since
  • ETag/If-None-Match

既然在 nginx 中 ETag 由 Last-Modified 和 Content-Length 組成,那它便算是一個加強版的 Last-Modified 了,那加強在什么地方呢?

Last-Modified 是由一個 unix timestamp 表示,則意味著它只能作用于秒級的改變,而 nginx 中的 ETag 添加了文件大小的附加條件

那下一個問題:如果 http 響應頭中 ETag 值改變了,是否意味著文件內(nèi)容一定已經(jīng)更改

答案:不能。

因此使用 nginx 計算 304 有一定局限性:在 1s 內(nèi)修改了文件并且保持文件大小不變。但這種情況出現(xiàn)的概率極低就是了,因此在正常情況下可以容忍一個不太完美但是高效的算法。

文章出自:??前端餐廳??,如有轉(zhuǎn)載本文請聯(lián)系前端餐廳ReTech今日頭條號。

github:https://github.com/zuopf769

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2021-07-23 15:55:31

HTTPETag前端

2021-05-26 05:18:51

HTTP ETag Entity Tag

2017-02-08 14:29:04

2021-07-27 14:50:15

axiosHTTP前端

2019-12-13 09:14:35

HTTP2協(xié)議

2019-07-02 08:24:07

HTTPHTTPSTCP

2010-05-07 12:20:38

負載均衡etag

2019-01-27 14:37:47

數(shù)據(jù)HTTP服務

2019-04-08 15:11:12

HTTP協(xié)議Web

2015-07-09 10:32:23

Windows Ser云計算應用架構(gòu)

2009-06-04 10:41:52

Struts工作原理

2022-07-03 16:26:43

比特幣貨幣加密貨幣

2023-09-19 22:41:30

控制器HTTP

2015-09-15 15:20:35

2011-10-14 09:23:14

2024-05-16 07:55:54

NettyRedisRESP協(xié)議

2023-11-08 09:49:19

Java實踐

2021-01-18 05:13:04

TomcatHttp

2024-09-30 08:43:33

HttpgolangTimeout

2017-03-23 14:51:21

HTTP緩存CDN緩存
點贊
收藏

51CTO技術棧公眾號