【图解HTTP】与 HTTP 关系密切的协议 : DNS协议(服务)原理

负责域名解析的 DNS 服务

  • DNS(Domain Name System)服务是和 HTTP 协议一样位于应用层的协议。它提供域名到 IP 地址之间的解析服务。
  • 计算机既可以被赋予 IP 地址,也可以被赋予主机名和域名。比如:www.baidu.com。
  • 用户通常使用主机名或域名来访问对方的计算机,而不是直接通过 IP地址访问。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。
  • 但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。
  • 为了解决上述的问题,DNS 服务应运而生。DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。
    如图:
    【图解HTTP】与 HTTP 关系密切的协议 : DNS协议(服务)原理_第1张图片

DNS原理

①DNS是应用层协议,client端(一般指浏览器)构建DNS查询请求,依次被传输层,网络层,数据链路层等封装传送到达DNS服务器端,最终client端接收到DNS响应消息
②DNS主要基于UDP运输层协议,这里解释下为什么使用UDP这样的无连接的,尽最大能力交付的不可靠数据连接,而不使用TCP传输控制协议这样的面向连接的可靠数据连接。

一次UDP连接服务器交换可以短到两个包:一个查询包、一个响应包。一次TCP交换则至少包含9个包:三次握手初始化TCP会话、一个查询包、一个响应包以及四次分手的包交换。 考虑到效率原因,TCP连接的开销大得,故采用UDP作为DNS的运输层协议,这也将导致只有13个根域名服务器的结果。

③为什么只有13个根域名服务器?(下面的回答来自知乎)
作者:Avery Lu
链接:https://www.zhihu.com/question/22587247/answer/246541927
说字节长度无法验证,这个是不对的,既然是数字,一定能计算出来个缘由。
Google 了一番,觉得这篇 Blog 讲的最清楚。
Why 13 DNS root servers?
作为翻译搬运工,总结来说是:

  • 12 Header + 5 Question section + 31 Resource record + 15n (Other resource record) + 16n (A record in additional section)
  • 15的组成:第一个 Resource record 要是全场度,nameserver name需要20bytes. 加上前面 root label 之类的信息后是 root-label: 1 byte + ttl: 4 bytes + class: 2 bytes + type: 2 bytes + rdlength: 2 bytes + 20 = 31 bytes.
    之后的 resource record 的 nameserver name 可以被压缩(DNS compression),只需要4bytes. 需要:11 + 4 = 15bytes.
  • 16的组成:Additional section 类似情况,ttl: 4 bytes + class: 2 bytes + type: 2 bytes + rdlength: 2 bytes + address: 4 bytes = 14 bytes. 外加被压缩的 nameserver name 2 bytes. = 16 bytes
  • 最后512bytes 的分配为: 12 + 5 + 31 + 31*n = 512
  • n = 14.96
  • 当初设计的时候,安排了13个,空出了以后字节空间给以后的 feature 使用。

补充

大家把13个根服务器受限于UDP报文 512字节说的很清楚,但对于为何是512字节却没怎么谈论,这里谈谈我的看法。
作者:车小胖
链接:https://www.zhihu.com/question/22587247/answer/243856916
Internet大多数网络接口MTU>512,即使DNS报文 + UDP+ IP= 512+8+20=540,这个大小几乎可以在Internet上畅通无阻,而无需IP分片。

为何IP分片不好?

一个UDP报文如果因为size > MTU,则会被IP层分成两片多片,但是只有一片有端口号,由于其它分片没有端口号,能否通过防火墙则完全看防火墙的脸色,所以对于能否通信成功是一个未知数。
如果防火墙网开一面,不检查端口号,分片可以全部通行,到目的地再组装到一起,IP层提交给UDP/DNS,一点问题没有。但是防火墙的安全功能大打折扣,如何阻止非法的外来攻击包?
如果防火墙严格检查端口号,则没有端口号的分片则统统丢弃,造成通信障碍。
所以选择一个合适的UDP size至关重要,避免分片。
有同学说,对于MTU <512物理接口的DNS如何处理?
这个其实好办,这些只是接入层接口,用于接入终端用户,用户的DNS请求是请求其上一级DNS服务器做递归查询(告诉我最终查询结果),不会直接去根服务器查询DNS,所以这个问题可以迎刃而解。

你可能感兴趣的:(❤读书笔记,------【图解HTTP】)