本文由螢火架構分享,原題“localhost和127.0.0.1的區別是什么?”,原文鏈接“juejin.cn/post/7321049446443417638”,下文進行了排版和內容優化。
1、引言
繼《你真的了解127.0.0.1和0.0.0.0的區別?》、《深入操作系統,徹底搞懂127.0.0.1本機網絡通信》之后,這是整理收錄的第3篇有關本機網絡的網絡編程基礎文章。以下是正文內容。
今天在網上逛的時候看到一個問題,沒想到大家討論的很熱烈,就是標題中這個:
前端同學本地調試的時候,應該沒少和localhost打交道吧,只需要執行 npm run 就能在瀏覽器中打開你的頁面窗口,地址欄顯示的就是這個 http://localhost:xxx/index.html。
可能大家只是用,也沒有去想過這個問題。聯想到我之前合作過的一些開發同學對它們倆的區別也沒什么概念,所以我覺得有必要普及下。
2、系列文章
本文是該系列文章中的第 4 篇:
《網絡編程入門如此簡單(一):假如你來設計網絡,會怎么做?》
《網絡編程入門如此簡單(二):假如你來設計TCP協議,會怎么做?》
《網絡編程入門如此簡單(三):什么是IPv6?漫畫式圖文,一篇即懂!》
《網絡編程入門如此簡單(四):一文搞懂localhost和127.0.0.1》(* 本文)
3、localhost是什么呢?
localhost是一個域名,和大家上網使用的域名沒有什么本質區別,就是方便記憶。
只是這個localhost的有效范圍只有本機,看名字也能知道:local就是本地的意思。
張三和李四都可以在各自的機器上使用localhost,但獲取到的也是各自的頁面內容,不會相互打架。
4、從域名到程序
要想真正的認清楚localhost,我們還得從用戶是如何通過域名訪問到程序說起。
以訪問百度為例。
1)當我們在瀏覽器輸入 baidu.com 之后,瀏覽器首先去DNS中查詢 baidu.com 的IP地址。
為什么需要IP地址呢?打個比方,有個人要寄快遞到你的公司,快遞單上會填寫:公司的通訊地址、公司名稱、收件人等信息,實際運輸時快遞會根據通信地址進行層層轉發,最終送到收件人的手中。網絡通訊也是類似的,其中域名就像公司名稱,IP地址就像通信地址,在網絡的世界中只有通過IP地址才能找到對應的程序。(請詳讀《什么是公網IP和內網IP?NAT轉換又是什么鬼?》)
DNS就像一個公司黃頁,其中記錄著每個域名對應的IP地址,當然也有一些域名可能沒做登記,就找不到對應的IP地址,還有一些域名可能會對應多個IP地址,DNS會按照規則自動返回一個。我們購買了域名之后,一般域名服務商會提供一個域名解析的功能,就是把域名和對應的IP地址登記到DNS中。(請詳讀《理論聯系實際,全方位深入理解DNS》)
這里的IP地址從哪里獲取呢?每臺上網的電腦都會有1個IP地址,但是個人電腦的IP地址一般是不行的,個人電腦的IP地址只適合內網定位,就像你公司內部的第幾棟第幾層,公司內部人明白,但是直接發給別人,別人是找不到你的。
如果你要對外部提供服務,比如百度這種,你就得有公網的IP地址,這個IP地址一般由網絡服務運營商提供,比如你們公司使用聯通上網,那就可以讓聯通給你分配一個公網IP地址,綁定到你們公司的網關服務器上,網關服務器就像電話總機,公司內部的所有網絡通信都要通過它,然后再在網關上設置轉發規則,將網絡請求轉發到提供網絡服務的機器上。
2)有了IP地址之后,瀏覽器就會向這個IP地址發起請求,通過操作系統打包成IP請求包,然后發送到網絡上。
網絡傳輸有一套完整的路由協議,它會根據你提供的IP地址,經過路由器的層層轉發,最終抵達綁定該IP的計算機。
3)計算機上可能部署了多個網絡應用程序,這個請求應該發給哪個程序呢?
這里有一個端口的概念,每個網絡應用程序啟動的時候可以綁定一個或多個端口,不同的網絡應用程序綁定的端口不能重復,再次綁定時會提示端口被占用。
通過在請求中指定端口,就可以將消息發送到正確的網絡處理程序。但是我們訪問百度的時候沒有輸入端口啊?這是因為默認不輸入就使用80和443端口,http使用80,https使用443。我們在啟動網絡程序的時候一定要綁定一個端口的,當然有些框架會自動選擇一個計算機上未使用的端口。
5、localhost和127.0.0.1的區別是什么?
有了前面的知識儲備,我們就可以很輕松的搞懂這個問題了。
localhost是域名,上文已經說過了。
127.0.0.1 呢?是IP地址,當前機器的本地IP地址,且只能在本機使用,你的計算機不聯網也可以用這個IP地址,就是為了方便開發測試網絡程序的。
我們調試時啟動的程序就是綁定到這個IP地址的。
這里簡單說下,我們經常看到的IP地址一般都是類似 X.X.X.X 的格式,用"."分成四段。其實它是一個32位的二進制數,分成四段后,每一段是8位,然后每一段再轉換為10進制的數進行顯示。
那localhost是怎么解析到127.0.0.1的呢?經過DNS了嗎?沒有。每臺計算機都可以使用localhost和127.0.0.1,這沒辦法讓DNS來做解析。
那就讓每臺計算機自己解決了。每臺計算機上都有一個host文件,其中寫死了一些DNS解析規則,就包括 localhost 到 127.0.0.1 的解析規則,這是一個約定俗成的規則。
如果你不想用localhost,那也可以,隨便起個名字,比如 wodehost,也解析到 127.0.0.1 就行了。
甚至你想使用 baidu.com 也完全可以,只是只能自己自嗨,對別人完全沒有影響。
PS:以下兩篇可以深入進行閱讀:
- 你真的了解127.0.0.1和0.0.0.0的區別?
- 深入操作系統,徹底搞懂127.0.0.1本機網絡通信
6、域名的等級劃分
localhost不太像我們平常使用的域名,比如 www.juejin.cn 、baidu.com、csdn.net, 這里邊的 www、cn、com、net都是什么意思?localhost為什么不需要?
域名其實是分等級的,按照等級可以劃分為頂級域名、二級域名和三級域名...
1)頂級域名(TLD):
頂級域名是域名系統中最高級別的域名。它位于域名的最右邊,通常由幾個字母組成。頂級域名分為兩種類型:通用頂級域名和國家頂級域名。常見的通用頂級域名包括表示工商企業的.com、表示網絡提供商的.net、表示非盈利組織的.org等,而國家頂級域名則代表特定的國家或地區,如.cn代表中國、.uk代表英國等。
2)二級域名(SLD):
二級域名是在頂級域名之下的一級域名。它是由注冊人自行選擇和注冊的,可以是個性化的、易于記憶的名稱。例如,juejin.cn 就是二級域名。我們平常能夠申請到的也是這種。目前來說申請 xxx.com、xxx.net、xxx.cn等等域名,其實大家不太關心其頂級域名com\net\cn代表的含義,看著簡短好記是主要訴求。
3)三級域名(3LD):
三級域名是在二級域名之下的一級域名。它通常用于指向特定的服務器或子網。例如,在blog.example.com中,blog就是三級域名。www是最常見的三級域名,用于代表網站的主頁或主站點,不過這只是某種流行習慣,目前很多網站都推薦直接使用二級域名訪問了。
域名級別還可以進一步細分,大家可以看看企業微信開放平臺這個域名:developer.work.weixin.qq.com,com代表商業,qq代表騰訊,weixin代表微信,work代表企業微信,developer代表開發者。這種逐層遞進的方式有利于域名的分配管理。
按照上邊的等級定義,我們可以說localhost是一個頂級域名,只不過它是保留的頂級域,其唯一目的是用于訪問當前計算機。
7、多網站共用一個IP和端口
上邊我們說不同的網絡程序不能使用相同的端口,其實是有辦法突破的。
以前個人博客比較火的時候,大家都喜歡買個虛擬主機,然后部署個開源的博客程序,抒發一下自己的感情。為了掙錢,虛擬主機的服務商會在一臺計算機上分配N多個虛擬主機,大家使用各自的域名和默認的80端口進行訪問,也都相安無事。這是怎么做到的呢?
如果你有使用Nginx、Apache或者IIS等Web服務器的相關經驗,你可能會接觸到主機頭這個概念。主機頭其實就是一個域名,通過設置主機頭,我們的程序就可以共用1個網絡端口。
首先在Nginx等Web程序中部署網站時,我們會進行一些配置,此時在主機頭中寫入網站要使用的域名。
然后Nginx等Web服務器啟動的時候,會把80端口占為己有。
然后當某個網站的請求到達Nginx的80端口時,它會根據請求中攜帶的域名找到配置了對應主機頭的網絡程序。
然后再轉發到這個網絡程序,如果網絡程序還沒有啟動,Nginx會把它拉起來。
8、私有IP地址
除了127.0.0.1,其實還有很多私有IP地址,比如常見的 192.168.x.x。
這些私有IP地址大部分都是為了在局域網內使用而預留的,因為給每臺計算機都分配一個獨立的IP不太夠用,所以只要局域網內不沖突,大家就可勁的用吧。你公司可以用 192.168.1.1,我公司也可以用192.168.1.1。
但是如果你要訪問我,就得通過公網IP進行轉發。
大家常用的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地址僅供局域網內部使用,不能在公網上使用。
除了上述三個私有的IPv4地址段外,還有一些保留的IPv4地址段:
1)用于本地回環測試的127.0.0.0至127.255.255.255地址段,其中就包括題目中的127.0.0.1,如果你喜歡也可以給自己分配一個127.0.0.2的IP地址,效果和127.0.0.1一樣。
2)用于局域網內部的169.254.0.0至169.254.255.255地址段,這個很少接觸到,如果你的電腦連局域網都上不去,可能會看到這個IP地址,它是臨時分配的一個局域網地址。
這些地址段也都不能在公網上使用。
近年來,還有一個現象,就是你家里或者公司里上網時,光貓或者路由器對外的IPv4地址也不是公網IP了,這時候獲得的可能是一個類似 100.64.x.x 的地址,這是因為隨著寬帶的普及,運營商手里的公網IP也不夠了,所以運營商又加了一層局域網,而100.64.0.0 這個網段是專門分給運營商做局域網用的。
如果你使用阿里云等公有云,一些云產品的IP地址也可能是這個,這是為了將客戶的私有網段和公有云廠商的私有網段進行有效的區分。
其實還有一些不常見的專用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進制數(取值范圍:0-F),IPv6地址空間相對于IPv4地址有了極大的擴充。比如:2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b 就是一個有效的IPv6地址。(請詳讀《什么是IPv6?漫畫式圖文,一篇即懂!》)
10、參考資料
[1] 你真的了解127.0.0.1和0.0.0.0的區別?
[2] 深入操作系統,徹底搞懂127.0.0.1本機網絡通信
[3] 什么是IPv6?漫畫式圖文,一篇即懂!
[4] 一文讀懂什么是IPv6
[5] IPv6技術詳解:基本概念、應用現狀、技術實踐(上篇)
[6] 什么是公網IP和內網IP?NAT轉換又是什么鬼?
[7] 深入操作系統,一文搞懂Socket到底是什么
[8] 面視必備,史上最通俗計算機網絡分層詳解
[9] 通俗講解,有了IP地址,為何還要用MAC地址?
[10] 理論聯系實際,全方位深入理解DNS
(本文已同步發布于:http://www.52im.net/thread-4702-1-1.html)