ネットワーク #1 - OSIモデル

Last Edited: 9/12/2024

このブログ記事ではOSIモデルについて紹介します。

DevOps

開発者やDevOpsプロフェッショナルとして理解すべき最も基本的な概念の1つは、コンピュータがネットワークを介してどのように通信するかです。 この知識は、日常的に使用される多くのアプリケーションやサービス(ウェブページやアプリケーションへのアクセス、デジタル動画や音楽のダウンロード、 プリンタへの接続など)を支える基盤となります。

OSIモデル

今日使用されているすべてのネットワークの理論的な枠組みは、オープンシステム相互接続(OSI)モデルに基づいています。これは、 7つの層で構成されています:アプリケーション層、プレゼンテーション層、セッション層、トランスポート層、ネットワーク層、 データリンク層、物理層です。それぞれの役割を理解するために、プライベートホームネットワークを例にとって、携帯電話でノートパソコン上で 動作しているウェブアプリケーションにアクセスしたい場合を見てみましょう。

OSI Model

携帯電話がリクエストを送信するとき、そのリクエストは7層全てを上から下へ、つまり第7層から第1層に向かって通過し加工されます。 これにより、リクエストが徐々にフォーマットされ、受信者がより迅速に分析できるようになります。 (注:ここで説明する各層の説明は、詳細を高度に抽象化しています。)

第7層:アプリケーション層

ウェブ開発に慣れている方は、URIへのHTTPリクエストを行った経験があるかもしれません。これがアプリケーション層の役割です。 携帯電話は、IP(インターネットプロトコル)アドレス、ポート、およびリクエストの送信に必要なその他の情報を添付します。 IPアドレスはネットワークノードの可変アドレスを指定し、ポートはコンピュータ上で実行されている特定のサービスの接続ポイントを指定します。

第6層&第5層:プレゼンテーション層&セッション層

プレゼンテーション層は、オプションでリクエスト情報を暗号化し、傍受から保護します。暗号化を行うかどうかは、 アプリケーション層で使用されるプロトコルの種類によります。暗号化が行われた後、セッション層はリクエストにセッション情報を添付し、 複数のリクエストとレスポンスを整理します。

第4層:トランスポート層

この層は、リクエストを複数の扱いやすいデータセグメントに分割し、各セグメントに様々な情報、特にポート情報を添付します。 送信元ポート(リクエストを送信している携帯電話のポート)は先頭に、ターゲットポートは末尾に添付され、リクエストがターゲットで検証され、 正しい送信元ポートに返信されることを保証します。

第3層:ネットワーク層

この層では、必要に応じてセグメントをさらに複数のデータパケットに分割し、各パケットの先頭に携帯電話のIPアドレスを、 末尾にターゲットコンピュータのIPアドレスを添付します。これにより、受信者がリクエストが正しく自分に送信されたかどうかを確認できるようになります。

第2層:データリンク層

データリンク層は、データパケットを受け取り、各パケットの先頭と末尾に携帯電話とターゲットコンピュータのMACアドレスを添付します。 MACアドレスは、コンピュータに埋め込まれたネットワーク用チップの変更不可能なハードウェアアドレスです。

第1層:物理層

最後に、データパケットは0と1のビット信号に変換され、特定の帯域幅で電気信号または無線波を介して(イーサネットまたはWiFiで)送信されます。 一般的にイーサネットがWiFiより安全とされている理由は、無線波が物理的に接続されたケーブル経由で送信される電気信号よりも傍受されやすいからです。

なぜこのプロセスが必要なのか?

携帯電話とコンピュータの間での単純な通信に、なぜこれほど多くのステップが必要なのかと疑問に思うかもしれません。タスクを分割し、 このようにデータを階層的にラップする理由は、受信者がデータを効率的に分析できるようにするためです。例えばWiFi経由でリクエスト信号を送信すると、 近くにいるすべてのデバイスが信号を受信し、それを分析し始めます。

まず、バイナリデータがパケットに変換され、末尾のMACアドレスがチェックされます。それが自分のMACアドレスでない場合、そのデータをすぐに破棄できます。 それが一致した場合のみ、さらに分析を進め、IPアドレスが一致するかどうかを確認します。このプロセスは、 リクエストが自分と自分が運営する特定のサービスに向けられていることを確認するまで続きます。この「分割統治する」アプローチは、 コンピュータサイエンス全般でよく見られるパターンです。

(注:無関係なリクエストを破棄するかどうかは、受信者次第です。Wiresharkのようなネットワークプロトコルアナライザーは、 傍受されたデータを破棄せずに分析を続け、ターゲット受信者が誰であるかに関係なくすべてのトラフィックを解析します。)

IPアドレス

パブリックIPアドレスとプライベートIPアドレス

IPアドレスには、パブリックIPアドレスとプライベートIPアドレスの2種類があります。パブリックIPアドレスは、 ホームネットワークの外部に公開されている一意のアドレスで、GoogleやYouTubeのような外部サーバーとの通信を可能にします。 これらのサービスのIPアドレスを特定し、リクエストを送信する方法については、今後の記事で説明します。

一方、プライベートIPアドレスは、同じプライベートネットワーク内のコンピュータのアドレスで、 通常はルーターが特定の範囲内(例:10.0.0.0から10.255.255.255まで)で割り当てます。 この分離により、セキュリティリスクが軽減され、複数のデバイスが1つのパブリックIPアドレスを共有してインターネットにアクセスすることができます。

IPv4とIPv6

異なるネットワーク間で同じプライベートアドレスが存在することは可能ですが、ルーター間の混乱を避けるために、 パブリックアドレスはグローバルに一意でなければなりません。1990年代に作られたIPv4は、 32ビットのアドレス(例:10.255.255.255)を使用しており、約40億の一意のアドレスが利用可能でした。 しかし、インターネットの急速な拡大により、利用可能なIPv4アドレスの数が不十分になっていきました。

この問題を解決するために導入されたのがIPv6で、128ビットのアドレス(例:2293:dfd8:0da5:c165:94c2:3898:8de5:5a03)を使用しており、 約340澗(非常に膨大な数)の一意のアドレスを提供します。IPv6は膨大なアドレス数を提供するだけでなく、多くの利点もあります。 これについては今後の記事で詳しく解説します。

MACアドレス

アドレス解決プロトコル(ARP)

データリンク層では、MACアドレスを添付しますが、IPアドレスのように簡単に把握したり入手できるわけではありません。 では、ターゲットの受信者のMACアドレスをどのように取得するのでしょうか?それは**アドレス解決プロトコル(ARP)**を使用して、 IPアドレスを元にMACアドレスを取得します。送信者がネットワーク層からデータリンク層に移行する際、 ターゲットのIPアドレスを持つデバイスが誰かを尋ねるリクエストをネットワーク全体にブロードキャストします。 ターゲットが同じネットワーク内にいる場合は、そのデバイスが自分のMACアドレスを返信します。 ターゲットがネットワーク外にいる場合は、ルーターが自分のMACアドレスを返信します。

その後、送信者はMACアドレスを添付し、物理層を介してリクエストを送信します。このプロセスを高速化するために、 IPアドレスとMACアドレスのペアは一時的にキャッシュ(簡単に保存)されます。

MACアドレスが必要な理由

「MACアドレスとプライベートIPアドレスの両方がなぜ必要なのか?」と疑問に思うかもしれません。 すでにデバイスを特定するためのプライベートIPアドレスがあるのに、なぜARPでMACアドレスを取得する必要があるのでしょうか? その答えは、Googleのようなプライベートネットワーク外のサービスにリクエストを送信する例を考えることで見えてきます。

まず、宛先ルーターのパブリックIPアドレスを特定し(このプロセスの詳細は今後の記事で説明します)、それをネットワーク層で添付し、 ARPを使用してMACアドレスを取得します。Googleがプライベートネットワークの外にあるため、ルーターは自分のMACアドレスを返答します。 次に、このMACアドレスをリクエストに添付し、データリンク層で送信し、物理層を介してバイナリデータを送信します。

ルーターがリクエストを受信すると、送信元のMACアドレスとプライベートIPアドレスを自分のMACアドレスとパブリックIPアドレスに置き換えます。 そして、宛先IPアドレスとルーティングアルゴリズムを使用して、宛先ルーターに到達する方法を判断します。ルーティングアルゴリズムに従って、 次のルーターを特定し、ARPを使用してそのルーターのMACアドレスを取得します。次に、宛先MACアドレスを次のルーターのMACアドレスに書き換え、 宛先IPアドレスは変更しないままにします。

宛先ルーターに到達するまでに何台のルーターを経由しても(ルーティングアルゴリズムはIPアドレスを使用して決定されます)、 宛先IPアドレスを変更しないままMACアドレスを置き換えながらプロセスが繰り返し、最終的な宛先にたどり着くことができます。 簡単に言えば、IPアドレスは最終的な宛先を特定するために使用され、MACアドレスは直近の宛先を特定するために使用されるというわけです。

では、同じプライベートネットワーク内のコンピュータ間で直接通信を行う場合はどうでしょうか?この場合、最終的な宛先が直近の宛先でもあるため、 厳密にはこのプロセスを経る必要はありません。しかし、プロセスは一貫性を保つため(外部と内部の通信を同じように行うため)に依然として行われます (少なくとも、これが私が見つけた最も良い説明です)。

結論

この記事では、OSIモデルについて説明し、IPアドレスとMACアドレスの基本について紹介しました。これらの概念は、 多くの略語や新しい考え方が含まれているため、やや圧倒的に感じるかもしれません。時間をかけて復習し、 他のリソースも参照して深く理解することをお勧めします。次回の記事では、ネットワークの基本についてさらに掘り下げていきます。

リソース