18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 建站知识 > 一个域名如果对应多个IP,那么实际访问这个域名会访问到哪个IP哪台服务器呢

一个域名如果对应多个IP,那么实际访问这个域名会访问到哪个IP哪台服务器呢

时间:2023-02-18 20:28:01 | 来源:建站知识

时间:2023-02-18 20:28:01 来源:建站知识

一个域名可以解析出几个IP地址,例如在访问

www.163.com时,抓包得到的DNS响应包中有2个IP地址:221.229.167.47和58.220.39.91,如下图所示。


虽然DNS解析得到了多个IP,但是大多数软件只会使用第一个IP地址,这是什么原因?

TCP/IP网络通信是基于IP地址的,当要访问的服务器地址是域名时,就需要先把域名解析成IP地址。在TCP/IP API中有一个叫gethostbyname的函数,负责把域名解析成IP地址。 函数的原型定义如下,参数name就是要解析的域名。

struct hostent *gethostbyname(const char *name);函数的返回值为一个结构体指针,这个结构体的定义为:

struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses */}#define h_addr h_addr_list[0] /* for backward compatibility */结构体中的h_addr_list是一个数组,用于存放解析出的多个IP地址,但很少有程序员会去考虑多个IP地址的问题,通常直接使用宏h_addr来获取IP地址,也就是第一个IP地址。

一些大型网站或CDN服务商为了实现负载均衡,他们的DNS服务器会动态改变多个IP地址的顺序,使得每个IP地址都有机会成为解析结果中的第一个IP地址。

下面的小程序可以打印出解析

www.163.com得到的第一个IP地址,多次运行这个程序,IP地址是交替的。

#include <stdio.h>#include <netdb.h>#include <arpa/inet.h>#include <netinet/in.h>int main(){ struct hostent *host; struct in_addr h_addr; if ((host = gethostbyname("www.163.com")) != NULL) { h_addr.s_addr = *((unsigned long *) host->h_addr); printf("%s/n", inet_ntoa(h_addr)); } return 0;}

关键词:访问,服务,对应,实际

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭