一個域名可以解析出幾個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就是要解析的域名。
一個域名可以解析出幾個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就是要解析的域名。
函式的返回值為一個結構體指標,這個結構體的定義為:結構體中的h_addr_list是一個數組,用於存放解析出的多個IP地址,但很少有程式設計師會去考慮多個IP地址的問題,通常直接使用宏h_addr來獲取IP地址,也就是第一個IP地址。一些大型網站或CDN服務商為了實現負載均衡,他們的DNS伺服器會動態改變多個IP地址的順序,使得每個IP地址都有機會成為解析結果中的第一個IP地址。下面的小程式可以打印出解析www.163.com得到的第一個IP地址,多次執行這個程式,IP地址是交替的。