在開發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