你面试时被问过"192.168.1.1的二进制是多少"吗?我见过一个五年经验的后端工程师当场愣住——不是不会,是突然忘了那套128-64-32的减法游戏。这篇文章就是来治这个"突然失忆"的。
一个反常识:字节和八位组根本不是一回事
先说个冷知识。你在代码里写的byte,和网络配置里的"octet(八位组)",技术上都是8个比特(bit,比特,即0或1的最小单位)。但用法完全不同。
字节(byte)是存储单位。你硬盘里的文件、内存里的变量,按字节算。
八位组是网络专属术语。IP地址192.168.1.10写成192.168.1.10,不是程序员偷懒,是因为网络协议栈里它真的被切成4个八位组处理。
原文作者强调这个区分,我猜是踩过坑——用存储思维搞网络配置,容易在子网掩码上栽跟头。
为什么每个数字不能超过255?
8个比特能表示多少种状态?2的8次方,256种。从0开始数,正好0到255。
这是硬性天花板。你不可能有IP地址192.168.1.256,就像不可能有13月32号。不是"约定俗成",是数学上装不下。
IPv4地址32位,4个八位组拼起来。IPv6涨到128位,所以写成8组16进制数——不是设计师喜欢冒号,是十进制写出来太长,人类记不住。
盒子法:把192拆成128+64的暴力美学
现在进入实操。原文教的"盒子法",本质是把十进制转二进制变成一道小学减法题。
画8个格子,从左到右填:128、64、32、16、8、4、2、1。
这些数是2的7次方到2的0次方。作者没展开讲幂次,我猜是觉得对目标读者太基础——但如果你是转行的,记住这个规律就行:每个数都是右边那个的两倍。
拿192开刀:
192 ≥ 128?是,填1,余64。
64 ≥ 64?是,填1,余0。
后面全是0。
结果:11000000。
168稍微麻烦点:
168-128=40,第一位1。
40<64,第二位0。
40≥32,第三位1,余8。
8<16,第四位0。
8≥8,第五位1,余0。
后面000。
结果:10101000。
注意到规律了吗?1和0交替出现,像某种二进制心跳。
IP地址的完整二进制长什么样
把四个八位组拼起来:
192 → 11000000
168 → 10101000
1 → 00000001
10 → 00001010
完整版:11000000.10101000.00000001.00001010
32个0和1。这就是路由器眼里你家的IP地址。人类看十进制是为了方便,机器只认这个。
原文作者加了个记忆技巧:大数字在左,小数字在右。翻译一下——盒子法从左往右减,和十进制数位的高低顺序一致。不用死记硬背,符合直觉。
这套知识到底用在哪
不是面试炫技。子网划分(subnetting)时,你要算网络地址和广播地址,得在二进制层面操作。CIDR表示法比如/24,意思是前24位是网络位——也就是前三个八位组固定,最后一个留给主机。
云厂商的安全组配置、K8s的CNI插件调优、甚至抓包分析时的掩码过滤,底层都是这套。不会算,就只能死记硬背"255.255.255.0是C类",出了问题抓瞎。
原文标题叫"VERY IMPORTANT FOUNDATION",全大写加括号,透着一股被坑过的愤怒。我懂——基础不牢,排查网络故障时就像在黑箱子里摸象,全靠猜。
数据收束
8个比特,256种可能,4组拼成32位IPv4,8组扩到128位IPv6。盒子法用128-64-32-16-8-4-2-1这串数字,把二进制转换变成连小学生都能做的减法。192.168.1.10的二进制是11000000.10101000.00000001.00001010,共32位,其中1出现8次,0出现24次。记住这组数字,下次面试或排障时,至少能省下30秒翻笔记的时间。
热门跟贴