さて、先日の話の中で「レイヤ」を意識することが今のエンジニアには足りない的なことを書きました。

この「レイヤ」についての考え方を書いてみます。

コンピュータ間の通信の世界では、OSI参照モデルという定義が基本となっています。

国際標準化機構(ISO)が制定した異機種間のデータ通信を実現するための7階層の定義。

IT業界に居る方なら一度は耳にしているはずですが、「物理層」「データリンク層」「ネットワーク層」「トランスポート層」「セッション層」[プレゼンテーション層」「アプリケーション層」の7つの階層に分けたモデル。

これをインターネットの基本プロトコルであるTCP/IPモデルにすると「ネットワークインターフェース層」「インターネット層」「トランスポート層」「アプリケーション層」になる。

 

 

インターネットの世界で使われる各種のデータ通信はこのレイヤ毎のプロトコルやレイヤ間のルールに従って実現できています。

 

OSIやTCP/IPの参照モデルは、よく郵便や電話のしくみにたとえられて説明されています。

たとえば私がローマに居るイタリヤ人の友達に手紙を送るとします。
相手は日本語使えないのでイタリヤ語で手紙を書き、国際郵便対応の封筒に入れて、最寄の郵便局に持って行って手続きします。
(断っておきますが、私はイタリヤ人顔していますが実際にはイタリヤ語は使えません。(^▽^;)

郵便局に渡した後は、どういう経路でどんな運搬手段で相手まで届くかはわかりません。
私が守らないといけないのは、相手に通じる「イタリヤ語」で手紙を書くことと、国際郵便を送るルールに従って封書に手紙を入れて最寄の郵便局で手続きして渡すことです。

 

TCP/IPモデルで言うと、アプリケーション層に居る私はイタリヤ語という言語で手紙を書き、国際郵便のプロトコルに従って、トランスポート層の郵便局に渡し、トランスポート層の郵便局がその下のレイヤに居る輸送会社に委託して飛行機や船で運搬するという手順を辿ることになります。
インターネットのデータ通信の世界でも同様です。
HTMLやJAVAという言語を使ってアプリケーション層でWebサーバとPCのブラウザが通信しますが、データはトランスポート層のTCPに渡されTCPパケット⇒インターネット層のIPパケット⇒ネットワークインターフェース層のEthernetフレーム⇒光回線へとなって運ばれていきます。
 

で、専業化されたWebアプリ屋さんはJAVAやHTMLは熟知していても自分の書いたプログラムのデータがどういうふうにPCクライアントーサーバ間で流れていくのか正しく理解できていない人が多いのが現状です。
ところがサーバとPCクライアント間のデータ通信で障害が起こった場合、アプリケーション層から送られたデータは順次下位層を通って物理層のインターフェースまで下りてから相手先の物理層へ届き順次上の層へと再び上がっていきます。(下図)

 

 

このレイヤ間通信の流れ全体を理解できていないと、インターネットを経由したサーバ-PC間での通信全体での障害発生時に迅速に切り分けが出来ません。

 

よく通信疎通の確認に「pingコマンド」を使いますが、このコマンドはいったいどのレイヤで何の疎通確認をしているのか理解できずに使っているアプリケーションエンジニアも多いのではないでしょうか?

 

今、アプリケーションエンジニアに限らず、インターネットを使うことが当たり前となったIT技術者は、このOSIのレイヤを意識できないとシステムとして顧客に的確な提案は出来ないし、設計や検証も出来ないと私は思います。

 

「レイヤを意識する」

 

これが出来るエンジニアを育てたいですねぇ。