localhost
在計算機網絡中,localhost是一個主機名稱,指當前用於訪問的計算機。localhost一名是爲了環迴目的而保留,它用於通過環迴網絡接口,訪問本機運行的服務。使用環迴接口會繞過任何物理網絡接口硬件。
本地環迴
[編輯]運用本地環迴機制,便可在主機上運行網絡服務,期間不須安裝實體網絡介面卡,也無須將該服務開放予主機所在網絡。例如,在設置好本地安裝的網站後,可通過http://localhost
這一網址,來訪問本地網站。
localhost這個主機名稱一般會解析為IPv4本地環回地址127.0.0.1
和IPv6本地環回地址[::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)跟蹤路由錯誤檢測中,它們的不可路由屬性提供了一種方便的方法來避免向最終用戶傳送錯誤數據包。
參見
[編輯]參考資料
[編輯]- ^ RFC4291: IP Version 6 Addressing Architecture. Section 2.5.3: IETF. [2018-06-25]. (原始內容存檔於2020-05-13).
- ^ RFC2606: Reserved Top Level DNS Names. Section 2: IETF. [2018-06-25]. (原始內容存檔於2020-05-06).
- ^ RFC6761: Special-Use Domain Names. Section 6.3: IETF. [2018-06-25]. (原始內容存檔於2020-11-13).
- ^ RFC5735: Special Use IPv4 Addresses. Section 4: IETF. [2018-06-25]. (原始內容存檔於2020-12-25).
- ^ Raymond, Eric S. The Jargon File. [2018-06-25]. (原始內容存檔於2020-11-06).
- ^ MySQL :: MySQL 5.5 Reference Manual :: 4.1 Overview of MySQL Programs. [2018-06-25]. (原始內容存檔於2019-08-21).
- ^ unix domain sockets vs. internet sockets. [2018-06-25]. (原始內容存檔於2020-11-12).
- ^ Set up Android Emulator networking. [2020-03-09]. (原始內容存檔於2020-11-26).