第八章 域名及网络地址

来源:互联网 发布:人类进化 知乎 编辑:程序博客网 时间:2024/06/05 17:00

《TCP/IP网络编程》 尹圣雨 P118~P136

DNS,Domain Name System,域名系统。

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


域名

提供网络服务的服务器端也是通过IP地址区分的,将容易记、易表述的域名分配并取代IP地址、

     域名是赋予服务器端的虚拟地址,而非实际地址。因此,需要将虚拟地址转化为实际地址。将域名变为IP地址,DNS服务器担此重任,可以向DNS服务器请求转换地址。


所有计算机中都记录着默认DNS服务器地址,通过这个默认DNS服务器得到相应域名的IP地址信息。在浏览器地址栏中输入域名后,浏览器通过默认DNS服务器获取该域名对应的IP地址信息,之后才真正接入该网站。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

求解某个域名对应的IP地址信息,在控制台窗口下输入

ping www.naver.com

这样可以知道某一域名对应的IP地址。ping命令用来验证IP数据报是否到达目的地,但执行过程中会同时经过“域名到IP地址”的转换过程。


求解自己计算机注册的默认DNS服务器地址,可以输入

nslookup

在Linux系统中输入上述命令,会提示进一步输入信息,此时可以输入server得到默认的DNS服务器地址。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


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

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


IP地址和域名的转换

系统运行时,保持IP地址并不容易。特别是依赖ISP服务提供者维护IP地址时,系统相关的各种原因会随时导致IP地址变更。虽然ISP会保证维持原有IP,但程序不能完全依赖于这一点。

程序中有必要使用域名?

IP地址比域名发生变更你的概率要高,所以利用IP地址编写程序并非上策。因为域名一旦注册永久不变,因此利用域名编写程序会好一些。这样每次运行程序时会根据域名获取IP地址,再接入服务器,这样程序就不会依赖于服务器IP地址了。


利用域名获取IP地址

通过传递字符串个数的域名获取IP地址:只要传递域名字符串,就好返回域名对应的IP地址。只是返回时,地址信息装入hostent结构体。关注h_addr_list即可。

#include<nedb.h>struct hostent * gethostbyname(const char * hostname);

成功时返回hostent结构体地址,失败时返回NULL指针

struct hostent{char * h_name;//official name官方域名char **h_aliases;//alias list,可以通过多个域名访问同一主页。同一个IP可以绑定多个域名。int h_addrtype;//host adress type,gethostbyname支持IPv4和IPv6,可以通过此变量获取保存在h_addr_list中的IP地址的地址族信息。int h_length;//address length,若是IPv4地址,因为是4自己,则保存4;若是IPv6,则保存16.char ** h_addr_list;//address list,通过此变量以整数形式保存域名对应的IP地址。用户较多的网站有可能分配多个IP给同一个域名,利用多个服务器   //进行负载均衡};


P132~P134 重点演示了gethostbyname函数的应用,并说明hostent结构体变量的特性。

h_addr_list指向字符串指针数组(由多个字符串地址构成的数组)。但字符串指针数组中的元素实际指向的是(实际保存的是)in_addr结构体变量地址值而非字符串。


为什么是char *而不是in_addr * ?

hostent结构体成员h_addr_list指向的数组类型并不是in_addr结构体的指针数组,而是采用了char指针。hostent结构体并非只为IPv4准备。h_addr_list指向的数组中也可以保存IPv6地址信息。考虑到通用性,声明为char指针类型的数组


利用IP地址获取域名

#include<nedb.h>struct hostent * gethostbyaddr(const char * addr,socklen_t len,int family);
成功时返回hostent结构体变量地址值,是白色返回NULL指针

addr 含有IP地址信息的in_addr结构体指针。为了同时传递IPv4地址之外的其他信息,该变量的类型声明为char指针、

len 向第一个参数传递的地址信息的字节数,IPv4为4,IPv6为6

family 传递地址值信息,IPv4为AF_INET,IPv6为AF_INET6.


P135~P136 重点演示了gethostbyaddr函数的应用






原创粉丝点击