域名系统
在Linux系统中查询自己计算机中注册的默认DNS服务器地址,可以输入如下命令:
$ nslookup
> server
Default server: 10.117.0.38
Address: 10.117.0.38#53
Default server: 10.117.0.39
Address: 10.117.0.39#53
计算机内置的默认DNS服务器并不知道网络上所有域名的IP地址信息。若该DNS服务器无法解析,则会逐级向上询问上级DNS服务器,顶级DNS服务器(根服务器)知道该向哪个DNS服务器询问。
IP地址和域名之间的转换
#include <netdb.h>
struct hostent * gethostbyname(const char * hostname); // 成功时返回hostent结构体地址,失败时返回NULL
/*
* @params
* addr: 含有IP地址信息的结构体指针。为了兼容不同类型的IP地址,该变量的类型声明为char指针。
* len: 第一个参数传递的地址信息的字节数。IPv4时为4,IPv6时为16。
* family: 传递地址族信息,IPv4时为AF_INET,IPv6时为AF_INET6。
*/
struct hostent * gethostbyaddr(const char * addr, socklen_t, int family); // 成功时返回hostent结构体地址,失败时返回NULL
struct hostent
{
char * h_name; // 官方域名
char ** h_aliases; // 绑定到同一IP地址上的其他域名
int h_addrtype; // 地址类型
int h_length; // IP地址长度(因为v4和v6地址长度不同)
char ** h_addr_list; // 以整数形式保存的地址的列表
}
程序演示:
# gcc gethostbyname.c -o hostname
# ./hostname www.jianshu.com
Official name: www.jianshu.com
Address type: AF_INET
IP addr 1: 47.92.108.93
# gcc gethostbyaddr.c -o hostaddr
# ./hostaddr 64.233.189.104
Official name: tl-in-f104.1e100.net
Address type: AF_INET
IP addr 1: 64.233.189.104
有的域名不支持反向解析,我也是试了几个才成功。
习题
- 下列关于DNS的说法错误的是?
a. 因为DNS存在,故可以用域名替代IP。
b. DNS服务器实际上是路由器,因为路由器根据域名决定数据路径。
c. DNS服务器根据操作系统进行区分,Window下的DNS服务器和Linux下的DNS服务器是不同的。
bc。- 阅读如下对话,并说明东秀的解决方案是否可行。这些都是大家可以在大学计算机实验室验证的内容。
只要计算机与DNS服务器的网络是连通的就可以,如果各自在两个互不连通的内网中就不行。- 在浏览器地址栏输入www.orentec.co.kr,并整理出主页显示过程。假设浏览器访问的默认DNS服务器中没有关于www.orentec.co.kr的IP地址信息。
默认DNS服务器逐级向上请求,直到根DNS服务器。根DNS服务器知道.kr的域名应向DNS服务器1查询,DNS服务器1知道.co.kr的域名应向DNS服务器2查询... 以此类推。如果是递归查询方式,根域名服务区直接将结果返回给默认DNS服务器;如果是迭代查询方式,根域名只告诉默认DNS服务器应向DNS服务器1查询,让默认DNS服务器继续后面的查询。
附录
[1] Github