0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么人们有时在域名的末尾加一个点

dyquk4xk2p3d 来源:Linux中国 作者:邀你一起加入 2022-11-23 09:20 次阅读

大家好!今年早些时候,我在写《DNS 是如何工作的 wizardzines.com》 时,有人问我——为什么人们有时在域名的末尾加一个点?例如,如果你通过运行 dig example.com 查询example.com的 IP,你会看到一下内容:

$ dig example.com

example.com. 5678 IN A 93.184.216.34

执行完dig命令后,example.com有一个.——变成了example.com.!发生了什么?

有些 DNS 工具也要求传给它的域名后加一个.:如果你在使用miekg/dns github.com时传给它example.com,它会报错:

// trying to send this message will return an error

m := new(dns.Msg)

m.SetQuestion("example.com", dns.TypeA)

最初我以为我知道这个问题的答案(“呃,末尾的点意味着域名是完全限定的?”)。这是对的 —— 一个完全限定域名(fully qualified domain name)(FQDN)是一个末尾有.的域名!

但是为什么末尾的点是有用且重要的呢?

ea935488-6abe-11ed-8abf-dac502259ad0.svg

在 DNS 的请求/响应中,域名的末尾并没有 “.”

我曾经(错误地)认为 “为什么末尾有一个点?”的答案可能是 “在 DNS 请求/响应中,域名末尾有一个.,所以我们把它放进去,以匹配你的计算机实际发送/接收的内容”。但事实并不是这样!

当计算机发送 DNS 请求/响应时,域名的末尾并没有点。实际上,域名中没有点。

域名会被编码成一系列的长度/字符串对。例如,域名example.com被编码为这 13 个字节。

7example3com0

编码后的内容一个点也没有。一个 ASCII 域名(如example.com)被转成了各种 DNS 软件的 DNS 请求/响应中使用的格式。

今天我们来讨论域名被转成 DNS 响应的一个地方:区域文件。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

区域文件中域名末尾的 “.”

一些人管理域名的 DNS 记录的方法是创建一个被称为 “区域文件” 的文本文件,然后配置一些 DNS 服务器软件(如nsd或bind)来为该区域文件中指定的 DNS 记录提供服务。

下面是一个对应example.com的示例区域文件:

orange 300 IN A 1.2.3.4

fruit 300 IN CNAME orange

grape 3000 IN CNAME example.com.

在这个文件中,任何不以.结尾的域名(比如orange)后都会自动加上.example.com。所以orange成了orange.example.com的简称。DNS 服务器从它的配置中得知这是一个example.com的区域文件,所以它知道在所有不以点结尾的名字后面自动添加example.com。

我想这里的想法只是为了少打几个字符——如果要打出全称,区域文件会是这样:

orange.example.com. 300 IN A 1.2.3.4

fruit.example.com. 300 IN CNAME orange.example.com.

grape.example.com. 3000 IN CNAME example.com.

确实多了很多字符。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

你也可以不通过区域文件来使用 DNS

尽管官方的 DNS RFC(RFC 1035 www.rfc-editor.org)中定义了区域文件格式,但你也可以不通过区域文件来使用 DNS。例如,AWS Route 53 就不用区域文件来存储 DNS 记录!你可以通过 Web 界面或 API 来创建记录,我猜他们是用某种数据库而不是一堆文本文件来存储记录。

不过,Route 53(像许多其他 DNS 工具一样)确实支持导入和导出区域文件,这个功能或许在你更换 DNS 提供商时很有用。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

dig 命令输出中末尾的 “.”

现在我们来讨论下 dig 命令的输出:

$ dig example.com

; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> +all example.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10712

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags:; udp: 65494

;; QUESTION SECTION:

;example.com. IN A

;; ANSWER SECTION:

example.com. 81239 IN A 93.184.216.34

有一件奇怪的事是,几乎每一行都以;;开头,这是怎么回事?;是区域文件中的注释字符!

我想 dig 以这种奇怪的方式输出的原因可能是为了方便你粘贴这些内容到区域文件时,不用修改就可以直接用。

这也是example.com末尾有个.的原因 —— 区域文件要求域名末尾必须有点(否则它们会被解释为是相对于该区域的)。因此 dig 也这么处理了。

我真的希望 dig 有一个+human选项,以更人性化的方式打印出这些信息,但现在我太懒了,懒得花工夫去实际贡献代码来做这件事(而且我并不擅长 C),所以我只能在我的博客上抱怨一下

ea935488-6abe-11ed-8abf-dac502259ad0.svg

curl 命令输出中末尾的 “.”

我们来看下另一个末尾有.的例子:curl!

我家里有台计算机名为grapefruit,其上运行着 Web 服务器。当我执行 curl grapefruit 时,会输出:

$ curl grapefruit

......

这样运行没问题!但是如果我在域名后加一个.会怎样呢?它报错了:

$ curl grapefruit.

curl: (6) Could not resolve host: grapefruit.

发生了什么?为了搞清楚,我们需要先来学习下搜索域:

ea935488-6abe-11ed-8abf-dac502259ad0.svg

初识搜索域

当我执行 curl grapefrult 时,它是怎么被转成一个 DNS 请求的?你可能会认为我的计算机会向域名grapefruit发送一个请求,对吗?但事实并不是这样。

让我们用 tcpdump 来看看到底是什么域名在被查询。

$ sudo tcpdump -i any port 53

[...] A? grapefruit.lan. (32)

实际上是向grapefruit.lan.发送的请求。为什么呢?

解释一下:

1.curl调用函数getaddrinfo来查询grapefruit 2.getaddrinfo查询了我计算机上的文件/etc/resolv.conf 3./etc/resolv.conf包含两行内容:

nameserver 127.0.0.53

search lan

4.因为有search lan这行内容,所以getaddrinfo在grapefruit的末尾添加了一个lan,去查询grapefruit.lan

ea935488-6abe-11ed-8abf-dac502259ad0.svg

什么时候搜索域被使用?

现在我们知道了一些奇怪的事情:当我们查询一个域名时,有时会有一个额外的东西(如lan)被加到最后。但是什么时候会发生这种情况呢?

1.如果我们在域名末尾添加一个.,那么这时不会用到搜索域 2.如果域名中间包含一个.(如example.com),那么默认也不会用到搜索域。但是可以通过修改配置来改变处理逻辑(在ndots pracucci.com里有更详细的说明)

我们现在知道了curl grapefruit.与curl grapefruit结果不一样的原因——因为一个查询的是grapefruit.,而另一个查询的是grapefruit.lan.。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

我的计算机怎么知道使用哪个搜索域呢?

当我连接路由时,它会通过 DHCP 告诉我它的搜索域是lan—— 它也是通过这个方式给我的计算机分配 IP。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

所以为什么要在域名末尾加一个点呢?

现在我们已经了解了区域文件和搜索域,下面是我认为的人们要在域名末尾加点的原因:

有两种情况下,域名会被修改,并在末尾添加其他东西。

◈在example.com的区域文件中,grapefruit会被转为grapefruit.example.com ◈在我的本地网络(我的计算机已经配置了使用搜索域lan),grapefruit被转为grapefruit.lan

因此,由于域名在某些情况下实际上可能被转成其他名字,人们就在结尾处加一个.,以此来表示 “这是域名,末尾不需要添加任何东西,这就是全部内容”。否则会引起混乱。

“这就是全部内容”的技术术语是**“完全限定域名”,简称为“FQDN”**。所以google.com.是一个完全限定域名,而google.com不是。

我总是要提醒自己这样做的原因,因为我很少使用区域文件和搜索域,所以我经常觉得——“我当然是指google.com而不是google.com.something.else! 我为什么要指其他东西?那太傻了!”

但是有些人确实在使用区域文件和搜索域(例如 Kubernetes 中使用了搜索域!),所以结尾的.很有用,可以让人确切的知道,不应该再添加其他东西。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

什么时候在末尾添加 “.”?

以下是关于何时在域名末尾加 ". " 的几个简单说明:

需要添加:配置 DNS 时

在配置 DNS 时,使用完全限定域名从来都不是坏事。你不一定要这样做:非完全限定域名通常也能正常工作,但我从来没有遇到过不接受完全限定域名的 DNS 软件。

有些 DNS 软件需要这样做:现在我为jvns.ca使用的 DNS 服务器让我在域名的末尾加上.(例如在 CNAME 记录中),并提示如果我不添加,它将在我输入的内容末尾加上.jvns.ca。我不同意这个设计决定,但这不是什么大问题,我只是在最后加一个.。

不需要加:在浏览器中

令人困惑的是,在浏览器中,在域名结尾处加一个.不能正常运行。例如,如果我在浏览器中输入https://twitter.com.,它就会报错。它会返回 404。

我认为这里发生的事情是,它将 HTTPHost标头设置为Host:twitter.com.,而对端的 Web 服务器则期望Host:twitter.com。

同样地,https://jvns.ca.由于某种原因,返回了一个 SSL 错误。

ea935488-6abe-11ed-8abf-dac502259ad0.svg

我认为相对域名在过去是比较常见的

最后一件事:我认为“相对”域名(比如我用grapefruit来指代我家的另一台计算机grapefruit.lan)在过去更常用,因为 DNS 是在大学或其他有大型内部网络的大机构中开发的。

在今天的互联网上,使用“绝对”域名(如example.com)似乎更为普遍。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web服务器
    +关注

    关注

    0

    文章

    137

    浏览量

    24231
  • ASCII
    +关注

    关注

    4

    文章

    169

    浏览量

    34534
  • DNS
    DNS
    +关注

    关注

    0

    文章

    199

    浏览量

    19605

原文标题:为什么有时候域名的末尾有个点?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是域名DNS

    什么是域名DNS为什么要注册DNS呢,申请了DNS后,客户可以自己为域名作解析,或增设子域名.客户申请DNS时,建议客户次性申请两
    发表于 07-19 00:13

    手把手教你域名注册

    一个域名的注册都是独无二的、不可重复的。因此在网络上,域名种相对有限的资源,它的价值将随着注册者的增多而逐步为
    发表于 07-19 16:34

    [推荐]注册中文域名,买得六

    次性注册5年,多年优惠的基础上返款20元/次性注册10年,多年优惠的基础上返款50元/
    发表于 11-18 16:47

    什么是域名DNS

    ;国际域名网www.72ym.com网站上注册域名,般都是dns1.4cun.com和dns2.4cun.com这两DNS,
    发表于 11-22 00:39

    什么是域名

      从技术角度来看,域名Internet上解决IP地址对应的种方法。完整的域名
    发表于 11-22 00:39

    如何绑定域名

    绑定域名也就是“主机头”,简单的说,如果我们希望域名访问虚拟主机,那么我们需要做的事情是:第步:将
    发表于 11-29 14:52

    关于电脑中的域名问题解析!

    6)域名域名(Domain Name),就是用人性化的名字表示主机地址,这比用数字式的IP地址表示主机地址更容易记忆。域名由若干部分组成
    发表于 01-13 15:33

    域名投资市场双十一惊现新宠,ltd域名的火爆让域名服务商慌了手脚

    人性,而是ltd域名短短年时间内火爆了整个域名投资市场,越来越多的ltd域名被挖掘,被珍藏,此次大批ltd米友选择续费5年,10年也是看
    发表于 11-11 04:05

    什么人们需要智能家居?

    智能家居的话题不断,直都是热议的焦点,科技快速发展的时代,为了让生活更加便利,人类以其强大的思维能力,将灵感融入到家居生活当中,原来电影里面的幻想的高科技产品已经悄然融入生活,智能家居集创意
    发表于 02-06 10:53

    关于域名的这些常识你了解吗

    二级域名,以此类推还有三级域名、四级域名等等;  3.如何搭建域名网站呢?
    发表于 01-17 17:39

    域名常见的知识有哪些?

    二级域名,以此类推还有三级域名、四级域名等等;  3.如何搭建域名网站呢?
    发表于 01-17 17:53

    什么人们使用Zynq SoC而不是其他类型的FPGA?

    我想知道为什么人们使用Zynq-SoC而不是其他类型的FPGA?使用这个芯片有什么区别和好处?普通微处理器上我更喜欢Zynq Soc的限制在哪里?亲切的问候,德勒H.
    发表于 04-01 09:24

    什么是域名

    什么是域名? 因为大多数人很难记住组成IP地址的一大串数字,又因为IP地址有时需要更改,所以互联网上所有的服务器还有易读的名称,称为域名。例如,www.howstuffwor
    发表于 08-05 09:02 1413次阅读

    域名,域名是什么意思

    域名,域名是什么意思 域名是Internet网络上的一个服务器或一个网络系统的名字,在全世界,没有重复的域名域名具有唯一性。从技
    发表于 04-03 15:12 3136次阅读

    域名解析是什么意思?

    域名解析是什么意思?域名解析是将人类可读的域名转换成计算机可理解的IP地址的过程。在互联网上,计算机和其他设备使用IP地址来定位和通信。由于人们更容易记住易读的
    的头像 发表于 11-21 17:36 1041次阅读