はじめに
この実験では、Linux コマンドラインを使用して IP アドレスのサブネット分割とバイナリ変換の必須スキルを習得します。Python のインタラクティブインタープリターを活用することで、コンピューターネットワーキングの基礎となる計算を実践的に体験し、理論的な知識からターミナル環境での実践的な応用へと進みます。
まず、一般的なドット区切り 10 進表記の IP アドレスを 32 ビットのバイナリ形式に変換し、その逆も行います。次に、CIDR サブネットマスクをバイナリおよびドット区切り 10 進表記に変換する方法を説明します。最後に、これらのスキルを応用して、指定された IP アドレスのネットワーク部分とホスト部分を特定し、特定の CIDR ブロック内で利用可能なホスト数とサブネット数を計算します。
Python での IP アドレスとサブネットマスクの変換を実行する
このステップでは、Python のインタラクティブインタープリターを使用して、いくつかの重要なネットワーク変換を実行します。IP アドレスをドット区切り 10 進表記とバイナリ形式の間で変換する方法、および CIDR サブネットマスクを完全なバイナリおよびドット区切り 10 進表記に変換する方法を学びます。これらはすべて、プロセスを効率化するために、単一の連続したセッションで行われます。
IPv4 アドレスは 32 ビットの数値です。人間が読みやすいように、4 つの 8 ビットの数値(オクテットと呼ばれます)をドットで区切って表現します(例:192.168.1.10)。これらのオクテットはそれぞれ 8 ビットのバイナリ数値に変換できます。
まず、ターミナルを開き、Python のインタラクティブインタープリターを起動しましょう。LabEx 環境には Python がプリインストールされています。
python3と入力して Enter キーを押します。python3新しいプロンプト
>>>が表示され、Python インタープリター内に入ったことを示します。Python 3.10.x (...) Type "help", "copyright", "credits" or "license" for more information. >>>
IP アドレスをドット区切り 10 進表記からバイナリに変換する
単一の 10 進数をバイナリ形式に変換する練習をしましょう。Python の組み込み関数
bin()を使用します。たとえば、数値192を変換するには、Python プロンプトで次のように入力します。bin(192)Python は、バイナリ数値であることを示す接頭辞
0bを付けて、バイナリ表現を返します。'0b11000000'192のバイナリ相当は11000000です。次に、これを完全な IP アドレス、たとえば
192.168.1.10に適用しましょう。各オクテット(192、168、1、10)を個別に変換する必要があります。IP アドレッシングにおける重要な規則は、各オクテットが正確に 8 ビットで表現されなければならないということです。バイナリ数値が 8 ビット未満の場合、先頭にゼロを追加してパディングする必要があります。各部分を変換しましょう。
192の場合:bin(192)は'0b11000000'を返します。これはすでに 8 ビットです:11000000。168の場合:bin(168)は'0b10101000'を返します。これも 8 ビットです:10101000。1の場合:bin(1)は'0b1'を返します。これを 8 ビットにパディングする必要があります:00000001。10の場合:bin(10)は'0b1010'を返します。これを 8 ビットにパディングする必要があります:00001010。
これらを組み合わせると、IP アドレス
192.168.1.10の完全な 32 ビットバイナリ表現が得られます。11000000.10101000.00000001.00001010
バイナリ IP アドレスをドット区切り 10 進表記に戻す
今度は逆の操作を行います。バイナリ数値を 10 進数に変換するには、Python の
int()関数を使用します。この関数は 2 つの引数を受け取ることができます。最初の引数は文字列としての数値、2 番目の引数はその数値の基数です。バイナリ(基数 2)から変換するため、常に 2 番目の引数として2を使用します。単一のバイナリオクテット
10101000を 10 進数に変換してみましょう。int('10101000', 2)Python は変換を実行し、10 進数の結果を表示します。
168次に、前のステップの完全な 32 ビットバイナリ IP アドレス
11000000.10101000.00000001.00001010を変換しましょう。各 8 ビットオクテットを 1 つずつ変換する必要があります。- 最初のオクテットを変換します:
int('11000000', 2)は192になります。 - 2 番目のオクテットを変換します:
int('10101000', 2)は168になります。 - 3 番目のオクテットを変換します:
int('00000001', 2)は1になります。 - 4 番目のオクテットを変換します:
int('00001010', 2)は10になります。
これらの結果をドットで組み合わせると、元のドット区切り 10 進 IP アドレス
192.168.1.10が得られます。これにより、両方向の変換が正しいことが確認できます。- 最初のオクテットを変換します:
CIDR サブネットマスクをバイナリおよびドット区切り 10 進表記に変換する
サブネットマスクは、IP アドレスのネットワーク部分とホスト部分を区別する 32 ビットの数値です。CIDR(Classless Inter-Domain Routing)表記は、サブネットマスクを表現するための短縮形です。
たとえば、CIDR 表記 /24 は、32 ビットサブネットマスクの最初の 24 ビットが 1 であり、残りのビットが 0 であることを意味します。
/24サブネットマスクのバイナリおよびドット区切り 10 進表記を決定しましょう。- バイナリ:
/24マスクは、24 個の連続した1の後に32 - 24 = 8個の0が続きます。オクテットに分割すると、次のようになります。11111111.11111111.11111111.00000000
- バイナリ:
次に、このバイナリマスクをドット区切り 10 進表記に変換しましょう。最初のオクテットはすべて
1であり、11111111です。int('11111111', 2)出力は
255になります。最後のオクテットはすべて0であり、00000000です。int('00000000', 2)出力は
0になります。したがって、/24サブネットマスクは、ドット区切り 10 進表記では255.255.255.0です。より複雑な例、たとえば
/26を試してみましょう。- バイナリ:
/26マスクは、26 個の1の後に32 - 26 = 6個の0が続きます。11111111.11111111.11111111.11000000 - 最初の 3 つのオクテットはすべて
1であり、これは255であることがわかっています。最後のオクテット11000000を 10 進数に変換しましょう。
int('11000000', 2)出力は
192になります。したがって、/26サブネットマスクは、ドット区切り 10 進表記では255.255.255.192です。- バイナリ:
変換が完了したら、
exit()と入力して Enter キーを押すことで、Python インタープリターを終了し、通常のターミナルプロンプトに戻ることができます。exit()
これで、ドット区切り 10 進表記とバイナリ IP アドレス、および CIDR サブネットマスク間の双方向変換を習得しました。これは、あらゆるネットワーク専門家にとって不可欠なスキルです。
IP アドレスのネットワーク部とホスト部を特定する
このステップでは、サブネットマスクの知識を応用して、指定された IP アドレスのネットワーク部とホスト部を特定します。サブネットマスクの主な機能は、IP アドレスのどの部分がネットワークを識別し、どの部分がそのネットワーク上の特定のデバイス(ホスト)を識別するかをコンピューターに伝えることです。
これは、ビット単位の論理 AND 演算を通じて実現されます。コンピューターは、IP アドレス(バイナリ形式)とサブネットマスク(バイナリ形式)を取得し、それらの間で AND 演算を実行します。その結果が ネットワークアドレス です。
ビット単位 AND の規則は単純です。
1 AND 1 = 11 AND 0 = 00 AND 1 = 00 AND 0 = 0
基本的に、両方の対応するビットが 1 の場合にのみ結果は 1 になります。
この動作を実際に確認するために、実践的な例を使用しましょう。IP アドレス 192.168.1.74 と /26 のサブネットマスク(255.255.255.192)のネットワークアドレスを決定します。これをインタプリターで手動で行う代わりに、計算を実行するための小さな Python スクリプトを作成します。
まず、
nanoエディタを使用して、プロジェクトディレクトリにnetwork_calc.pyという名前の新しい Python スクリプトファイルを作成します。nano ~/project/network_calc.pynanoエディタ内で、次の Python コードをコピーして貼り付けます。このスクリプトは、IP とマスクを定義し、各オクテットでAND演算を実行し、結果を出力します。## Define the IP address and subnet mask octets ip = [192, 168, 1, 74] mask = [255, 255, 255, 192] ## Calculate the network address using a bitwise AND network_addr = [ip[i] & mask[i] for i in range(4)] ## Format the output strings ip_str = ".".join(map(str, ip)) network_str = ".".join(map(str, network_addr)) print(f"IP Address: {ip_str}") print(f"Subnet Mask: /26 (255.255.255.192)") print(f"Network Address: {network_str}")ファイルを保存し、
Ctrl+O、Enter、そしてCtrl+Xを押してnanoを終了します。次に、ターミナルからスクリプトを実行します。
python3 ~/project/network_calc.py次の出力が表示され、
AND演算の結果が明確に示されます。IP Address: 192.168.1.74 Subnet Mask: /26 (255.255.255.192) Network Address: 192.168.1.64
この出力から、さまざまな部分を特定できます。
- ネットワーク部:
/26マスクは、最初の 26 ビットがネットワーク部であることを示します。計算されたネットワークアドレス(192.168.1.64)は、この特定のネットワークの識別子です。 - ホスト部: 残りの
32 - 26 = 6ビットがホスト部です。これらの 6 ビットは、192.168.1.64ネットワーク内の特定のデバイス(.74)を識別します。
スクリプトを使用してネットワークアドレスを見つけることに成功し、IP アドレスのネットワーク部とホスト部を概念的に区別できるようになりました。
指定された CIDR の利用可能なホスト数とサブネット数を計算する
この最後のステップでは、2 つの重要なサブネット計算を実行する方法を学びます。サブネット内で利用可能なホスト IP アドレスの数を決定すること、および大きなネットワークブロックから作成できるサブネットの数を見つけることです。これらの計算は、ネットワークの計画と設計の基本となります。
主要な数式は次のとおりです。
- 利用可能なホスト数: 数式は
2^n - 2です。ここでnはホストビットの数(サブネットマスクの0の数)です。サブネット内の最初のすべてのアドレス(すべてのホストビットが 0)はネットワークアドレスとして予約され、最後のすべてのアドレス(すべてのホストビットが 1)はブロードキャストアドレスとして予約されるため、2 を減算します。どちらもデバイスに割り当てることはできません。 - サブネット数: これは、大きなネットワーク(例:
/24)をより小さなネットワーク(例:/26)に分割するときに計算されます。数式は2^mです。ここでmは、新しい、より具体的なサブネットマスクを作成するために元のホスト部分から「借りた」ビットの数です。
network_calc.py スクリプトを拡張して、これらの計算を実行しましょう。
まず、
nanoエディタを使用してnetwork_calc.pyファイルを再度開きます。nano ~/project/network_calc.py既存の内容を削除し、次の Python コードに置き換えます。この新しいバージョンは、指定された CIDR プレフィックスに基づいてホスト数とサブネット数の計算に焦点を当てています。
## Define the CIDR prefix and the base network prefix cidr_prefix = 26 base_prefix = 24 ## The original network we are subnetting from (e.g., a /24) ## --- Calculations --- ## 1. Calculate host bits host_bits = 32 - cidr_prefix ## 2. Calculate usable hosts ## The ** operator is for exponentiation (power of) if host_bits > 0: total_hosts = 2**host_bits usable_hosts = total_hosts - 2 else: total_hosts = 1 usable_hosts = 1 ## For /31 and /32, rules are different, but we simplify here ## 3. Calculate subnet bits borrowed subnet_bits = cidr_prefix - base_prefix ## 4. Calculate number of subnets if subnet_bits >= 0: num_subnets = 2**subnet_bits else: num_subnets = "N/A (Prefix is smaller than base)" ## --- Output --- print(f"--- Subnet Calculations for a /{cidr_prefix} Network ---") print(f"Host Bits: {host_bits}") print(f"Total Hosts per Subnet: 2^{host_bits} = {total_hosts}") print(f"Usable Hosts per Subnet: {total_hosts} - 2 = {usable_hosts}") print("") ## Adds a blank line for readability print(f"--- Subnetting from a /{base_prefix} Network ---") print(f"Subnet Bits Borrowed: {subnet_bits}") print(f"Number of Subnets Created: 2^{subnet_bits} = {num_subnets}")ファイルを保存し、
Ctrl+O、Enter、そしてCtrl+Xを押してnanoを終了します。更新されたスクリプトをターミナルから実行します。
python3 ~/project/network_calc.pyスクリプトは計算された値を出力します。
--- Subnet Calculations for a /26 Network --- Host Bits: 6 Total Hosts per Subnet: 2^6 = 64 Usable Hosts per Subnet: 64 - 2 = 62 --- Subnetting from a /24 Network --- Subnet Bits Borrowed: 2 Number of Subnets Created: 2^2 = 4
この出力は、/26 ネットワークの場合、ホストビットが 6 ビットあり、2^6 = 64 の合計アドレスが可能であることを明確に示しています。ネットワークアドレスとブロードキャストアドレスを予約すると、62 の利用可能なホスト が残ります。また、/24 ネットワークから開始した場合、/26 マスクを作成するために 2 ビットを借り、結果として 2^2 = 4 の可能なサブネットが生成されることも示しています。
まとめ
この実験では、Linux ターミナル内で直接、基本的な IP アドレスとサブネット計算を実行する方法を学びました。Python のインタラクティブインタプリタを強力なツールとして活用し、人間が読みやすいドット区切り 10 進数形式の IP アドレスを 32 ビットのバイナリ等価物に変換し、その後元に戻しました。これには、各オクテットを個別に変換し、正しい 8 ビットパディングを確保することが含まれます。また、CIDR サブネットマスク表記を完全なバイナリおよびドット区切り 10 進数形式に変換する練習もしました。
これらの変換スキルを基盤として、それらを不可欠なネットワーク分析タスクに応用しました。サブネットマスクを使用して、IP アドレスのネットワーク部とホスト部を区別する方法を学びました。最後に、指定された CIDR プレフィックスに基づいて、利用可能なホストアドレスの数とネットワークで利用可能なサブネットの総数を決定するために必要な計算を実行し、IP サブネッティングの原則に関する理解を深めました。



