ch14: The Domain Name System
DNS
Last updated
DNS
Last updated
DNS提供主机名字和IP地址之间的转换。
对DNS的访问是通过一个地址解析器(resolver)来完成的。
两个函数:gethostbyname()
和gethostbyaddr()
。
resolver值应用层的一部分,而不是操作系统内核的一部分。
DNS使用TCP/IP协议,不过主要是UDP。
BIND:Berkeley Internet Name Domain server.
DNS tree:
zone就是DNS tree的子树。
DNS消息的格式如下:
Identification由client设置,然后server返回,用来匹配请求和响应。
flag格式如下:
QR:请求是0,响应是1;
opcode:标准查询是0,还有反向查询1,和服务器状态请求2;
AA:授权回答(authoritative answer);
TC:可截断的,使用UDP时,最多只有512个字节,超了就会设置这个标志;
RD:期望递归(recursion desired):告诉名字服务器来递归查询;
RA:可用递归(recursion available),如果名字服务器支持递归查询,就在响应中设置这个标志;
rcode:返回码,没有差错是0,名字差错是3。
问题的格式如下:
查询名就是域名,比如:
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。
资源记录RR的格式如下:
domain name的格式和上面的一样。
type和请求中的query type一样。
class也是1。
TTL的值是2天。
Resource data length标识了后面资源数据的长度。
一般来说使用UDP;
如果数据多可能发生截断的话,就使用TCP;
当secondary向primary发起一个zone transfers的时候,就使用TCP。
缓存放在名字服务器中,而不是在resolver中。