你的假设不正确。向客户端发送响应时,缓存 DNS 服务器将仅发送缓存到期前的剩余时间作为 TTL 值。客户端甚至不会知道(并且并不真正关心)什么是“原始”TTL 值。
这是一个例子:我已经创建了
dsmoraes.bajic.nl A 127.0.0.254
TTL=60。
这是一条新记录,因此可以安全地假设它没有缓存在任何地方。当我第一次查询 Google DNS 时,我会得到 60(或 59)秒的 TTL:
$ dig dsmoraes.bajic.nl @8.8.8.8
; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> dsmoraes.bajic.nl @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7656
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;dsmoraes.bajic.nl. IN A
;; ANSWER SECTION:
dsmoraes.bajic.nl. 59 IN A 127.0.0.254
;; Query time: 14 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Aug 02 09:49:49 CEST 2019
;; MSG SIZE rcvd: 62
但是随着每个后续请求,发送给客户端的 TTL 会变低(仅剩余时间):
$ dig +noall +answer dsmoraes.bajic.nl @8.8.8.8
dsmoraes.bajic.nl. 49 IN A 127.0.0.254
$ dig +noall +answer dsmoraes.bajic.nl @8.8.8.8
dsmoraes.bajic.nl. 43 IN A 127.0.0.254
(Google DNS 是分布式的,因此您可能会在后续请求中访问不同的缓存服务器)
这样,如果缓存服务器表现良好,就不会提供过时的记录(在特殊情况下,可能会故意将自己的 DNS 服务器配置为不同的行为,但这是另一回事)。
延伸阅读:https://www.rfc-editor.org/rfc/rfc1034#section-6