localhost

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

localhost是個主機名,在電腦網路中用於代表 127.0.0.1 為表示"本計算機"所保留的位址。它被用於通過本地環回網路介面,訪問本機執行的服務,並且會繞過任何物理網路介面硬體。

本地環迴[編輯]

運用本地環迴機制,便可在主機上運行網路服務,期間不須安裝實體網路介面卡,也無須將該服務開放予主機所在網路。例如,在設定好本地安裝的網站後,可通過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).