写点什么

为什么我们家里的 IP 都是 192.168 开头的?

作者:小小怪下士
  • 2022-12-12
    湖南
  • 本文字数:4164 字

    阅读完需:约 14 分钟

为什么我们家里的 IP 都是 192.168 开头的?

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 转换,这是在哪里做的转换呢?


最后

我在写文章的时候,遇到个小彩蛋。


当我在 baidu 搜索的网页里,用 F12 打开浏览器的控制台时。


看到了下面这么一段话。发现是个招聘推广文,想想也是,会开控制台看的基本上都是跟程序员沾边的人,这波是精准引流了。



招聘宣传语确实写的很好。


看完我 emo 了,当年我毕业的时候,也想着自己有一天能靠着写代码改变世界。


多年以后,我发现,能改变自己,就已经很了不起了。。。

用户头像

还未添加个人签名 2022-09-04 加入

热衷于分享java技术,一起交流学习,探讨技术。 需要Java相关资料的可以+v:xiaoyanya_1

评论

发布
暂无评论
为什么我们家里的IP都是192.168开头的?_Java_小小怪下士_InfoQ写作社区