复习
上周学习了关于TELNET协议的内容,这是一种利用终端进行远程登录主机的协议。而telnet是基于这种协议的具体应用,我们需要学会telnet发送数据包的方式,包括指令和数据,以及他这种协商的方式。
Brief introduction to DNS
DNS就是用来ip地址和域名互相转化
我们之前学过的 gethostbyname 和 gethostbyaddr 本质就是利用DNS服务器进行查询
这是一个应用层的服务
域名(也就是通过ascii string组成的)一般被主机上的应用所用,这种也易于人读
但是网络只认识二进制地址,也就是ip,所以要互相转化
tip一下,还有mac地址和ip地址转化,这个一般存储在本地路由的APB表中
对于DNS的历史
最初的域名和IP的对应关系保存在一个叫做hosts.txt的文件中,每当有一个新的计算机想接入网络,或者某个计算机IP变更都需要来修改这个文件,其他计算机也需要更新才能上网。
随着ip数量不断变多,这样显然是不可行的,所以诞生了DNS
而DNS的数据是存储在分布式的数据库中,全世界都可以访问,至于为什么是分布式的待会说
但其实hosts.txt依然存在,计算机也会优先查询这个文件再使用DNS,我们使用cat可以看到
Elements of the DNS
Domain namespace
其实也就是域名的层次性结构,这样就可以达到唯一性
1. 每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成
2. 标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label)
3. 每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。
4. 级别最低的域名写在左边,级别最高的域名写在右边。
域名服务主要是基于UDP实现的,服务器的端口号为53。
eg :我们熟悉的,www.baidu.com
1. com: 一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等。
2. baidu: 二级域名,指公司名。
3. www: 只是一种习惯用法。
域名系统是一个树状的结构,他们被存储在分布式的数据库中,我们可以理解为一个地理上的区域对应他本地的域名,而本地又从属某个城市,某个国家,一层一层的分布存储。
顶级域名被简称为TLD(top level domain)
有几个顶级域名需要记一下,分为三种:国家,通用,和反向域名(arpa,用于ip获得域名,后面会提)
resource records
还记得上周的TLV吗,最后被填充在DHCP报文中的option字段
rr同样是一种编码形式,会在后面看到被填充到DNS报文中,我们先简单了解一下rr的格式及内容
反正我们需要知道一个域名对应多种资源:ipv4地址,ipv6,邮箱地址等等等等
具体看看例子
Name Service
我们刚刚提过,这个树状的结构,通过一个分布式的数据库来存储数据
域名服务器,就是运行这些数据库的服务器,也就是数据的仓库,域名是分层的,所以域名服务器也有好几种类型,参照下面的比喻理解一下,然后就可以理解DNS查询的过程
我们把DNS服务比喻成我去图书馆查一条信息(比如就是一个单词),同时要代入CS结构,我是client,图书馆就是server
Name resolvers:DNS解析器,解析器可以理解为特定图书馆的图书管理员,它会询问你的要求,然后传递给服务器。DNS本身也是一个服务器,它通过接受client使用的web浏览器发出的查询,发出其他请求,来实现client的dns查询。所以它相当于DNS的client
Root name server:根域名服务器可以理解为图书馆的索引或者导航,告诉你不同类型的书架在哪里,这是ip查询的第一步
TLD name server:顶级域名服务器,可以看作一个特殊的书架,这个书架上是一种类型的书,这是ip查询的下一步
Primary server / Authoritative server:权威服务器,可以看作这就是书架上你要找的那本书,里面就有你需要的信息。权威服务器是IP解析的最后一步,如果成功查询,就会返回给发出初始请求的Name resolver
Secondary server:维护权威服务器数据库的副本,可能就是为了数据安全吧
Caching server:如果一些ip经常查询,就会被缓存下来。但这种查询的结果不是权威的
简单梳理一下DNS查询过程:
1.首先搜索浏览器自身的DNS缓存,如果存在,则域名解析到此完成。
2.如果浏览器自身的缓存里面没有找到对应的条目,那么会尝试读取操作系统的hosts文件看是否存在对应的映射关系,如果存在,则域名解析到此完成。
3.如果本地hosts文件不存在映射关系,则查找本地DNS服务器(ISP服务器,或者自己手动设置的DNS服务器),如果存在,域名到此解析完成。
4.如果本地DNS服务器还没找到的话,它就会向根服务器发出请求,进行递归查询。
后面提了一句话:TLD服务器通常缓存在本地名称服务器中,所以根服务器很少用到
DNS Services
这里主要理解一下递归查询和迭代查询的区别
递归可以看到,local服务器会一直等到结果出来才给你回应
迭代则是踢皮球一样,告你接下来去找谁
当然,DNS也可以反向查询,也就是用资源来查域名,有两种方式:
Inverse query vs. Pointer query
区别就是 Inverse利用的是跟标准查询一样的域,可能需要搜索整个服务集
pointer用的是 IN-ADDR.ARPA domain
DNS Protocols
我们主要看一下DNS的报文结构,后面需要跟前面提到的RR关联一下,这里需要理解到,域名对应很多资源,且一次查询也可以同时查好几个(问好几个问题,所以这里面有answer count等等)
DNS tools
一个是 nslookup 正向查询
一个是 dig 反向查询(pointer)
最后给了一些例子
我们看一下这个,要查询的是BRL.MIL,但是如果发送给了C.ISI.EDU,得到的响应如下
首先他们是不对应的,所以没有answer
但是他给出了权威服务器的记录,可以看到有一个包含EDU的,也就是和我们问的问题相关的权威服务器
在addtition区域将权威服务器的信息给了出来