你把事情复杂化了。
IPv4 地址(和子网掩码)仅以点十进制表示法显示,只是为了使它们对人类更具可读性。在计算机中,它们只是 4 个字节的连续内存(通常存储在例如 a 中):long int
存入电脑:11000000 10101000 00100001 00010110
为人类显示:192. 168. 33. 22
存入电脑:11111111 11111111 11100000 00000000
为人类显示:255. 255. 224. 0
掩码中的1
s 表示标识网络号的位,因此只需使用按位与运算即可提取网络号:
地址 11000000 10101000 00100001 00010110 192.168.33.22
掩码 11111111 11111111 11100000 00000000 255.255.224.0
(和) - - - - - - - - - - - - - - - - - - - - - - - - -
网络 11000000 10101000 00100000 00000000 192.168.32.0
由于引入了CIDR(在此之前地址的类别表示网络/主机边界),主机通常只知道自己网络的掩码,因此无法将任意地址(例如数据报的目标地址)划分为网络和主机号。
那么有什么意义呢?好吧,源主机仍然可以将目标地址和它(源的)自己的网络掩码按位与。虽然该操作的结果不一定会产生有意义的网络号,但当且仅当它们在同一网络上时,它才会匹配源的网络号:
那些不能识别源网络号的地址位,0
在其网络掩码中显然由 s 表示,可以被认为是其主机号——尽管以与上面相同的方式提取它实际上既无意义也无用:即使在与自己网络上的主机通信时,它的完整地址也用于识别,而不仅仅是主机号。
也就是说,作为一个纯粹的学术练习,当然可以使用掩码的补码执行按位与:
地址 11000000 10101000 00100001 00010110 192.168.33.22
~掩码 00000000 00000000 00011111 11111111 0.0.31.255
(和) - - - - - - - - - - - - - - - - - - - - - - - - -
主机 00000000 00000000 00000001 00010110 0.0.1.22
因此,为了解决您的问题:
主机 ID 是公共部分吗?网络 ID 是用于在本地网络中定位计算机的私有部分吗?
整个地址是“公开的”;没有“私人”部分。诸如 ARP(使用完整地址)之类的查找协议用于在本地网络中定位计算机。
如果子网掩码的值小于 255,则必须将 IP 地址中的相应八位字节分解为二进制,以确定数字的哪一部分是主机 ID,哪一部分是网络 ID。结果二进制数总是一分为二吗?
没有什么是“一分为二”的。之所以出现这种情况,是因为点十进制表示法旨在使 IPv4 地址对人类更具可读性(尽管该决定是在 CIDR 发明之前做出的,当时网络编号始终与字节边界对齐,因此从未导致明显的“分裂"的十进制数)。