電腦網絡中,localhost是一個主機名稱,指當前用於訪問的計算機。localhost一名是爲了環迴目的而保留,它用於通過環迴網絡介面,訪問本機執行的服務。使用環迴介面會繞過任何物理網絡介面硬件。

本地環迴

運用本地環迴機制,便可在主機上運行網絡服務,期間不須安裝實體網絡介面卡,也無須將該服務開放予主機所在網絡。例如,在設置好本地安裝的網站後,可通過http://localhost這一網址,來訪問本地網站。

localhost這個主機名稱一般會解析IPv4本地環回地址127.0.0.1IPv6本地環回地址[::1][1]

名稱解析

IPv4網絡標準將整個127.0.0.0/8地址塊訂為保留地址,供本地環回使用,整個地址塊內有超過1600萬個IP位址。所以,傳送到這些地址(127.0.0.1 到 127.255.255.255)的所有封包都會返回本機。地址127.0.0.1是IPv4環回的常用標準地址,其餘地址並不是所有的作業系統都支援。但是,使用127.0.0.1/8內的不同地址,就可以在本機上設置偵聽相同埠的多個伺服器。IPv6 標準只分配了一個本地環回地址:[::1]。

要將本地主機名localhost解析到一個或多個IP位址,可通過在作業系統的hosts檔案中添加以下代碼實現:

127.0.0.1    localhost
::1          localhost

本地主機名也可以由DNS伺服器解析,但這一主機名的解析請求,應在本地處理,而非傳送到遠端伺服器。

除了對映到環回地址(127.0.0.1 和 ::1)之外,localhost 還可以對映到其他IPv4環回地址,更可以將其他名稱或附加名稱分配給任何迴環地址。不過,在hosts檔案或DNS中為localhost這個主機名設置對映地址時,假如新設置的對映地址並不在原本指定的對映地址範圍內,所作對映不一定會生效,因為應用程式內部可能已對localhost進行對映操作。

域名系統中,localhost被留作頂級域名,最初的目的,是要被留出以避免與用於回送目的的主機名混淆。IETF標準禁止域名註冊商分配localhost名稱。[2]

IETF 標準

名稱 localhost 由 RFC 6761(特殊用途域名)保留,用於環回。[3]該域名在2013年2月達到了建議標準成熟度級別。該標準規定了一些特殊的考慮因素,規範其在域名解析系統中的使用:

  • localhost 的 IPv4 或 IPv6 地址查詢必須始終解析為相應的環回地址,該地址在單獨的標準中指定。
  • 應用可以自行解析環回地址,或者將他們交由本地解析器機制。
  • 當名稱解析器收到 localhost 的地址(A 或 AAAA)查詢時,它應該返回適當的環回地址,以及其他請求的記錄類型的請求響應。不應將本地主機的查詢轉發到快取名稱伺服器。
  • 為了避免使域名系統根伺服器負擔流量,快取名稱伺服器不應請求本地主機的名稱伺服器記錄,也不要向權威名稱伺服器轉發解析。
  • DNS 註冊商不能在頂級域 localhost 中委派域名。
  • 在上述規定的前提下,當權威名稱伺服器收到 'localhost' 查詢請求時,應該適當處理。

IPv4 環回地址由 IETF 特殊用途 IPv4 地址標準(RFC 5735)在 IPv4 地址中保留空間,[4]可以追溯到 1986 年 11 月分配號碼標準(RFC 990)。

相比之下,IETF IPv6 定址體系結構標準(RFC 4291)在IPv6地址空間內保留單個IPv6 環回地址 ::1。 該標準排除了將該地址分配給任何物理介面,以及在任何封包中,將其用作傳送到遠端主機的源地址或目標地址的用途。任何這類被錯誤傳輸的封包都不應該被路由轉發,並且應該被接收它的所有路由器或主機丟棄。

封包處理

任何發往環迴地址的封包,其處理都在 TCP/IP 協定疊的鏈路層中實現的。這些封包不會交由網絡卡(NIC)或者裝置驅動程式處理,既不應在電腦系統以外出現,也不可經路由器轉發。如此一來,電腦上即使沒有實體網絡卡,也可進行軟件測試或者運行本機服務。

環回封包與其他任何通過 TCP/IP 協定棧的封包僅通過定址到的特殊IP位址進行區分。因此,最終接收到的服務將根據指定的目的地進行響應。例如,HTTP服務可以將發往127.0.0.99:80 和 127.0.0.100:80 的封包路由到不同的網絡伺服器,或傳送到返回不同網頁的單一伺服器。為了簡化這種測試,可以將 hosts 檔案組態為為每個地址提供合適的名稱。

具有環回源地址或目標地址的封包,在非環回介面上收到則必須被刪除。這種封包有時被稱為火星包。和其他虛假封包一樣,它們可能是惡意的,它們帶來的問題可以通過 bogon 濾波避免。[5]

特殊情況

MySQL 資料庫上,使用主機名 localhost 與地址 127.0.0.1 和 ::1 是有差異的。[6][7]當在應用程式的客戶端連接器介面中使用 localhost 作為目標時,MySQL 的 API 使用 Unix 域通訊端連接到資料庫,而通過環回介面的 TCP 連接需要直接使用顯式地址。

Android Studio 開發中所使用的模擬器,其網絡環境的本地主機名稱 localhost 地址通常為 10.0.2.2,但其實它本身就是 127.0.0.1 地址。[8]

使用 127.0.0.0/8 網絡地址時,一個值得注意的例外是,它們用在多協定標籤交換(MPLS)跟蹤路由錯誤檢測中,它們的不可路由屬性提供了一種方便的方法來避免向終端使用者傳送錯誤封包。

參見

參考資料

  1. ^ RFC4291: IP Version 6 Addressing Architecture. Section 2.5.3: IETF. [2018-06-25]. (原始內容存檔於2020-05-13). 
  2. ^ RFC2606: Reserved Top Level DNS Names. Section 2: IETF. [2018-06-25]. (原始內容存檔於2020-05-06). 
  3. ^ RFC6761: Special-Use Domain Names. Section 6.3: IETF. [2018-06-25]. (原始內容存檔於2020-11-13). 
  4. ^ RFC5735: Special Use IPv4 Addresses. Section 4: IETF. [2018-06-25]. (原始內容存檔於2020-12-25). 
  5. ^ Raymond, Eric S. The Jargon File. [2018-06-25]. (原始內容存檔於2020-11-06). 
  6. ^ MySQL :: MySQL 5.5 Reference Manual :: 4.1 Overview of MySQL Programs. [2018-06-25]. (原始內容存檔於2019-08-21). 
  7. ^ unix domain sockets vs. internet sockets. [2018-06-25]. (原始內容存檔於2020-11-12). 
  8. ^ Set up Android Emulator networking. [2020-03-09]. (原始內容存檔於2020-11-26).