1. 程式人生 > >127.0.0.1、localhost、0.0.0.0的區別

127.0.0.1、localhost、0.0.0.0的區別

  在開發web應用的測試環境中,如果希望同一個區域網的同事通過內網IP訪問自己的應用,則需要把web服務監聽的ip地址改為0.0.0.0。為什麼用127.0.0.1不行,而用0.0.0.0就可以呢?

  flask文件有提到

app.run(host='0.0.0.0')

  會讓作業系統監聽所有的公網ip。在伺服器中,0.0.0.0指的是本機上的所有IPV4地址,如果一個主機有兩個IP地址,192.168.1.1 和 10.1.2.1,並且該主機上的一個服務監聽的地址是0.0.0.0,那麼通過兩個ip地址都能夠訪問該服務。 一般我們自己的機器都會有防火牆之類的東西阻止非此區域網的IP訪問,所以測試時才需要其他人的機器與自己接入同一個區域網。

  而作為IP地址,0.0.0.0意味著“這個網路”或者“這個主機”,全0的IP地址作為網路號指的是當前網路。0.0.0.0允許機器在不知道網路號的情況下訪問自己所在的網路。

  因此,當我們在本地啟動flask應用時,在瀏覽器輸入0.0.0.0:5000,無論有無接入網際網路都可以訪問flask應用,因為機器訪問的是自己所在的網路。

 

  所有127.xx.yy.zz形式的地址保留給迴環測試用,傳送到該地址的資料包並沒有被真正放線上路上,它們如同入境資料包一樣在本地處理。

  而127.0.0.1是一個迴環地址,通過這個地址我們只能訪問發出此次訪問的同一臺主機,目的地址為“127.0.0.1”的資料包不會通過閘道器,因此該資料包不會出現在網路傳輸過程中。如果一個服務監聽127.0.0.1,其實它只監聽本機對此服務的訪問。

 

  localhost是一個別名,預設表示IP地址127.0.0.1,也可以在/etc/hosts中設定為其他IP地址。在終端ping localhost可以看到localhost被解析為127.0.0.1

MacBook-Pro-2:~ zixiluo$ ping localhost

PING localhost (127.0.0.1): 56 data bytes

64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.036 ms

64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.081 ms

64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.084 ms

64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.082 ms