1. 程式人生 > >IP、主機名和域名

IP、主機名和域名

在網路通訊中,每個IP可唯一標識一臺主機,在多網絡卡或者路由器等的情況下,每個主機可以有多個IP,通過哪個IP都可以找到該主機;但是IP地址是一個32位的數字,為了便於記憶,我們通常把按每位元組劃分,然後用10進製表示出來,即我們通常說的點分十進位制(在IPV6的中採用的是冒號分十六進位制)。如下圖的網路抓包,可以看到一個我們常見的IP地址:192.168.100.1的實際存在形式用16進位制就是:c0 a8 64 01 ,用二進位制表示就是:

11000000 101010001100100 00000001

備註:

十進位制

十六進位制

二進位制

192

c0

11000000

168

a8

10101000

100

64

1100100

1

1

00000001


可以看到IP地址的可讀性非常差,雖然用點分十進位制表示之後,可讀性有所提升,但是依然難以記憶,尤其是對於數字不敏感的老外,因此他們就想用易讀的單詞來代替這些純數字,於是就誕生了主機名和域名。

在區域網中,每臺主機都有一個主機名,可以使用英文字母或者單片語成的主機名來代替該主機的IP地址(這裡假設主機只有一個網絡卡一個IP),這樣就非常方便記憶,例如我們區域網中有一個主機名為:clsserv202的伺服器,它的IP地址是:11.12.112.202,我們在使用IP地址11.12.112.202的地方使用clsserv202來代替它,例如我們要ping該主機,則可以執行命令:

ping clsserv202

該命令的執行情況如下圖所示:


Ping 主機名

跟ping ip地址是一樣的效果,如下圖:

Ping ip地址

這內部發生了什麼事情呢?

在實際開發過程中,我們通常使用gethostbyname和gethostbyaddr這兩個系統函式,其中gethostbyname表示通過主機名來查詢IP地址,即傳入一個主機名或域名,它就給你返回一個IP地址;gethostbyaddr表示通過IP地址來查詢主機名;

在ping命令的原始碼中可以看到它就呼叫了gethostbyname函式將主機名轉換成IP地址,然後才進行的ping操作。ping.c

Hosts檔案

在linux系統中有個hosts檔案來記錄本機所在區域網中的主機的IP地址和對應的主機名,如下圖所示:


可以看到host檔案由一行行的IP和主機名的對應關係組成,其中每行的開始是一個IP地址,緊接著IP地址(隔著空格)的就是該IP對應的主機名;

如果區域網內的所有主機都想使用域名來代替IP進行通訊,那麼要求該區域網中每個主機上的hosts檔案都要把本區域網中的所有主機的主機名和IP的對應關係都存起來。當局域網內的主機非常多的時候,維護起來就非常麻煩,例如IP有變更的時候就需要挨個把所有的主機的hosts檔案都更新一遍。

那麼有沒有更好的辦法來解決這個問題呢?方法就是通過搭建內網DNS服務來完成主機名和IP的對映;

域名

域名可以認為是主機在公網環境中的標識,在在公網下,對應一個唯一的IP,例如我們訪問百度的主頁:www.baidu.com

主機名和域名的區別

實質上,主機名的含義是機器本身的名字,域名是方面記錄IP地址才做的一種IP對映;通過上述介紹可以看到,二者有共性:都能對應到一個唯一的IP上,從應用場景上可以這麼簡單理解二者的區別:主機名用於區域網中;域名用於公網中。