レイヤーという思考の道具(ネットワークレイヤーの紹介)

2019年3月26日火曜日

システム開発 閑話 思考具

t f B! P L


ITシステムの基礎知識を解説(IT素人さん向け)リンクリストに戻る


コンピュータの世界には便利な物の考え方がいくつかある。

複雑なソフトウェアを作り、アップデートを繰り返しても品質に悪影響をもたらさない為に「モジュール分割」をする。

(この記事は非ITエンジニア向けに書いております。技術者ではなくシステム発注者を中心としたIT素人さん向けの記事です)

「モジュール分割」とは

「モジュール分割」とは、簡単に言えば機能や役割ごとに部品のようにソフトウェアの部位を分割する設計手法のことだ。

IT機器やソフトウェアを構築するにあたって部品と部品、モジュールとモジュールの接合部はほとんど全て標準規格化されている。

モジュールの接合部のことをインターフェイスと呼ぶのだが、このインターフェイスを標準規格化して全世界で共有することにより、モジュールの中身を改造したり他社製品に入れ替えても、それ以外のモジュール(部品など)を変更することなく全体を稼働させることができる。

ソフトウェア開発はやろうと思えばモジュールを分割することなく、一体型のソフトウェアを作ることもできる。
昔はそのようなソフトウェアも多かった。
標準規格自体も少なかったせいでもある。
しかし、このようなソフトウェアの中身は正多角形の対角線のように、「全ての部位」が「全ての部位」と直接繋がり、どこか一部を変更すると、そこと繋がる「全ての部位」を修正しなければならなくなる。
大規模で複雑化するほど変更の影響範囲が指数関数的に増加するので、現実的な時間とコストで修正できなくなってしまう。

そこで機能ごとにモジュールを分割しモジュールとモジュールのインターフェイスをできる限り単純な規格(疎結合)に定め、変更の影響をモジュールの中に閉じ込めてしまうことにより、全体への影響が及ばないようにする。

これが「モジュール分割」の考え方である。

モジュール分割的なモノの考え方には様々な手法や規格が存在する。

プログラムの内部の設計開発手法として「オブジェクト指向」というものがあり、それをある程度標準化したものに「デザインパターン」というものがある。
プログラムを部品に分割して変更への柔軟性を持たせる方法論でもある。

複雑なシステムをできるだけ単純で単機能なソフトウェアである「サービス」に分割し、互いに単純なインターフェイスで繋がり(疎結合)、変更改造を容易にする「SOA(サービス指向アーキテクチャ)」という設計思想と、その延長である「MSA(マイクロサービス・アーキテクチャ)」という設計手法も存在する。
「サービス」は単独稼働するプログラムである(例外もある)。

「サービス」の中身を「オブジェクト指向」で作る、と考えてもらうと良い。

モジュールを階層で分ける考え方もある。
身近な例では「OS」と「DBなどのミドルウェア」と「アプリ」の階層構造が一般的だ。
大昔はPCのハードウェアの上で直接プログラムが動いていたが、これでは生産性が悪く、他のハードウェアで同じ機能のソフトウェアが動かないので、ファイル入出力やキーボード入力、画面表示などの機能を「OS」として作り、「アプリ」が「OS」の機能を呼び出して稼働する「2階建て構造」でソフトウェアを作るようになった。
ご存じのように現在のコンピュータは全て「Windows」や「iOS」「Android」などのOSを装備している。

「DBなどのミドルウェア」はOSに組み込むほど汎用的では無いが、アプリでよく使われる機能を纏めて実装したソフト部品の様な物である。

OSが1階、ミドルウェアが2階、アプリが3階の「3階建て構造」になる。

今回は、この「階層構造」によるモジュール分割方法の代表格である「TCP/IP」を通じて、「レイヤー」というモノの考え方を紹介したい。

この「レイヤー」という複雑な物事を整理してわかりやすくする考え方は、ITやソフトウェア以外にも社会や経済、組織などを理解する上で役に立つ便利なモノだ。
抽象的思考の道具としての「レイヤー」について説明する。

TCP/IPとOSI参照モデル

TCP/IPとはインターネットと企業内ネットワークを構成するイントラネットを実現する階層型の通信規約である。

先のOS・ミドルウェア・アプリの「3階建て構造」のように通信の役割を階層構造に分割して、柔軟性と信頼性と拡張性を実現している。

TCP/IPは階層によるモジュール分割方法であり、全世界共通の標準規格でもある。

全世界共通の標準規格なのでWi-FiやLTE・4G(LTE-Advanced)など最新技術を導入しても、全体のIT機器や仕様を変更する必要がない。
各階層ごとに異なる国や企業の製品を使用できるなど優れた規格である。

TCP/IPは「OSI参照モデル」という通信規約を参考にして作られた規格である。
両者に互換性は無いが、階層構造によるモジュール分割の考え方は同じである。
通常、情技師(ITエンジニア)は、TCP/IPと「OSI参照モデル」をセットで覚える。
セットで覚えるが両者は違うものである。

非情技の為の簡単なTCP/IPの解説

情技師(ITエンジニア)向けの詳しいTCP/IPの説明は行わない。
他のサイトで既に説明しているので検索して欲しい。

ここでは非情技(非ITエンジニア)向けに簡単にTCP/IPと「ネットワークレイヤー」という考え方を解説する。

ネットワークレイヤーの原案はOSI参照モデルだ。

建築物のビルのように階層構造が定義されている。

OSI参照モデル

7層
アプリケーション層
アプリケーション固有の通信規格
6層
プレゼンテーション層
データ形式、圧縮・文字コードなどの規格
5層
セッション層
通信の開始終了・継続の管理規格
4層
トランスポート層
コネクションを確立しパケットが目的端末へ届くことを保証する。エラー時に再送など行う
3層
ネットワーク層
端末から端末へパケットを送り届ける。経路選択を行う。コネクションレスで高速だが通信保証がない。
2層
データリンク層
直接繋がる機器間の通信を行う。
1層
物理層
通信機器やケーブル・コネクタなどハードウェアの規格


「層」は「レイヤー(layer)」と呼ばれ「1層」は「レイヤー1」、「2層」は「レイヤー2」と呼ばれる。
「レイヤー1」は「L1」とも表される。

OSI参照モデルは実装より抽象的な設計思想に近く、通信処理(ソフトウェア)を作るとき「どのように通信処理の役割分担を行うか」を考え定義している。

「レイヤー(layer)」が閉じたモジュールの役割をする形でモジュール分割されたイメージだ。

「レイヤー」の依存関係は「上が下に従属する」ことになる。
「従属」とは仕様を定める者と、その仕様に従う者の関係を表す。
「レイヤー」の場合は上のレイヤーが下のレイヤーに従うということだ。
レイヤー2のデータリンク層は、レイヤー1の物理層の規格に従わなければならない。
レイヤー3のネットワーク層は、レイヤー2のデータリンク層の規格に従わなければならない。

大概のモジュール分割にはこのような従属関係がある。

TCP/IPとUDP/IPはこのOSI参照モデルを参考に「実装」方法を重要視して作られた規格だ。
インターネットやイントラネットはTCP/IPとUDP/IP規格によって構築されている。

TCP/IPのレイヤー構成はOSI参照モデルに似ているが階層は少ない。

TCP/IP,UDP/IP

5層
アプリケーション層
OSI参照モデルの5,6,7層を纏めたモノ。
HTTPやSSH,TELNET,FTPなどアプリ固有の通信規格。
4層
トランスポート層
OSI参照モデルの「ネットワーク層」に相当。
TCP規格とUDP規格がある。
3層
インターネット層
OSI参照モデルの「ネットワーク層」に相当。
IP規格の事。
2層
リンク層
OSI参照モデルの「データリンク層」に相当。
1層
物理層
OSI参照モデルの「物理層」と同じ。

「レイヤー」と「従属」に関する考え方は同じだ。
上が下に従属する。

「レイヤー」の上下を表す言葉に「上位と下位」「高位と低位」という言葉が有る。
通常は情技師(ITエンジニア)は「高位と低位」という言葉を使う。
TCP/IPレイヤーでは、1層(物理層)の方が「低位」で、5層(アプリケーション層)の方が「高位」となる。
下が「低位」で、上が「高位」で、見たままなのでわかりやすい。

「上位と下位」という言葉は「従属関係」を表すモノで、「下位が上位に従属する」関係になる。
TCP/IPレイヤーでは、1層(物理層)の方が「上位」で、5層(アプリケーション層)の方が「下位」となる。
上層が下層に従属するので、「下層が上位で、上層が下位になる」上下逆さまになる為、知らない人に説明するとき誤解を生みやすい。
だから「上位と下位」という言葉はあまり使われない。

それぞれのレイヤーの役割を簡単に説明する。

レイヤー1,物理層

LANケーブルや光ファイバー、ネットワークカード、Wi-Fiやモバイルブロードバンドなど、ハードウェアの通信規格を定めたモノ。

レイヤー2,リンク層

物理層を直接呼び出し活用して通信を実現するソフトウェアのレイヤー。
ケーブルや無線など直接「物理層」で接続されている機器間の通信を担当するレイヤー。
各機器にはMACアドレスという住所が付番されている。
データを「フレーム」という単位に切り分けて送り届ける。

レイヤー3,インターネット層

リンク層の仕組みを使い通信する。
IP(Internet Protocol)規格のこと。
IPv4とIPv6がある。
ノード(端末・機器)ごとに「IPアドレス」という住所が付番されている。
データを「パケット」という単位に切り分けて、送信端末から受信端末までパケットを送り届ける。
送信端末から受信端末は必ずしもケーブルなどで物理的に接続していなくても良い。
間接的に繋がっていれば、インターネット層の仕組みが通信経路を選択して、リレーのように目的の端末までパケットを送り届ける。
接続はコンネクションレスで相手端末が停電で停止していても送信する。
高速な通信処理をするが、通信の保証をしない。
パケットが届かない場合もある。

レイヤー4,トランスポート層

インターネット層(IP)の仕組みを使い通信する。
TCP(Transmission Control Protocol)規格と、UDP(User Datagram Protocol)規格がある。

TCPは相手端末が通信可能か確認し端末間で「これから通信するよ」という合意「コネクション」を確立してから通信する。
パケットが相手に届いたか確認するので通信品質をトランスポート層の仕組みが保証している。
通信エラーの場合はパケットを再送信する。
届くまで繰り返す。
通常のアプリケーションの通信はTCPが使われている。

UDPは「コネクション」を確立しないで大量のパケットを送るのに向いた通信規格。
TCPのように通信品質は報償されないが、速度は速い。
動画や音声の送信のように多少のデータ欠落があっても良い場合に使われる。

レイヤー5,アプリケーション層

トランスポート層(TCP,UDP)の仕組みを使い通信する。
OSI参照モデルではセッション層・プレゼンテーション層・アプリケーション層の3つに分かれていたが、こちらではアプリケーション層一つに纏められている。
HTTP,SSL,SSH,TELNET,FTPなど各種アプリケーションごとの固有の通信規格を意味する。

このレイヤーはTCP/IPには含まれない。

レイヤー6,人間

アプリケーションを使って通信をするのが人間で有る。
人間は「レイヤー6」に当たる。
これは規格ではない。

何故「レイヤー」を分けるのか

「レイヤー」は複雑なシステムを複数のカプセルに分割することで「複雑さ」を軽減する「モジュール分割」の一つの方法である。

複雑なシステムを階層構造に分け、階層ごとにカプセル化して「カプセルに複雑さを閉じ込める」ことで全体の構造を整理して単純化する方法で有る。

階層(カプセル)と階層(カプセル)の繋ぎ目の規格の事を「インターフェイス」と呼ぶ。

モジュールをカプセルに閉じ込めると、カプセルの中の仕組みが変更されても、インターフェイスが変更されなければ、他のカプセルを改造変更する必要がない。

「レイヤー」に分けるとレイヤーの規格が変更されたとき、他のレイヤーを変更しなくても良くなる為、新しい仕組みを導入し易くなる。
また、新旧の仕組みを共存させることも出来るので、組織や社会などに新しい機器を段階的に導入していくことができる。

少し前は「物理層」は銅線ケーブルだったが、その後「光ファイバー」が導入され、Wi-Fiが導入され、モバイルブロードバンドが導入され、と次々新しい通信システムが導入されたが、IPの仕組みは変更する必要がなかった。

少し前までIPは32bitのIPアドレスを使用する「IPv4」が使用されていたが、IPアドレスが不足してきた為、128bitのIPアドレスを持つ「IPv6」に切り替えられた。
このときも、TCPやUDPの規格は変更する必要がなかった。

このようにレイヤーに分けるとレイヤーごとに仕様変更がやりやすくなる。
また、変更の影響を高位レイヤーが受けなくて済む。



コンピュータの様々な部分に活用されるレイヤー思考

例えば、Oracleの「Java」や、Microsoftの「.NET」などのプログラムの実行方法の仕組みには「中間言語」と「VM(仮想マシン)」の仕組みが採用されている。

「Java」と「.NET」をレイヤーで表すと以下のようになる。
L4
プログラム言語
Java
C#,VB.NET
コンパイルして実行する
L3
中間言語コード
バイトコード
CL
(共通言語コード)
仮想の機械語コード
L2
仮想マシン
JavaVM
CLR
仮想の機械語を機械語に翻訳しながら実行する。
L1
OS
Linux,Windows,Mac他
Windowsが主、後にLinux他も対応した。
機械語を実行する
JavaとC#はコンパイル言語だが、コードをコンパイルして生成されるのは「仮想CPUの機械語」である。
これを「中間言語コード」と呼ぶ。
「中間言語コード」のプログラムは仮想マシン上で実行される。
仮想マシンは「中間言語コード」をそれがインストールされているOSの機械語に翻訳しながら実行する。
仮想マシンはLinuxやWindowsなど複数のOSに対応しているので、同じ「中間言語コード」のプログラムを異なるOSで動作させることが出来る。
このようなことが可能なのも「レイヤー」という考え方があるからだ。

Excelのようなソフトも内部は階層構造で作られていて、Windows版とMac版のExcelでは、低位レイヤーのコード以外は同じコードが動いているそうだ。

一般的な企業の業務システムも階層構造で作られるものが多い。

レイヤーは様々な分野で使用されている。

コンピュータ以外にも応用が利くレイヤー思考

レイヤー(階層)構造に分けて考える考え方は、コンピュータ以外の分野にも使える。
工学だけでなく、組織論や業務設計・社会科学にも応用が利く。

これに付いては、次回説明したい。


ITシステムの基礎知識を解説(IT素人さん向け)リンクリストに戻る


このブログを検索

Translate

人気の投稿

自己紹介

自分の写真
オッサンです。実務経験は Windows環境にて C#,VB.NET ,SQL Server T-SQL,Oracle PL/SQL,PostgreSQL,MariaDB。昔はDelphi,C,C++ など。 趣味はUbuntu,PHP,PostgreSQL,MariaDBかな ?基本無料のやつ。

QooQ