網(wǎng)絡(luò)編程入門如此簡單(四):一文搞懂localhost和127.0.0.1
Posted on 2024-09-26 10:23 Jack Jiang 閱讀(102) 評論(0) 編輯 收藏本文由螢火架構(gòu)分享,原題“localhost和127.0.0.1的區(qū)別是什么?”,原文鏈接“juejin.cn/post/7321049446443417638”,下文進(jìn)行了排版和內(nèi)容優(yōu)化。
1、引言
繼《你真的了解127.0.0.1和0.0.0.0的區(qū)別?》、《深入操作系統(tǒng),徹底搞懂127.0.0.1本機(jī)網(wǎng)絡(luò)通信》之后,這是整理收錄的第3篇有關(guān)本機(jī)網(wǎng)絡(luò)的網(wǎng)絡(luò)編程基礎(chǔ)文章。以下是正文內(nèi)容。
今天在網(wǎng)上逛的時候看到一個問題,沒想到大家討論的很熱烈,就是標(biāo)題中這個:

前端同學(xué)本地調(diào)試的時候,應(yīng)該沒少和localhost打交道吧,只需要執(zhí)行 npm run 就能在瀏覽器中打開你的頁面窗口,地址欄顯示的就是這個 http://localhost:xxx/index.html。
可能大家只是用,也沒有去想過這個問題。聯(lián)想到我之前合作過的一些開發(fā)同學(xué)對它們倆的區(qū)別也沒什么概念,所以我覺得有必要普及下。

- 移動端IM開發(fā)入門文章:《新手入門一篇就夠:從零開發(fā)移動端IM》
- 開源IM框架源碼:https://github.com/JackJiang2011/MobileIMSDK(備用地址點此)
2、系列文章
本文是該系列文章中的第 4 篇:
《網(wǎng)絡(luò)編程入門如此簡單(一):假如你來設(shè)計網(wǎng)絡(luò),會怎么做?》
《網(wǎng)絡(luò)編程入門如此簡單(二):假如你來設(shè)計TCP協(xié)議,會怎么做?》
《網(wǎng)絡(luò)編程入門如此簡單(三):什么是IPv6?漫畫式圖文,一篇即懂!》
《網(wǎng)絡(luò)編程入門如此簡單(四):一文搞懂localhost和127.0.0.1》(* 本文)
3、localhost是什么呢?

localhost是一個域名,和大家上網(wǎng)使用的域名沒有什么本質(zhì)區(qū)別,就是方便記憶。
只是這個localhost的有效范圍只有本機(jī),看名字也能知道:local就是本地的意思。
張三和李四都可以在各自的機(jī)器上使用localhost,但獲取到的也是各自的頁面內(nèi)容,不會相互打架。
4、從域名到程序
要想真正的認(rèn)清楚localhost,我們還得從用戶是如何通過域名訪問到程序說起。
以訪問百度為例。
1)當(dāng)我們在瀏覽器輸入 baidu.com 之后,瀏覽器首先去DNS中查詢 baidu.com 的IP地址。
為什么需要IP地址呢?打個比方,有個人要寄快遞到你的公司,快遞單上會填寫:公司的通訊地址、公司名稱、收件人等信息,實際運輸時快遞會根據(jù)通信地址進(jìn)行層層轉(zhuǎn)發(fā),最終送到收件人的手中。網(wǎng)絡(luò)通訊也是類似的,其中域名就像公司名稱,IP地址就像通信地址,在網(wǎng)絡(luò)的世界中只有通過IP地址才能找到對應(yīng)的程序。(請詳讀《什么是公網(wǎng)IP和內(nèi)網(wǎng)IP?NAT轉(zhuǎn)換又是什么鬼?》)
DNS就像一個公司黃頁,其中記錄著每個域名對應(yīng)的IP地址,當(dāng)然也有一些域名可能沒做登記,就找不到對應(yīng)的IP地址,還有一些域名可能會對應(yīng)多個IP地址,DNS會按照規(guī)則自動返回一個。我們購買了域名之后,一般域名服務(wù)商會提供一個域名解析的功能,就是把域名和對應(yīng)的IP地址登記到DNS中。(請詳讀《理論聯(lián)系實際,全方位深入理解DNS》)
這里的IP地址從哪里獲取呢?每臺上網(wǎng)的電腦都會有1個IP地址,但是個人電腦的IP地址一般是不行的,個人電腦的IP地址只適合內(nèi)網(wǎng)定位,就像你公司內(nèi)部的第幾棟第幾層,公司內(nèi)部人明白,但是直接發(fā)給別人,別人是找不到你的。
如果你要對外部提供服務(wù),比如百度這種,你就得有公網(wǎng)的IP地址,這個IP地址一般由網(wǎng)絡(luò)服務(wù)運營商提供,比如你們公司使用聯(lián)通上網(wǎng),那就可以讓聯(lián)通給你分配一個公網(wǎng)IP地址,綁定到你們公司的網(wǎng)關(guān)服務(wù)器上,網(wǎng)關(guān)服務(wù)器就像電話總機(jī),公司內(nèi)部的所有網(wǎng)絡(luò)通信都要通過它,然后再在網(wǎng)關(guān)上設(shè)置轉(zhuǎn)發(fā)規(guī)則,將網(wǎng)絡(luò)請求轉(zhuǎn)發(fā)到提供網(wǎng)絡(luò)服務(wù)的機(jī)器上。
2)有了IP地址之后,瀏覽器就會向這個IP地址發(fā)起請求,通過操作系統(tǒng)打包成IP請求包,然后發(fā)送到網(wǎng)絡(luò)上。
網(wǎng)絡(luò)傳輸有一套完整的路由協(xié)議,它會根據(jù)你提供的IP地址,經(jīng)過路由器的層層轉(zhuǎn)發(fā),最終抵達(dá)綁定該IP的計算機(jī)。
3)計算機(jī)上可能部署了多個網(wǎng)絡(luò)應(yīng)用程序,這個請求應(yīng)該發(fā)給哪個程序呢?
這里有一個端口的概念,每個網(wǎng)絡(luò)應(yīng)用程序啟動的時候可以綁定一個或多個端口,不同的網(wǎng)絡(luò)應(yīng)用程序綁定的端口不能重復(fù),再次綁定時會提示端口被占用。
通過在請求中指定端口,就可以將消息發(fā)送到正確的網(wǎng)絡(luò)處理程序。但是我們訪問百度的時候沒有輸入端口啊?這是因為默認(rèn)不輸入就使用80和443端口,http使用80,https使用443。我們在啟動網(wǎng)絡(luò)程序的時候一定要綁定一個端口的,當(dāng)然有些框架會自動選擇一個計算機(jī)上未使用的端口。

5、localhost和127.0.0.1的區(qū)別是什么?

有了前面的知識儲備,我們就可以很輕松的搞懂這個問題了。
localhost是域名,上文已經(jīng)說過了。
127.0.0.1 呢?是IP地址,當(dāng)前機(jī)器的本地IP地址,且只能在本機(jī)使用,你的計算機(jī)不聯(lián)網(wǎng)也可以用這個IP地址,就是為了方便開發(fā)測試網(wǎng)絡(luò)程序的。
我們調(diào)試時啟動的程序就是綁定到這個IP地址的。
這里簡單說下,我們經(jīng)常看到的IP地址一般都是類似 X.X.X.X 的格式,用"."分成四段。其實它是一個32位的二進(jìn)制數(shù),分成四段后,每一段是8位,然后每一段再轉(zhuǎn)換為10進(jìn)制的數(shù)進(jìn)行顯示。
那localhost是怎么解析到127.0.0.1的呢?經(jīng)過DNS了嗎?沒有。每臺計算機(jī)都可以使用localhost和127.0.0.1,這沒辦法讓DNS來做解析。
那就讓每臺計算機(jī)自己解決了。每臺計算機(jī)上都有一個host文件,其中寫死了一些DNS解析規(guī)則,就包括 localhost 到 127.0.0.1 的解析規(guī)則,這是一個約定俗成的規(guī)則。
如果你不想用localhost,那也可以,隨便起個名字,比如 wodehost,也解析到 127.0.0.1 就行了。
甚至你想使用 baidu.com 也完全可以,只是只能自己自嗨,對別人完全沒有影響。
PS:以下兩篇可以深入進(jìn)行閱讀:
6、域名的等級劃分
localhost不太像我們平常使用的域名,比如 www.juejin.cn 、baidu.com、csdn.net, 這里邊的 www、cn、com、net都是什么意思?localhost為什么不需要?
域名其實是分等級的,按照等級可以劃分為頂級域名、二級域名和三級域名...
1)頂級域名(TLD):
頂級域名是域名系統(tǒng)中最高級別的域名。它位于域名的最右邊,通常由幾個字母組成。頂級域名分為兩種類型:通用頂級域名和國家頂級域名。常見的通用頂級域名包括表示工商企業(yè)的.com、表示網(wǎng)絡(luò)提供商的.net、表示非盈利組織的.org等,而國家頂級域名則代表特定的國家或地區(qū),如.cn代表中國、.uk代表英國等。
2)二級域名(SLD):
二級域名是在頂級域名之下的一級域名。它是由注冊人自行選擇和注冊的,可以是個性化的、易于記憶的名稱。例如,juejin.cn 就是二級域名。我們平常能夠申請到的也是這種。目前來說申請 xxx.com、xxx.net、xxx.cn等等域名,其實大家不太關(guān)心其頂級域名com\net\cn代表的含義,看著簡短好記是主要訴求。
3)三級域名(3LD):
三級域名是在二級域名之下的一級域名。它通常用于指向特定的服務(wù)器或子網(wǎng)。例如,在blog.example.com中,blog就是三級域名。www是最常見的三級域名,用于代表網(wǎng)站的主頁或主站點,不過這只是某種流行習(xí)慣,目前很多網(wǎng)站都推薦直接使用二級域名訪問了。
域名級別還可以進(jìn)一步細(xì)分,大家可以看看企業(yè)微信開放平臺這個域名:developer.work.weixin.qq.com,com代表商業(yè),qq代表騰訊,weixin代表微信,work代表企業(yè)微信,developer代表開發(fā)者。這種逐層遞進(jìn)的方式有利于域名的分配管理。
按照上邊的等級定義,我們可以說localhost是一個頂級域名,只不過它是保留的頂級域,其唯一目的是用于訪問當(dāng)前計算機(jī)。

7、多網(wǎng)站共用一個IP和端口
上邊我們說不同的網(wǎng)絡(luò)程序不能使用相同的端口,其實是有辦法突破的。
以前個人博客比較火的時候,大家都喜歡買個虛擬主機(jī),然后部署個開源的博客程序,抒發(fā)一下自己的感情。為了掙錢,虛擬主機(jī)的服務(wù)商會在一臺計算機(jī)上分配N多個虛擬主機(jī),大家使用各自的域名和默認(rèn)的80端口進(jìn)行訪問,也都相安無事。這是怎么做到的呢?
如果你有使用Nginx、Apache或者IIS等Web服務(wù)器的相關(guān)經(jīng)驗,你可能會接觸到主機(jī)頭這個概念。主機(jī)頭其實就是一個域名,通過設(shè)置主機(jī)頭,我們的程序就可以共用1個網(wǎng)絡(luò)端口。
首先在Nginx等Web程序中部署網(wǎng)站時,我們會進(jìn)行一些配置,此時在主機(jī)頭中寫入網(wǎng)站要使用的域名。
然后Nginx等Web服務(wù)器啟動的時候,會把80端口占為己有。
然后當(dāng)某個網(wǎng)站的請求到達(dá)Nginx的80端口時,它會根據(jù)請求中攜帶的域名找到配置了對應(yīng)主機(jī)頭的網(wǎng)絡(luò)程序。
然后再轉(zhuǎn)發(fā)到這個網(wǎng)絡(luò)程序,如果網(wǎng)絡(luò)程序還沒有啟動,Nginx會把它拉起來。
8、私有IP地址
除了127.0.0.1,其實還有很多私有IP地址,比如常見的 192.168.x.x。
這些私有IP地址大部分都是為了在局域網(wǎng)內(nèi)使用而預(yù)留的,因為給每臺計算機(jī)都分配一個獨立的IP不太夠用,所以只要局域網(wǎng)內(nèi)不沖突,大家就可勁的用吧。你公司可以用 192.168.1.1,我公司也可以用192.168.1.1。
但是如果你要訪問我,就得通過公網(wǎng)IP進(jìn)行轉(zhuǎn)發(fā)。
大家常用的IPv4私有IP地址段分為三類:
- 1)A類:從10.0.0.0至10.255.255.255;
- 2)B類:從172.16.0.0至172.31.255.255;
- 3)C類:從192.168.0.0至192.168.255.255。
這些私有IP地址僅供局域網(wǎng)內(nèi)部使用,不能在公網(wǎng)上使用。
除了上述三個私有的IPv4地址段外,還有一些保留的IPv4地址段:
1)用于本地回環(huán)測試的127.0.0.0至127.255.255.255地址段,其中就包括題目中的127.0.0.1,如果你喜歡也可以給自己分配一個127.0.0.2的IP地址,效果和127.0.0.1一樣。
2)用于局域網(wǎng)內(nèi)部的169.254.0.0至169.254.255.255地址段,這個很少接觸到,如果你的電腦連局域網(wǎng)都上不去,可能會看到這個IP地址,它是臨時分配的一個局域網(wǎng)地址。
這些地址段也都不能在公網(wǎng)上使用。
近年來,還有一個現(xiàn)象,就是你家里或者公司里上網(wǎng)時,光貓或者路由器對外的IPv4地址也不是公網(wǎng)IP了,這時候獲得的可能是一個類似 100.64.x.x 的地址,這是因為隨著寬帶的普及,運營商手里的公網(wǎng)IP也不夠了,所以運營商又加了一層局域網(wǎng),而100.64.0.0 這個網(wǎng)段是專門分給運營商做局域網(wǎng)用的。
如果你使用阿里云等公有云,一些云產(chǎn)品的IP地址也可能是這個,這是為了將客戶的私有網(wǎng)段和公有云廠商的私有網(wǎng)段進(jìn)行有效的區(qū)分。
其實還有一些不常見的專用IPv4地址段,完整的IP地址段定義可以看這里:www.iana.org/assignments…

9、IPv6
你可能也聽說過IPv6,因為IPv4可分配的地址太少了,不夠用,使用IPv6甚至可以為地球上的每一粒沙子分配一個IP。只是喊了很多年,大家還是喜歡用IPv4,這里邊原因很多,這里就不多談了。
IPv6地址類似于:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX。

它是128位的,用":"分成8段,每個X是一個16進(jìn)制數(shù)(取值范圍:0-F),IPv6地址空間相對于IPv4地址有了極大的擴(kuò)充。比如:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b 就是一個有效的IPv6地址。(請詳讀《什么是IPv6?漫畫式圖文,一篇即懂!》)
10、參考資料
[1] 你真的了解127.0.0.1和0.0.0.0的區(qū)別?
[2] 深入操作系統(tǒng),徹底搞懂127.0.0.1本機(jī)網(wǎng)絡(luò)通信
[4] 一文讀懂什么是IPv6
[5] IPv6技術(shù)詳解:基本概念、應(yīng)用現(xiàn)狀、技術(shù)實踐(上篇)
[6] 什么是公網(wǎng)IP和內(nèi)網(wǎng)IP?NAT轉(zhuǎn)換又是什么鬼?
[7] 深入操作系統(tǒng),一文搞懂Socket到底是什么
作者:Jack Jiang (點擊作者姓名進(jìn)入Github)
出處:http://www.52im.net/space-uid-1.html
交流:歡迎加入即時通訊開發(fā)交流群 215891622
討論:http://www.52im.net/
Jack Jiang同時是【原創(chuàng)Java
Swing外觀工程BeautyEye】和【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
本博文
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處(也可前往 我的52im.net 找到我)。