iT邦幫忙

7

你/妳真的了解 127.0.0.1 與 0.0.0.0 的區別?

Wayne 2023-02-09 16:35:5935716 瀏覽
  • 分享至 

  • xImage
  •  


文章出處


前言

對於工程師來說,127.0.0.1 與 0.0.0.0 這兩個IP地址再熟悉不過了,看起來好像就那麼回事,但真正較起真來,這兩個IP地址到底有什麼作用以及到底有什麼不同?貌似誰可以輕鬆回答,但張嘴卻又不知從何說起...(這要是面試,估計真會被這搞砸...)

本文將系統地總結 127.0.0.1 和 0.0.0.0 這兩個IP地址的作用,以及它們之間的區別,希望能為你解惑。


IP地址分類

我們先回顧一下IP地址的基礎知識(本節內容僅作快速概覽,如您對IP地址知識一無所知,建議首先閱讀《IP地址和子網劃分學習筆記之《IP地址詳解》》)。

IP地址表示

IP地址由兩個部分組成,net-idhost-id,即網絡號主機號

  1. net-id: 表示 ip 地址所在的網絡號
  2. host-id: 表示 ip 地址所在網絡中的某個主機號碼

即:

IP-address ::= { <Network-ID>, <Host-ID>}

就像下圖這樣:

IP地址分類

IP地址一共分為5類,即A~E,它們分類的依據是其 net-id 所佔的字節長度以及網絡號前幾位。

大致分類如下:

  1. A類地址: 網絡號佔1個字節,網絡號的第一位固定為0。
  2. B類地址: 網絡號佔2個字節,網絡號的前兩位固定為10。
  3. C類地址: 網絡號佔3個字節,網絡號的前三位固定位110。
  4. D類地址: 前四位是1110,用於多播(multicast),即一對多通信。
  5. E類地址: 前四位是1111,保留為以後使用。

其中,A、B、C 三類地址為單播地址(unicast),用於一對一通信,是最常用的。

IP地址分類看下面這張圖,可能更直接一些:

(上圖來源於《IP地址和子網劃分學習筆記之《IP地址詳解》》)

這裡還有一張IP地址分類的思維導圖

(上圖來源於《IP地址和子網劃分學習筆記之《IP地址詳解》》)

特殊IP地址

特殊IP地址就是用來做一些特殊的事情。RFC1700中定義了以下特殊IP地址:

  1. {0,0}: 網絡號和主機號都全部為0,表示"本網絡上的本主機",只能用作源地址。
  2. {0,host-id}: 本網絡上的某台主機。只能用作源地址。
  3. {-1,-1}: 表示網絡號和主機號的所有位上都是 1(二進制),用於本網絡上的廣播,只能用作目的地址,發到該地址的數據包不能轉發到源地址所在網絡之外。
  4. {net-id,-1}: 直接廣播到指定的網絡上。只能用作目的地址。
  5. {net-id,subnet-id,-1}: 直接廣播到指定網絡的指定子網絡上。只用作目的地址。
  6. {net-id,-1,-1}: 直接廣播到指定網絡的所有子網絡上。只能用作目的地址。
  7. {127,}: 即網絡號為 127 的任意 ip 地址。都是內部主機回環地址(loopback),永遠都不能出現在主機外部的網絡中。

具體來說,特殊的IP地址,主要是以下這些:

  1. 0.0.0.0
    嚴格說來,0.0.0.0 已經不是一個真正意義上的IP地址了。它表示的是這樣一個集合所有不清楚的主機和目的網絡。這裡的"不清楚"是指在本機的路由表裡沒有特定條目指明如何到達。對本機來說,它就是一個"收容所",所有不認識的"三無"人員,一律送進去。如果你在網絡設置中設置了缺省網關,那麼 Windows 系統會自動產生一個目的地址為 0.0.0.0 的缺省路由。

  2. 255.255.255.255
    限制廣播地址。對本機來說,這個地址指本網段內(同一廣播域)的所有主機。如果翻譯成人類的語言,應該是這樣:"這個房間裡的所有人都注意了!",這個地址不能被路由器轉發。

  3. 127.0.0.1
    本機地址,主要用於測試。用漢語表示,就是"我自己"。在 Windows 系統中,這個地址有一個別名"Localhost"。尋址這樣一個地址,是不能把它發到網絡接口的。除非出錯,否則在傳輸介質上永遠不應該出現目的地址為 "127.0.0.1" 的數據包。

  4. 224.0.0.1
    組播地址,注意它和廣播的區別。從 224.0.0.0 到 239.255.255.255 都是這樣的地址。224.0.0.1 特指所有主機,224.0.0.2 特指所有路由器。這樣的地址多用於一些特定的程序以及多媒體程序。如果你的主機開啟了 IRDP (Internet路由發現協議,使用組播功能)功能,那麼你的主機路由表中應該有這樣一條路由。

  5. 169.254.xx
    如果你的主機使用了 DHCP 功能自動獲得一個IP地址,那麼當你的 DHCP 服務器發生故障,或響應時間太長而超出了一個系統規定的時間,Windows 系統會為你分配這樣一個地址。如果你發現你的主機IP地址是一個諸如此類的地址,很不幸,十有八九是你的網絡不能正常運行了。

  6. 10.xxx172.16.xx~172.31.xx192.168.xx
    私有地址,這些地址被大量用於企業內部網絡中。一些寬帶路由器,也往往使用 192.168.1.1 作為缺省地址。私有網絡由於不與外部互連,因而可能使用隨意的IP地址。保留這樣的地址供其使用是為了避免以後接入公網時引起地址混亂。使用私有地址的私有網絡在接入 Internet 時,要使用地址翻譯(NAT),將私有地址翻譯成公用合法地址。在 Internet 上,這類地址是不能出現的。


127.0.0.1 和 0.0.0.0 的區別

基本情況

通過上節基礎知識的回顧,我們回到正題:127.0.0.1 與 0.0.0.0 地址的區別是什麼?

我們先來看下共同點:

  1. 都屬於特殊地址
  2. 都屬於A類地址
  3. 都是IPV4地址。

接下來我們分別看下這兩個地址的具體作用,就一目了解了。

0.0.0.0

說明

IPV4中,0.0.0.0 地址被用於表示一個無效的未知的或者不可用的目標:

  1. 在服務器中: 0.0.0.0 指的是本機上的所有IPV4地址,如果一個主機有兩個IP地址,192.168.1.1 和 10.1.2.1,並且該主機上的一個服務監聽的地址是 0.0.0.0 ,那麼通過兩個ip地址都能夠訪問該服務
  2. 在路由中: 0.0.0.0 表示的是默認路由,即當路由表中沒有找到完全匹配的路由的時候所對應的路由。

用途總結

  1. 當一台主機還沒有被分配一個IP地址的時候,用於表示主機本身(DHCP 分配IP地址的時候)。
  2. 用作默認路由,表示"任意IPV4主機"。
  3. 用來表示目標機器不可用
  4. 用作服務端,表示本機上的任意IPV4地址

127.0.0.1

說明

127.0.0.1 屬於 {127,} 集合中的一個,而所有網絡號為 127 的地址都被稱之為回環地址,所以回環地址不等於 127.0.0.1,它們是包含關係,即回環地址包含 127.0.0.1。

用途總結

  1. 回環測試: 通過使用 ping 127.0.0.1 測試某台機器上的網絡設備,操作系統或者 TCP/IP 實現是否工作正常。
  2. DDos攻擊防禦: 網站收到 DDos 攻擊之後,將域名A記錄到 127.0.0.1,即讓攻擊者自己攻擊自己。
  3. 程序測試: 大部分 Web 容器測試的時候綁定的本機地址。

回環地址的定義

所有發往該類地址的數據包都應該被 loop back。

BONUS:127.0.0.1 與 localhost 的關係

相比 127.0.0.1,localhost 具有更多的意義。

localhost 是個域名,而不是一個ip地址。之所以我們經常把 localhost 與 127.0.0.1 認為是同一個是因為我們使用的大多數電腦上都講 localhost 指向了 127.0.0.1 這個地址。

在 ubuntu 系統中,/etc/hosts 文件中都會有如下內容:

/ets/hosts
127.0.0.1   localhost
127.0.1.1   52im-aliyun
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

上面第一行是幾乎每台電腦上都會有的默認配置。但是 localhost 的意義並不局限於 127.0.0.1。

localhost 是一個域名,用於指代 this computer 或者 this host,可以用它來獲取運行在本機上的網絡服務。

在大多數系統中,localhost 被指向了 IPV4 的 127.0.0.1 和 IPV6 的::1

127.0.0.1    localhost
::1          localhost

所以,在使用的時候要注意確認IPV4還是IPV6。


結語

127.0.0.1 是一個環回地址,並不表示"本機"。

0.0.0.0 才是真正表示"本網絡中的本機"。

在實際應用中:一般我們在服務端綁定端口的時候可以選擇綁定到 0.0.0.0,這樣我的服務訪問方就可以通過我的多個ip地址訪問我的服務。

比如:我有一台服務器,一個外網地址A,一個內網地址B,如果我綁定的端口指定了 0.0.0.0,那麼通過內網地址或外網地址都可以訪問我的應用。

但是如果我只綁定了內網地址,那麼通過外網地址就不能訪問。所以如果綁定 0.0.0.0,也有一定安全隱患,對於只需要內網訪問的服務,可以只綁定內網地址。


作者:Wayne (偉恩)
連結:https://wayne-blog.com/
來源:Wayne's blog | 偉恩的部落格 | 技術博客



圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
waabsla
iT邦新手 5 級 ‧ 2023-02-15 10:07:31

很基礎的東西,寫的很詳細,推一下!
BTW , 127.0.0.1 和 0.0.0.0 我面試時還真的被考過
當然~ 我當時是有寫出來的 XD

Wayne iT邦新手 4 級 ‧ 2023-02-16 11:20:17 檢舉

微不足道的基礎,在面試時顯得格外的重要~
/images/emoticon/emoticon10.gif

0
BingWei
iT邦新手 5 級 ‧ 2024-01-15 19:54:51

應該是 /etc/host(?

Wayne iT邦新手 4 級 ‧ 2024-06-06 10:07:08 檢舉

錯字已更正,感謝提醒!

我要留言

立即登入留言