為什麼我們家裡的IP都是192.168開頭的?
是的,還是我小白,什麼技術博主,老情感博主了。
來講個故事。
資深老舔狗小張今天很興奮,說什麼也要請大家喝奶茶。
因為他說他感覺要跟喜歡的女生小呂修成正果了。
一問為什麼。
他耳朵都紅了,說"我覺得小呂在暗示我了,她說她喜歡看阿凡達,正好我長得就像阿凡達"。
聽了讓人皺眉。
他繼續說:"她說她喜歡射手座,正好我就是"
我撓撓頭:"行,別說了,懂了。她住上海,你也住上海,你兩算是同居了"
他愣了一會,看了看我:"別說這種舔狗話,但你說的其實有點道理,上次她讓我幫她修電腦,我發現她家的ip是192.168.xx.xx,巧了,我家的也是,我懷疑我們住的很近"。
很感動。
我甚至沒敢告訴他,我家裡的IP也是192.168開頭的,我猜你家的也是,就現在正在看這篇文章的你。
但問題就來了,為什麼大家的IP都是192.168.xx.xx?
我們今天來聊下這個話題。
IP地址是什麼
我們知道,網路通訊的本質就是收發資料包。如果說收發資料包就跟收發快遞一樣。那IP地址就類似於快遞上填的收件地址和發件地址一樣,有了它,路由器就可以開始充當快遞員的角色,在這個紛繁複雜的網路世界裡找到該由誰來接收這個資料包。
由於我們現在主流的還是IPV4地址,所以預設以IPV4為例進行講解。
這個IP大概長這樣。
在控制檯裡執行ifconfig
就能看到。inet 邊上的 192.168.31.170
就是IP地址。
$ ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 88:36:3d:33:a0:15
inet6 fe70::1009:aabf:ecc6:2d10%en0 prefixlen 64 secured scopeid 0x6
inet 192.168.31.170 netmask 0xffffff00 broadcast 192.168.31.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
說白了,它就是個特殊點的編號,用於在網際網路中唯一定位到某臺機子。
為了表示這個編號,IP地址一共分為4個位元組
,一個位元組8位
,共32位
,能用來表示最多 2 ^32
,也就是 42億
個地址。
貌似。。。有點少?
2021年全球就有78
億,今年更是突破了80億,也就是說人均一個IP都做不到。
為此好多年前,就在說IPV4
地址不夠用,要耗盡了,於是才會有後來的IPV6
地址。
IPv6用了更多的位元組數,因此能表示更多的地址。大概長這樣。
是不是很陌生,感覺沒怎麼見過。
這就對了。
大家有沒有發現,用了這麼多年,大部分人其實還在用IPV4地址,不是說要耗盡了嗎?
為什麼大家還一直在用IPV4?
先別急,我們再聊個前置知識點,IP地址的分類。
IP地址的分類
為了更好的管理這42億個IP地址的用途。我們應該也在教科書上看過這樣一張IP分類的圖。
大概的意思是32位
地址裡,開頭為0的,那就是A類地址。開頭為10的,就是B類,開頭為110的,就是C類。在這之後,把剩下的位元組數拆成兩段,一段表示網路號,另一短表示主機號。
網路號和主機號的關係,就像是某個停車場編號和停車位號的關係。一個城市裡有很多停車場,而停車場裡又有很多個停車位。每個停車位可以停一輛車,這裡的一輛車,其實就是一臺電腦(主機)。
大型停車場少,但是能停的車巨多,對應A類地址的網路號少,但是主機號多。
小型停車場到處都是,但是一般能停的車就少,對應C類地址的網路號多,但主機號少。
大佬們一開始這麼劃分網路,其實也是為了方便管理,比如A類地址,是給大型組織機構用的,主機地址的位數高達1600w+
,C類地址是給小公司用的,主機號只有200+
。
這個差距就有點懸殊了,放在今天就不太合理了,我開個網咖可能都不止200臺機子對吧,用C類嫌主機號少,用A類又嫌主機號太多。因此現在這套分類機制其實已經很少用了。
取而代之的是方案是,將所謂的ABC分類直接取消,只保留網路號和主機號,並且網路號的位數也不像以前限制的那麼死,用一個斜槓告訴使用者多少位是網路號,其餘的都是主機號。比如 172.20.61.69/20
,那網路號的位數就是20位
,主機號的位數是32-20=12位
,能放4096臺機子,很靈活,很夠用。
這就是,所謂的CIDR,(Classless Inter-Domain Routing, 無類別域間路由)。
IP地址不夠用了嗎?
但不管你怎麼去分類,在32位下的限制下,你就算玩得再花,只要將A類+B類+C類+X類
加起來,IP的個數也最多還是42億個。還是不夠用。
那既然加法不行,那我們就用乘法。
啥意思?
42億
這個數字對大家來說太大了,為了方便理解,我們改成6個IP
。
假設將6拆成4+2
,再讓4乘以2
,那結果8肯定大於6。
一開始,我們理解的網路世界只有一層,每人一個IP,那就只有6個人能上網。
現在我們將網路分成兩層。像下面這樣。
每2個人構成一個"小網路",對外共用一個IP,而內部每個人的IP都不一樣,4個小網路共同構成一個"大網路"。比如小明的電腦是1號網路下的6號機子,小紅的電腦是2號網路下的6號機子。這樣也能做到唯一標識某臺機子的效果。
像上面這樣,每個2人構成的小網路,就叫做區域網,也就是所謂的內網,用的IP(上面的5,6)也叫私有IP或內網IP,而上面提到的"大網路",則是廣域網,用的IP則被稱為公有IP或公網IP。
透過這種方式,原本只能讓6人上網,現在卻能讓8人同時上網。這還是IP只有6個的情況下,如果讓數字變回42億,那就能支援遠大於42億的機子上網了。
按照這樣的思路,回到上面的ABC類IP地址,大佬們也將它們分成了私有和公有兩部分。
在rfc1918
文件中定義了私有地址的範圍。它們不會出現在廣域網中,只會出現在區域網內。
* A類地址:10.0.0.0--10.255.255.255
* B類地址:172.16.0.0--172.31.255.255
* C類地址:192.168.0.0--192.168.255.255
這時候,你再看看C類裡的私有地址範圍,眼熟不?
192.168.xx.xx
就是這網段內的其中一個IP地址。這個範圍裡大概有6w+個主機號,什麼家庭條件能用得完?
於是,就變成了一條街或者一個小區,又或者小區內的幾幢樓共用一個公網IP,而內部就用192.168.xx.xx
這樣的內網IP。所以只要你在家,大機率會發現你的IP地址是C類的192.168.xx.xx
。
但其實只要你想,A類和B類的私有地址也是可以用在區域網裡的。
你到了公司裡執行下ifconfig
命令,你很可能會發現你的區域網IP就不是192.168
開頭的了, 而是172
或者10
開頭的。
這是因為在公司內網裡,需要的IP數量會更大,172和10開頭的IP能表示的主機更多,比如10開頭的能表示1600w+個。
就不說別的,光A類地址,只拿了個10開頭的網路號出來當內網IP就能表示1600w+個主機號,其餘的100+個A類網路號都拿來當公網地址。按上面提到演算法去進行個相乘,公網IP數 * 內網IP數 = (100+ * 1600w) * 1600w
,你也別管我算的對不對,反正就是能提供給好多裝置使用,更別說還有B類和C類的還沒算呢。
而且上面只考慮了一層區域網,其實區域網內還能再分成多層,區域網內再巢狀區域網。就像下面這樣,這樣能用的IP數量就更多了。
所以說,IP地址雖然不多,但其實完全夠用,這也是我們一直以來遲遲不切換成IPv6的原因。夠用,能跑,為什麼要換?
聊到這裡,其實就回答了文章標題的問題,為什麼大家的IP都是192.168開頭的,是因為IPv4地址有限,為了有效利用這些有限的地址,我們可以將網路分為區域網和廣域網,將IP分為了私有IP和公網IP,一個區域網裡的N多臺機器都可以共用一個廣域網IP,從而達到了"做乘法"的效果,大大增加了"可用IP數量",小區裡幾幢樓可以共用一個公網IP,且因為裝置數量不多,一般選用C類的私有地址,也就是192.168
開頭的地址。
但問題就來了,怎麼知道我的公網IP地址是什麼?
查詢自己的公網IP地址
在家裡的電腦上,透過ifconfig
,你能拿到自己的內網IP地址,比如我的就是192.168.31.170
。
$ ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 88:36:3d:33:a0:15
inet6 fe70::1009:aabf:ecc6:2d10%en0 prefixlen 64 secured scopeid 0x6
inet 192.168.31.170 netmask 0xffffff00 broadcast 192.168.31.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
但如果你想知道你的公網IP地址的話,該怎麼做呢?
有個簡單的方法。你直接在baidu
上搜尋"我的IP地址",就能看到你的公網IP地址。
別去ping這個地址,這個圖被我p過。
如果你用的是某裡雲的機子。你也會發現你的機子既有私有IP地址,也有一個公有IP地址。
也是p的圖。
當你去ping上面的私有地址172.21.56.59
時,你會發現它根本ping不通。
$ ping 172.21.56.59
PING 172.21.56.59 (172.21.56.59): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
^C
--- 172.21.56.59 ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss
而公網地址46.101.121.11
卻可以ping通。也就是說,在你家的區域網裡,你只能透過公網IP地址去訪問這臺雲伺服器。
$ ping 46.101.121.11
PING 46.101.121.11 (46.101.121.11): 56 data bytes
64 bytes from 46.101.121.11: icmp_seq=0 ttl=48 time=273.481 ms
64 bytes from 46.101.121.11: icmp_seq=1 ttl=48 time=268.018 ms
64 bytes from 46.101.121.11: icmp_seq=2 ttl=48 time=266.606 ms
^C
--- 46.101.121.11 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
這時候,用過他們家伺服器的人可能會有個疑問。
只要申請一臺雲服務,某裡雲就能給你一個公網IP地址,怎麼做到的?
這。。。這麼富的嗎?
其實,某裡雲跟管IP的機構,租用了的一批IP地址,在你需要的時候,就能付費租給你,不用了也能回收分配給其他人。
而且公網IP地址下面,其實也可以掛多臺雲伺服器,用上文提到的方式,讓多臺雲伺服器共用一個IP。
因此不太需要擔心IP耗盡的問題。
總結
• IP地址就像快遞裡填的送件和收件地址,是一串編號,用於在紛繁複雜的網路世界中標識你的位置。
• IPv4有32位,最多能表示42億個IP地址。為了更好的管理它們,教科書上出現過ABC這樣的分類方式,並且在ABC類裡還分為私有地址和公有地址。但目前流行使用
CIDR
的方式進行分類。• 為了表示更多主機,我們可以將網路分為廣域網和區域網,廣域網用公有地址,區域網使用私有地址。將公有地址乘上私有地址,就能表示遠大於42億臺的機子。
• 家庭網路較小,往往小區內幾幢樓構成一個區域網,這幾幢樓共用一個公有IP地址。區域網內選擇了C類的私有地址,也就是192.168.xx開頭的ip,所以你會發現我們家裡的IP基本上都是
192.168
開頭的。• 在baidu上搜尋"我的IP地址",就能看到你的公網IP地址。
差不多了,給大家留個問題吧
上面提到,網路分為廣域網和區域網,IP分為公有和私有。一個區域網內所有機子對外使用一個公有IP,對內則使用私有IP。
那麼問題來了,公網裡不使用私有IP,一個區域網裡的私有IP想訪問區域網外的公有IP,必然要做個IP轉換,這是在哪裡做的轉換呢?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2931877/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 戈小羊:為什麼我們都是大資料時代的“統計文盲”?大資料
- 為什麼我開啟 testhome 都是移動端的樣式
- 為什麼我們要在遊戲裡“牽手”?遊戲
- 為什麼遊戲裡的閃避都是用“滾”的?遊戲
- 《後來的我們》,為什麼我們會錯過彼此?
- 我們用代理IP可以做什麼?
- 我為什麼反對公開網路IP?
- 我們為什麼需要CDP?
- 為什麼我們需要 VuexVue
- 我們為什麼要用RedisRedis
- 我們為什麼而工作
- 進擊的WebRTC:我們為什麼需要它?Web
- 為什麼HTML5裡面我們不需要DTD?HTML
- 為什麼我們喜歡看別人在遊戲裡受苦遊戲
- JS/TS專案裡的Module都是什麼?JS
- 因果迷境:為什麼我們會問“為什麼”?
- 到底為什麼我們需要 Clickhouse?
- 我們為什麼需要雲原生?
- 我們為什麼需要async/await ?AI
- 我們為什麼設計不出好的遊戲?遊戲
- 為什麼在大型 Angular 應用裡我們需要使用 ngrxAngular
- GC是什麼?為什麼我們要去使用它GC
- 什麼是Web workers?為什麼我們需要他Web
- CLR裡的MethodTable,MethodDescChunk,MethodDesc,FixUpPreCode都是什麼意思
- 我們為什麼要學豐田?
- 為什麼我們不使用GraphQL? - Wundergraph
- 我們為什麼要用英文寫文件?
- 我們為什麼需要 lock 檔案
- [譯] 為什麼我們需要 Web 3.0Web
- 為什麼我們要新增 super(props) ?
- 為什麼springcloud值得我們學習?SpringGCCloud
- React Hooks 可以為我們帶來什麼,及為什麼我覺得React才是前端的未來ReactHook前端
- 我們為什麼會刪除不了叢集的 Namespace?namespace
- 我們的口號是什麼?
- 當我們說開放世界的時候,我們到底在說些什麼?
- Reviewbot 開源 | 為什麼我們要打造自己的程式碼審查服務?View
- [譯] 我們為什麼看好加密收藏品(NFT)的前景加密
- 為什麼我們需要訊息佇列?佇列