localhost 與迴路介面(localhost and the loopback interface)
/ localhost -> LOH-kuhl-host /
有時你想寄一封信給自己——寄到你正站著的同一棟建築——而不讓它跑到郵局去。電腦正好有這種東西:一個代表「就是這台機器」的特殊位址,讓一個程式能用完整的網路機制與同一台電腦上的另一個程式交談,卻沒有任何封包碰到真實的網路電纜。那個位址就是 localhost,而承載它的虛擬網路裝置則是迴路介面(loopback interface)。
具體來說,localhost 是一個解析到固定迴路位址的名稱:IPv4 中的 127.0.0.1(任何 127.x.x.x 位址都可以)或 IPv6 中的 ::1。當一個程式連到 127.0.0.1 時,作業系統認出這是機器自己的迴路介面,便在內部把位元組路由過去,從不把它們送上線路。從程式的角度看,它是一條普通的通訊端連線——同樣的 socket()、connect()、send()、recv()——但它快速、對機器私有、且完全不需要網路就能運作。許多服務刻意只綁定到 127.0.0.1,好讓唯有同一台機器上的程式才連得到它們。
為何重要:迴路是你不必第二台電腦就能開發與測試網路程式的方法——在你自己的筆電上同時跑伺服器與客戶端,把客戶端指向 127.0.0.1,你就有了一條真實的連線。它也是一道安全邊界:一個被告知綁定到 127.0.0.1 的資料庫,完全無法從外界連到,只能從本地行程連到。只要記得另一面——因為 localhost 可靠又即時,它能藏起一些(如沒有訊息邊界那種)唯有在真實、較慢的網路上才浮現的錯誤。
在你的筆電上跑一個綁定到連接埠 8080 的伺服器,然後在另一個終端機把客戶端連到 127.0.0.1:8080——兩個程式透過一條真實的通訊端連線交談,卻沒有一個位元組離開機器。把伺服器綁定到 127.0.0.1 而非 0.0.0.0,意味著外部機器完全連不到它。
127.0.0.1 路由回你自己的機器——一條真實、卻從不碰到網路的連線。
綁定到 127.0.0.1 把服務限制在本地行程;綁定到 0.0.0.0 則把它暴露在每個介面上。把兩者搞混是一個真實的安全錯誤——別不小心把敏感服務綁到 0.0.0.0。