網(wǎng)絡(luò)編程入門如此簡(jiǎn)單(四):一文搞懂localhost和127.0.0.1
Posted on 2024-09-26 10:23 Jack Jiang 閱讀(103) 評(píng)論(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)上逛的時(shí)候看到一個(gè)問(wèn)題,沒(méi)想到大家討論的很熱烈,就是標(biāo)題中這個(gè):

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

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

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

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

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

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

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

它是128位的,用":"分成8段,每個(gè)X是一個(gè)16進(jìn)制數(shù)(取值范圍:0-F),IPv6地址空間相對(duì)于IPv4地址有了極大的擴(kuò)充。比如:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b 就是一個(gè)有效的IPv6地址。(請(qǐng)?jiān)斪x《什么是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ù)實(shí)踐(上篇)
[6] 什么是公網(wǎng)IP和內(nèi)網(wǎng)IP?NAT轉(zhuǎn)換又是什么鬼?
[7] 深入操作系統(tǒng),一文搞懂Socket到底是什么
[8] 面視必備,史上最通俗計(jì)算機(jī)網(wǎng)絡(luò)分層詳解
作者:Jack Jiang (點(diǎn)擊作者姓名進(jìn)入Github)
出處:http://www.52im.net/space-uid-1.html
交流:歡迎加入即時(shí)通訊開發(fā)交流群 215891622
討論:http://www.52im.net/
Jack Jiang同時(shí)是【原創(chuàng)Java
Swing外觀工程BeautyEye】和【輕量級(jí)移動(dòng)端即時(shí)通訊框架MobileIMSDK】的作者,可前往下載交流。
本博文
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處(也可前往 我的52im.net 找到我)。