> For the complete documentation index, see [llms.txt](https://valineliu.gitbook.io/deuterium-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://valineliu.gitbook.io/deuterium-wiki/reading/cs-jing-dian-shu-ji/tcpv1/ch13-the-domain-name-system.md).

# ch14: The Domain Name System

DNS

![14.DNS](https://tva1.sinaimg.cn/large/007S8ZIlly1ggjv16vmpqj30u0149dqs.jpg)

## Intro

DNS提供主机名字和IP地址之间的转换。

对DNS的访问是通过一个地址解析器（resolver）来完成的。

两个函数：`gethostbyname()`和`gethostbyaddr()`。

resolver值应用层的一部分，而不是操作系统内核的一部分。

DNS使用TCP/IP协议，不过主要是UDP。

BIND：Berkeley Internet Name Domain server.

## DNS Basics

DNS tree:

![](https://tva1.sinaimg.cn/large/007S8ZIlly1ggkhis32vdj313y0u0n0s.jpg)

zone就是DNS tree的子树。

## DNS Message Format

DNS消息的格式如下：

![](https://tva1.sinaimg.cn/large/007S8ZIlly1ggkhl9uth9j30x80pm77h.jpg)

Identification由client设置，然后server返回，用来匹配请求和响应。

flag格式如下：

![](https://tva1.sinaimg.cn/large/007S8ZIlly1ggkhmrdbcxj30q005emxi.jpg)

* QR：请求是0，响应是1；
* opcode：标准查询是0，还有反向查询1，和服务器状态请求2；
* AA：授权回答（authoritative answer）；
* TC：可截断的，使用UDP时，最多只有512个字节，超了就会设置这个标志；
* RD：期望递归（recursion desired）：告诉名字服务器来递归查询；
* RA：可用递归（recursion available），如果名字服务器支持递归查询，就在响应中设置这个标志；
* rcode：返回码，没有差错是0，名字差错是3。

### Question Portion of DNS query Message

问题的格式如下：

![](https://tva1.sinaimg.cn/large/007S8ZIlly1ggkhyjj5vxj30w609m754.jpg)

查询名就是域名，比如：

![](https://tva1.sinaimg.cn/large/007S8ZIlly1ggkhztekwsj30ug08mgmb.jpg)

query type表示查询类型，常用的有下面几种：

| Name  | Numeric Value | Description | type? | query type? |
| ----- | ------------- | ----------- | ----- | ----------- |
| A     | 1             | IP地址        | Y     | Y           |
| NS    | 2             | 名字服务器       | Y     | Y           |
| CNAME | 5             | 规范名称        | Y     | Y           |
| PTR   | 12            | 指针记录        | Y     | Y           |
| HINFO | 13            | 主机信息        | Y     | Y           |

query class是1，表示Internet Address。

### Resource Record Portion of DNS Response Message

资源记录RR的格式如下：

![](https://tva1.sinaimg.cn/large/007S8ZIlly1ggki4m5oxcj30vk0i0dh7.jpg)

domain name的格式和上面的一样。

type和请求中的query type一样。

class也是1。

TTL的值是2天。

Resource data length标识了后面资源数据的长度。

### UDP or TCP

* 一般来说使用UDP；
* 如果数据多可能发生截断的话，就使用TCP；
* 当secondary向primary发起一个zone transfers的时候，就使用TCP。

### Caching

缓存放在名字服务器中，而不是在resolver中。
