注目の書籍

好評発売中!

知識ゼロから始めるLinuxサーバーの作り方

Linux初心者でも
本格 サーバーが“即席”で 完成!自宅サーバー
クラウド化も!

必聴講座ご紹介

Cloud Days Tokyo 2012
クラウド時代を勝ち抜く企業戦略を考える

エムオーテックス


Cloud Days Tokyo 2012
クラウド時代の企業インフラとユーザー環境の姿

ヴイエムウェア


Cloud Days Osaka 2012
クラウドでIT維新を〜ビジネスを加速させるベストプラクティス

アマゾン データ サービス ジャパン

オープンソース/Linux

まつもと直伝 プログラミングのオキテ

日経Linux

まつもと直伝 プログラミングのオキテ 第17回 ネットワーク・プログラミング(プロトコル編)

2008/02/01
ネットワーク応用通信研究所 まつもと ゆきひろ
出典:日経Linux 2006年9月号  133ページより
(記事は執筆時の情報に基づいており、現在では異なる場合があります)

ネットワーク通信では,「どのような形式でやり取りするのか」について参加者間で合意しておく必要があります。この合意を「プロトコル」と呼びます。今回はネットワーク通信のプロトコル,特にアプリケーション層について,実例を交えて解説します。

 現在広く使われている通信ネットワークは階層構造を採っています。最初に,ISO(International Organization for Standardization,国際標準化機構)が提唱するOSI(Open Systems Interconnection,開放型システム間相互接続)で示されている7階層モデルに基づいて,ネットワークの階層構造を考えましょう(図1)。OSIそのものは実際にはあまり使われてはいませんが,7階層モデルはネットワークに関する階層構造を理解するのに役立ちます。

図1●OSIの7階層モデル
図1●OSIの7階層モデル

 7階層モデルでは図の下に行くほどハードウエアに近づき,上に行くほどユーザーに近づきます。

 1番上にある「アプリケーション層」は,ユーザーに提供するアプリケーションの機能を実現する階層です。アプリケーション固有の機能はこのレベルで実現されます。TCP/IPではこの「アプリケーション層」から「プレゼンテーション層」までを,ユーザー・アプリケーション・レベルで実現します。アプリケーション層の実現例としてはHTTP,FTP,POP,SMTPなどがあります。

 これらのアプリケーション層のプロトコルについては,後ほど詳しく解説します。

 次の「プレゼンテーション層」はデータ形式を管理します。多くのアプリケーションでは「アプリケーション層」と区別されていません。

 3番目の「セッション層」は,一連の通信を“ひとまとまりのもの”として意味付ける働きをします。例えば,複数の通信が同じユーザーからのものであると意味付けます。7階層モデルでは上から3番目に位置していますが,アプリケーション層のプロトコルであるHTTPでは,セッション機能が全く提供されません。そのため,多くのWebアプリケーションでは,さらに上位のプロトコルでセッション機能を提供しており,7階層モデルとは順序が逆転しています。

 その下の「トランスポート層」は,実際にデータを転送する階層です。データの欠損があった場合に再送を依頼する誤り制御や,転送するデータ量が多すぎて通信の信頼性が低くなった場合の流量調節などをこの層で実現します。前回解説したTCP(Transmission Control Protocol)やUDP(User Datagram Protocol)はこの階層に当てはまります。

 5番目に示した「ネットワーク層」は,送信依頼があったデータをパケットに分割し,送信先が同一ネットワーク内であれば,そこに向かって直接送信し,そうでなければ他ネットワークへのゲートウエイに対して送信します。例えば,TCP/IPでのIP(Internet Protocol)がこの階層に相当します。

 次の「データリンク層」は,同一ネットワークにある転送先へのパケット送受信を担当します。この階層で物理層を制御し,必要であればフォーマットを施します。OSのネットワーク・ドライバが,この「データリンク層」に相当します。

 1番下の「物理層」は電気信号によってビット列を送受信します。実際のデータは金属製のケーブルや,光ファイバー,電波などを経由して伝わります。

データ転送と階層構造

 ネットワーク通信において,各階層は通信先の同じ階層と対話しながら処理していきます。この“対話”の取り決めをプロトコルと呼びます。例えば,前回紹介したdaytimeクライアント(図2)の動きを見てみましょう。


require 'socket'
print TCPSocket.open("localhost", "daytime").read
図2●Rubyで記述したdaytimeクライアント

 アプリケーション層に相当するdaytimeプロトコルは簡単です。

(1)daytimeサービスのポートをオープンする。

(2)サーバーはクライアントに現在時刻の文字列表現を送信する。

 取り決めはこれだけです。daytimeは簡単なアプリケーションなので,プレゼンテーション層やセッション層に相当するものが存在しません。

 図2に登場するRubyのTCPSocketクラスはトランスポート層に属します。openによって指定されたホスト(この場合はlocalhost)の指定されたポート(この場合はdaytime)に接続し,データを読み出しています。TCPSocketクラスはOSのシステム・コールを呼び出し,TCPドライバに接続要求を出します。

 ソケットの接続要求を受けたTCPドライバは,ネットワーク層であるIPドライバに依頼を転送します。IPドライバはデータリンク層であるネットワーク・アダプタ(例えばイーサネット)のドライバを使って,実際のデータ(接続依頼パケット)をネットワークに送信します。daytimeクライアントの場合は同じホスト(マシン)上での通信ですからloopbackドライバが動作します。

 今回のように通信が同じマシンの中で閉じている場合に用いられるloopbackデバイスでは,物理層は介在しません。しかし,通常の通信の場合には,イーサネットや無線LANなどを経由して,送信先までデータが送られます。

 送信先に届いた接続要求は,データリンク層からトランスポート層を順番に経由して,daytimeのサーバー・プログラムに配送されます。daytimeサーバーはプロトコルに従い,接続してきたクライアントに対して,現在時刻を表現する文字列を送信します。その文字列はビット列として,トランスポート層,ネットワーク層,データリンク層,物理層というように,先ほどとは逆の経路を通って転送され,クライアントに到達します。

 簡単なネットワーク通信においても,実際にはこのような階層構造を通り抜けてデータを送受信しているわけです。

>>プロトコルにも階層がある
次ページ以降はITpro会員(無料)の方のみお読みいただけます。
会員の方は、 ログインしてご覧ください。
まだ会員でない方は、ぜひ登録(無料)していただき、ITproの豊富なコンテンツをご覧ください。

この記事に対するfacebookコメント

nikkeibpITpro

読みましたか? 〜 未読記事をご紹介