比如说,可以有超过/24 的子网,例如 192.168.0.0/23 ,这里边的 192.168.1.0 和 192.168.0.255 就可以正常分配给主机了!
但是会有人发现,1.0.0.0 甚至都可以 ping 通!这总不可能在 0.0.0.0/7 的子网吧?所以说,实际上,
就像把大象装冰箱里一样,实际上要以某个 ip 通信,只要三个步骤:
1. 别人把到这个 ip 的数据包发给你
2. 系统能处理这些数据包(例如正确转给上层应用程序)
3. 你能以这个 ip 为源地址把返回的数据包发回去
是不是很简单?
而传统的“在以太网口上配置 ip”无非是把这几个步骤一起完成了而已。 配置正确的 ip 的话,路由器会通过 arp 协议询问对应 ip 的 mac 地址。而你的小鸡持有这个 ip ,在正常情况下,小鸡会回应对应关系。接下来,路由器就会通过 mac 地址,把送到这个 ip 的数据包发给你了。
例如,配置了 192.168.33.2 ,网卡 mac 地址是 aa:bb:cc:11:22:33 ,路由器是 192.168.33.1 。那么,他会问: arp ,谁有 192.168.33.2 ?告诉 192.168.33.1 。 这时候你的小鸡就会说,我我我,我有 192.168.33.2 ,我的 mac 地址是 aa:bb:cc:11:22:33 ! 之后路由器就会把到 192.168.33.2 的数据包发到 aa:bb:cc:11:22:33 了,而交换机会把这个数据包给你的小鸡。 这就完成了第一步。
第二步呢?小鸡上有配置 192.168.33.2 ,那么就把数据包交给上层协议栈。如果,我是说如果,万一没有呢?他会视情况转发(像路由器那样)或者直接丢弃,反正不给上层。 一旦交给应用程序,那么对应的应用程序就可以处理这个数据包。这样就完成了第二步。
至于第三步,既然你配置的 ip 和上游(商家)协商好了,他自然允许你往出发,那么就很轻松发出去了。如果他配置错了,或者你配置错了,数据包丢了,丢了就丢了,结果就是小鸡不通,然后跑去骂商家,商家说上游问题,然后给你点补偿(笑)。
到了这儿思路是不是就开阔了。 传统以太网是通过 arp 来决定数据包去哪里的,那么有没有其他办法呢? 有,当然有,那可太有了。
最简单的,可以静态,就是写死。比如说我就写死 192.168.55.8 到 192.168.33.2 ,那么路由器也会把发往 192.168.55.8 的数据包给你丢过来。至于接下来怎么处理?上面说了,转发,或者丢了,看你心情。
其他的呢?你可能听说过 bgp ,那么 bgp 其实就是宣告路由的方法。打个比方,就是我和邻居说,192.168.66.6 发到我这里哈!那么邻居就会把送到 192.168.66.6 的数据包发给你了。当然,这里省略了很多步骤,但是原理上是这样的。所以,通过 bgp 也可以实现上面的做法。
如果这么玩的话,可就好玩了。比如你可以找你的 100 个朋友,分布在全世界各地,然后到处和邻居喊:1.1.1.1 发到我这里哈!然后都自己处理发到 1.1.1.1 的数据并返回。那么对于其他人来讲,你们都是 1.1.1.1 。恭喜你,明白 anycast 了!(当然,省略了很多细节)
说道这里,感觉这些离自己都有点遥远啊?其实也简单,可以在自己家路由器上绑定个 ip 试试看,例如:ip a a 198.19.253.21/32 dev lo ,然后在这台路由器下面的机器上就可以 ping 通这个 ip 了!神奇吗?快回家试试吧! 当然,其实也不是所有 ip 都可以的。什么 ip 不可以,就交给读者自行思考实验了。
![]() |
1
churchmice 3 天前 ![]() arp 和 bgp/routing table 啥的完全不是一个东西啊
|
![]() |
2
LoliconInside 3 天前
怎么二三层混着说的。。。建议先自己学好了再出来科普
|
3
CloudyKumori 3 天前 ![]() 这是 AI 写的吗
|
4
maybeonly OP @churchmice 当然不是一个东西,但是这里的场景是 arp 引导某个 ip 去某个主机,类似路由的功能。
@CloudyKumori 怎么可能,ai 写不出这种和主流不同的容易挨骂的东西(笑) 这个内容是在正经讲台上面向 100+观众讲过的。 |
5
dsx826 3 天前 via Android
好的我們用 ipv6
|
![]() |
6
goodryb 3 天前
有点东西,但混在一起说了, 标题和开头说结尾是 0 、255 IP 的事情,马上又转到 ARP ,然后又是 route
|
7
kuokuoa 3 天前
不知所云
|
![]() |
8
luoyide2010 3 天前
不建议为了讲解 A 知识点而引入 B 知识点
|
9
dorothyREN 3 天前
这总不可能在 0.0.0.0/7 的子网吧? 为什么不能
|
![]() |
10
likeflower 3 天前
其实很简单,分为两种场景。
IPv4 早期有定义网络号和广播地址,场景 1 )是末端接入网络。 后来公网地址太缺了,场景 2 )互联链路地址调整为/31 ,两端各 1 个,路由器操作系统能认就行。 这个跟 IPv6 /127 是类似的逻辑 |
![]() |
11
wy315700 3 天前
@likeflower
确实浪费 IP 的现象很普遍,找移动申请一个 IP 地址,给的/30 为了给我一个 IP 地址,他们要浪费掉 3 个地址。 |
![]() |
12
ScotGu 3 天前
有些设备真不让你用.0 和.255 的 IP 哪怕是/23 的也不行。
|
13
ShinichiYao 3 天前
电信 pppoe 拨号有得到过 255 结尾的 IP ,但是各种奇怪的问题,一大半网站无法访问
|
![]() |
14
likeflower 3 天前
@wy315700 改为其他掩码(例如/24 )给每个客户的 IP 连续分配也可以,L2 隔离,
但客户要移机可能要改地址,/30 独立网段没有这个问题 |
![]() |
15
TossPig 2 天前
|
16
cqu1980 2 天前
如果子网掩码是 23 的话,是存在的,比如 192.168.0.0/23 ( 255.255.254.0 ),192.168.0.255 和 192.168.1.0 就都是一个合法的 ip 。
|
17
thereone 2 天前
写的很混乱,看的出来很想说为什么能用 0 或者 255 但是几种没有太大关系技术混在一起说了。
真想写可以很简单写出来 1 、在路由器上面接口要使用 0 或者 255 的只能使用/31 的掩码才能使用这两个地址,仅能使用在点对点链路上面,广播或者多路访问使用会导致无法和其他地址通信 2 、在 loopback 口可以使用/32 的掩码来使用 0 或者 255 表示单一主机地址,通过静态路由或者动态路由可以让其它设备学到路由既可访问该地址 3 、在采用 PPPOE 的链路环境下会分配 32 位的主机地址所以也可以使用该 0 或者 255 的地址 4 、在一对一 NAT 环境下也可以使用 0 或者 255 地址 5 、在 CIDR 超网环境下可以使用已包含的 0 和 255 地址,但 cidr 的网络号和广播地址无法使用 所以总结以上的就两大类 1 、点对点的/31 位和点对点的/32 位 2 、CIDR 超网包含的 0 和 255 算是可用地址非网络号和广播地址 |
18
hwdq0012 2 天前
TL;DR
|
19
dcsuibian 2 天前
“1.0.0.0 甚至都可以 ping 通!这总不可能在 0.0.0.0/7 的子网吧”
我感觉这句话读起来有点怪。 你可能想说的是对于 1.0.0.0 这个地址,无论掩码位是多少都不合法: 1 、如果<8 ,那么会把 0.0.0.0/8 也包括进去导致不合法 2 、如果>=8 ,那么掩码无论怎么取 1.0.0.0 也会是某个网段起始地址 所以 APNIC 那边没法划分。(事实上他应该也做了特殊处理) 但是我觉得更准确的说法是你不应该关心别人的网段是怎么划分的。 举个例子,对于 182.255.32.12 这个 IP 来说,如果 IP 地址的持有方将掩码位设为 30 ,那这个地址对他来说是不可用的。因为他是 182.255.32.12/30 这个网段的起始地址。 但是他一眼看上去就很像个可以正常使用的 IP 地址吧。 而且 IP 包的首部并不存在网段信息,只有 IP 信息。所以对于发出的机器来说,他并不判断这个 IP 地址最终在哪个网段(有些特殊的比如换回除外)。 所以对于发出方来说,并不关心也没法关心他最终在哪个网段,有没有可能被用于起始或终止地址。他说是可用的,那就是可用的。 |
![]() |
20
bao3 2 天前
你可
是想表达啥? arp proxy ? |
![]() |
21
ScotGu 2 天前
@ShinichiYao #13 宽带 PPPoE 拨号获取的掩码就是 255.255.255.255 这很正常。
只有互联网专线或者 IDC 才会分配/30 或者更大的地址段。 |
22
Silicon 1 天前
第一句话就在飞叶子了,“可以有超过/24 的子网”这句话意指是有某种规范要求子网不能超过/24 ,但 Class A/B/C/D 这种东西存在的时候,本身就没有 CIDR ,因为 CIDR 就是对应 classless subnet 的。
|