【填坑系列01】IP位址计算 (IPv4 适用)

大二修企业资料通讯(BDC)时,对於IP位址的计算一窍不通,上网看教学影片、文章仍然无法学会,後来到图书馆借书时,偶然翻到网路概论的书,才让我学会如何计算XD。

IP 位址是用来干嘛的?

在网路上的所有装置都要有一个独一无二的IP位址,作为传送和接收资料的地址。在现实生活中,IP位址的功用就像是邮件上都会有的收件人地址和寄件人地址,收件人地址让信件可以被正确送达,寄件人地址则让收到信的人可以回信。


(图片来源: https://www.homenethowto.com/basics/ip-addresses/)


IP 位址的表示方式

IP 位址是由 32 bits的二进位数字表示,也就是由32个0或1组成 :

01111111000000000000000000000001

上面那一串数字真的让人雾煞煞,所以我们可以透过下列方式做转换 :

  1. 将 32 bits 的 IP 位址每 8 bits 切成一段
01111111 00000000 00000000 00000001
  1. 将每一段的二进位数字转回十进位,再以.隔开每一段 :
127.0.0.1

这样就能比较容易看懂。


IP 位址的结构

IP 位址可以划分为两个部分 : 网路位址、主机位址

  • 网路位址
    • 识别所属的网路
  • 主机位址
    • 识别所属网路的装置

举例来说,某天拿到192.168.117.x的网段,前面的192.168.117就是用来辨别所属网路的网路位址(24 bits),後面的x则对应到可以分配的主机位址,x的长度总共有8 bits,所以可能的排列组合有256种(2的8次方),换句话说总共有256个主机位址可以分配给256个装置使用。

将这个概念做延伸,不难发现前面的网路位址越短,可以分配的主机位址就会越多,为了满足不同规模的网路需求,又依据网路位址的长度区分出不同的 IP 位址等级。

(实际上的长度划分不一定是这样,这边仅是举例)


IP 位址的等级

当初设计 IP 时,将 IP 位址分成五个等级(Class A、B、C、D、E)

一般常用的是 Class A、B、C 这三种等级的 IP 位址,分别适用在大、中、小型网路,负责管理IP位址的机构,可以依照申请者所需要的网路规模,赋予不同等级的IP位址。

  • Class A
    网路位址为 8 bits,第1个 bit(前导位元)必须是0。
    网路位址从00000000~01111111,总共有128(2的7次方)个可以运用的网路位址(2的7次方)。主机位址为 24 bits,可以运用的位址总数为16777216个(2的24次方)。目前大部分的 Class A 都已经分配给过去有参与 ARPANET(Internet的前身) 实验的政府机关、学术单位等等,所以现在无法取得 Class A 的IP位址。

  • Class B
    网路位址为 16 bits,前2个 bits(前导位元)必须是 10。Class B 的 IP 位址必定介於128.0.0.0~191.255.255.255。主机位址为 16 bits,可以运用的位址总数为65536个(2的16次方)。大部分的 Class B 都被分配给大企业或ISP使用。

  • Class C
    网路位址为 24 bits,前3个 bits(前导位元)必须是 110。Class C 的 IP 位址必定介於192.0.0.0~223.255.255.255。主机位址为 8 bits,可以运用的位址总数为256个(2的8次方)。Class C 通常都被分配给小企业使用。

特殊的IP位址

  • 主机位址全为0
    用来代表这个网路,以 Class C为例,196.67.208.0用来代表该 Class C 网路。
  • 主机位址全为1
    代表网路中的所有位址,主要是用在广播上面。假设有电脑送出目的地为196.67.208.255的封包,则代表对196.67.208.0这个网路的所有装置进行广播(所有装置都会收到封包)。

段落重点整理

从 IP 位址的第一段我们就能看出它所属的 IP 位址等级。例如: 168.0.0.1可以从 168 判断它是一个 Class B 的 IP 位址,IP 位址的前 16 bits 为网路位址,後 16 bits 为主机位址。

  • Class A : 0.0.0.0~127.255.255.255
  • Class B : 128.0.0.0~191.255.255.255
  • Class C : 192.0.0.0~223.255.255.255

子网路

IP 位址等级的切割固然方便,但弹性却略显不足。假设有人拿到 Class B 的 IP 位址,实际上只连接数十台电脑,那这样不是会有很多位址被浪费掉吗?

要解决这个问题可以透过将网路切割成更小的子网路来避免 IP 位址浪费的同时,增加原本3种 IP 位址等级的弹性。而在切割子网路前,务必要先思考需要多少个子网路,以及每个子网路需要连结多少台主机。

切割子网路的原理

简单来说切割子网路就是向 IP位址 中的主机位址借前几个位元作为子网路位址。

假设拿到的 Class B IP 位址是这样 :

借主机位址的前 3 bits 作为子网路位址:

子网路位址与原有的网路位址合计共占 19 bits,可以被视为是一个新的网路位址,用来识别该子网路。原先 16 bits 的网路位址是不可更动的,但子网路位址是可以自由分配的,在范例中从主机位址借用 3 bits,产生了8(2的3次方)个子网路。

范例中,原先 Class B 总共有 65536(2的16次方) 个可分配的主机位址,经过切割後每个子网路(共8个)则有 8192(2的13次方) 个可分配的主机位址,理论上从主机位址借到 15 bits 可以形成 32768 (2的15次方) 个子网路,而每个子网路有2个可分配的主机位址,但不幸的是主机位址不能全为0或1,所以上述的主机位址通通都要扣2,也就是说最多只能从主机位址身上借到前 14 bits。

子网路遮罩

在切割完子网路後,可以发现不论原先是哪一等级的 IP 位址,网路位址都不会再是原来的长度(8、16、24 bits),那要怎麽确认切割後,现在网路位址的长度呢? 答案是我们可以用子网路遮罩来确认借用几 bit 的主机位址。

  • 子网路遮罩的结构
    • 长度为 32 bits 与 IP 位址对应
    • 必须由连续一串的1再和连续一串的0组合而成
    • 可以用十进位表示(和 IP 位址相同)

转成十进位表示 :

11111111 11111111 11111111 00000000 => 255.255.255.0

子网路遮罩一定要与 IP 位址搭配使用,单独存在没有意义。把 IP 位址和子网路遮罩摆在一起看时,子网路遮罩 1 的长度范围对应到的是这组 IP 位址的网路位址,0 的长度范围则对应到这组 IP 位址的主机位址。

以下用图来说明会比较清楚 :

子网路遮罩由21个连续的1和11个连续的0组成,对应到 IP 位址(Class B)代表最前面的 21 bits 是网路位址,剩下的 11 bits 则是主机位址。

另外,也可以将范例的168.95.192.1套用子网路遮罩後简写成168.95.192.1/21/21代表网路位址有 21 bits,同时也是子网路遮罩有21个连续的1的意思。

  • 不进行子网路切割则各等级 IP 位址的子网路遮罩如下 :

以上就大致交代完 IP 位址的基础了,当然还有蛮多东西没有讲,不过就让我用一些应用题目结束这回合吧!


应用问题

以下都是蒐集来的题目 :

  • 某主机的 IP 位址为 192.168.1.134,子网路遮罩为 255.255.255.248,则该主机的"网路位址"为何?

    从第一段的数字192可以看出是 Class C 的 IP 位址,然後将 IP 位址中的最後一个数字134转成二进制并和子网路遮罩比对 :

    可以发现这组 IP 位址落在 10000 这个子网路里面,转成十进位後,此子网路的网路位址为 192.168.1.128。

  • 在 Class C 等级网路中若要分出至少13个子网路,则子网路遮罩为何?

    向主机位址借 4 bits 就可以切出 16(2的四次方) 个子网路,故子网路遮罩为 11111111 11111111 11111111 11110000 (255.255.255.240)。

  • 255.255.252.0 这个子网路遮罩最多可以将 132.114.0.0 这个网路分成几个有效的子网路? 每个子网路最多可以有几台主机?

    由 IP 位址第一个数字132,可以确认它是 Class B 的 IP 位址,经比对之後发现向主机位址借用 6 bits 作为子网路位址,所以最多可分出 64 (2的6次方) 个子网路,每个子网路可以容纳 1024-2 = 1022 (2的10次方减去主机位址全为0或1) 台主机。

之後有空应该会再写其他填坑的文章~~~


<<:  送件电路板的流程分享

>>:  Golang - html template + wkhtmltopdf生成PDF

[Day08 - React Native] 路由,使用 React Native Navigation

React Navigation 在这边使用 Wix/React Native Navigation...

DAY 13 - 时钟怪 (2)

大家好~ 我是五岁~ 今天来继续把昨天未上色的时钟怪完成吧~!! 首先把昨天的成品做些微调 接下来就...

02. Hello x Test x Test Pyramid

很多 web 框架的范例都是 127.0.0.1,今天我们换个哈罗方式。 sail test 两个绿...

第46天-fd-find 代替 find

使用 fd-find 代替 find,效率更好 下载方式 : sudo apt-get instal...

Spring Framework X Kotlin Day 9 Rest Repository

GitHub Repo https://github.com/b2etw/Spring-Kotlin...