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中。