域名及网络地址

男娘i 2022-05-25 02:45 329阅读 0赞

域名系统

DNS(Domain Name System :域名系统)是对IP地址和域名进行相互转换的系统,其核心是DNS服务器。

什么是域名

提供网络服务的服务器端也是通过IP地址区分的,但几乎不可能以非常难记的IP地址形式交换服务器端地址信息。

DNS服务器

在浏览器地址栏中输入Naver网站的IP地址222.122.195.5即可浏览Naver网站主页。但我们通常输入网站的域名www.naver.com访问网站。

域名是赋予服务器端的虚拟地址,而非实际地址。因此,需要将虚拟地址转化为实际地址。那如何将域名变为IP地址呢?

DNS服务器担此重任,可以向DNS服务器请求转换地址。所有计算机中都记录着默认DNS服务器地址,就是通过这个默认DNS服务器得到相应域名的IP地址信息。在浏览器地址栏中输入域名后,浏览器通过默认DNS服务器获取该域名对应的IP地址信息,真正接入该网站。

ping www.naver.com

这样可知道某一域名对应的IP地址。

先执行命令nslookup,再输入server可以获得计算机中注册的默认DNS服务器地址。

70

计算机内置的默认DNS服务器并不知道网络上所有域名的IP地址信息。若该DNS服务器无法解析,则会询问其他DNS服务器,并提供给用户

70 1

上图展示了默认DNS服务器无法解析主机询问的域名IP地址时的应答过程:

默认DNS服务器收到无法解析的请求时,向上级DNS服务器询问,通过这种方式逐级向上传递信息,到达顶级DNS服务器——根DNS服务器时,它知道向哪个DNS服务器访问。向下级DNS服务器传递解析请求,得到IP地址后原路返回,最后将解析的IP地址传递到发起请求的主机。

DNS就是这样层次化管理的一种分布式数据库系统。

IP地址和域名之间的转换

为什么使用域名?

IP地址比域名发生变更的概率要高,所以利用IP地址编写程序并非上策。域名注册后可能永久不变,因此利用域名编写程序会好一些。每次运行程序时根据域名获取IP地址,再接入服务器,这样程序就不会依赖于服务器IP地址了。所以说程序中需要IP地址和域名之间的转换函数。

解析器和名字服务器

常见的解析器函数:gethostbyname和gethostbyaddr,前者把主机名映射称IPv4地址,后者执行相反的映射。

下图展示了应用程序,解析器和名字服务器之间的典型关系:

70 2

利用域名获取IP地址

使用以下函数可以通过传递字符串格式的域名获取IP地址。

70 3

此函数传递域名字符串,返回域名对应的IP地址。返回时,地址信息装入hostent结构体。结构体定义如下:

  1. struct hostent
  2. {
  3. char * h_name; //official name
  4. char ** h_aliases; //alias list
  5. int h_addrtype; //host address type
  6. int h_length; //address length
  7. char ** h_addr_list; //address list
  8. }

域名转换只需关注h_addr_list。

结构体各成员:

h_name: 该变量中存放官方域名。官方域名代表某一主页。

h_aliases: 可以通过多个域名访问 同一主页,同一IP可以绑定多个域名。

h_addrtype: gethostbyname函数不仅支持IPv4,也支持IPv6。通过此变量获取保存在h_addr_list的IP地址的地址族信息。

h_length:保存IP地址的长度。IPv4是4字节,IPv6是16字节。

h_addr_list: 最重要的成员,整数形式保存域名对应的IP地址。用户较多的网站有可能分配多个IP给同一域名,利用多个服务器进行负载均衡。

调用gethostbyname函数后返回hostent结构体的变量结构如下图:

70 4

  1. /* gethostbyname函数的应用:并说明hostent结构体变量的特性 */
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<unistd.h>
  6. #include<arpa/inet.h>
  7. #include<netdb.h>
  8. void error_handling(char *message)
  9. {
  10. fputs(message,stderr);
  11. fputc('\n',stderr);
  12. exit(1);
  13. }
  14. int main(int argc,char *argv[])
  15. {
  16. int i;
  17. struct hostent *host;
  18. if (argc != 2)
  19. {
  20. printf("Usage: %s <addr> \n",argv[0]);
  21. exit(1);
  22. }
  23. host = gethostbyname(argv[1]);
  24. if (!host)
  25. error_handling("gethostbyname() error!");
  26. printf("Official name:%s \n",host->h_name); //输出官方域名
  27. for (i = 0; host->h_aliases[i]; i++) //输出除官方域名外的其它域名
  28. printf("Aliases %d: %s \n",i+1,host->h_aliases[i]);
  29. printf("Address type: %s \n",(host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");
  30. for (i = 0; host->h_addr_list[i]; i++) //输出IP地址信息
  31. printf("IP addr %d: %s \n",i+1,inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
  32. return 0;
  33. }

运行结果:

70 5

若只看hostent结构体的定义,结构体成员h_addr_list指向字符串指针数组。但字符串指针数组中的元素实际指向的是in_addr结构体变量地址而非字符串。如图所示:

70 6

利用IP地址获取域名

gethostbyaddr函数利用IP地址获取域相关信息。

70 7

  1. /* gethostbyaddr函数的应用 */
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<unistd.h>
  6. #include<arpa/inet.h>
  7. #include<netdb.h>
  8. void error_handling(char *message)
  9. {
  10. fputs(message,stderr);
  11. fputc('\n',stderr);
  12. exit(1);
  13. }
  14. int main(int argc,char *argv[])
  15. {
  16. int i;
  17. struct hostent *host;
  18. struct sockaddr_in addr;
  19. if (argc != 2)
  20. {
  21. printf("Usage: %s <addr> \n",argv[0]);
  22. exit(1);
  23. }
  24. memset(&addr,0,sizeof(addr));
  25. addr.sin_addr.s_addr = inet_addr(argv[1]);
  26. host = gethostbyaddr((char*)&addr.sin_addr,4,AF_INET);
  27. if (!host)
  28. error_handling("gethostbyaddr() error!");
  29. printf("Official name:%s \n",host->h_name); //输出官方域名
  30. for (i = 0; host->h_aliases[i]; i++)
  31. printf("Aliases %d: %s \n",i+1,host->h_aliases[i]); //输出除官方域名外的其它域名
  32. printf("Address type: %s \n",(host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");
  33. for (i = 0; host->h_addr_list[i]; i++) //输出IP地址信息
  34. printf("IP addr %d: %s \n",i+1,inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
  35. return 0;
  36. }

先通过ping获得Google的IP地址,并利用此信息运行示例:

70 8

70 9

发表评论

表情:
评论列表 (有 0 条评论,329人围观)

还没有评论,来说两句吧...

相关阅读

    相关 域名网络地址

    域名系统 DNS(Domain Name System :域名系统)是对IP地址和域名进行相互转换的系统,其核心是DNS服务器。 什么是域名 提供网络服