データ送受信とプロトコルスタック

OSのプロトコルスタックにメッセージ送信を依頼

データ送受信の概要
OSのプロトコルスタックにメッセージ送受信操作を依頼する場合には、Soketライブラリのプログラム部品で決められた順番で呼び出す。

Webサーバーに送るHTTPのメッセージはデジタルデータである。デジタルデータを送受信するということは、ブラウザに限らず、ネットワークを利用するアプリケーションすべてに共通することである。この動作はWebに限らず先述のDNSサーバーを使ってIPアドレスを調べることや、ネットワークアプリケーションすべてに当てはまる。

TCOプロトコルを用いたデータ送受信動作のイメージ

データ送受信を行う際には、送受信動作を行う前に送受信する両者の間を線(線のようなもの)でつなぐ動作が必要である。その線の出入り口にソケット(Soket)をつくって両者を接続する。
最初にサーバー側でソケットを作り、そのソケットにクライアント側が線をつなぎにくるのを待つ。そして、クライアント側でもソケットをつくり、そのソケットから線を延ばしてサーバー側のソケットに接続する。両者は接続されたら、データをソケットに放り込むという形で双方向にデータのやり取りが実行される。
送受信動作が終わった後は、接続を解放する。接続するときはクライアント側からサーバー側へ接続していたが、接続を解放するときは原則としてどちら側から外しても構わないが、実際の順番はアプリケーションのルールで決めておく。(切断フェーズ)
接続を解放したら、ソケットを抹消して通信動作を終了する。
 

データ送受信操作のフェーズ

  • ソケットを作る(ソケット作成フェーズ)
  • サーバー側のソケットにパイプをつなぐ(接続フェーズ)
  • データを送受信する(送受信フェーズ)
  • パイプを外してソケットを抹消する(切断フェーズ)
  • この4つのフェーズを実行するのはOS内部のプロトコルスタックである。ブラウザはこのプロトコルスタックに依頼して接続し、データを送受信する。また、依頼動作はソケットライブラリに入ったプログラム部品を呼び出して実行するが、データ送受信用のプログラム部品であるソケットライブラリはアプリケーションから依頼を受けた内容をそのままプロトコルスタックに伝える仲介役を果たすだけで、実質的な作業は行わない。

この4つのフェーズを実行するのはOS内部のプロトコルスタックである。ブラウザはこのプロトコルスタックに依頼して接続し、データを送受信する。また、依頼動作はソケットライブラリに入ったプログラム部品を呼び出して実行するが、データ送受信用のプログラム部品であるソケットライブラリはアプリケーションから依頼を受けた内容をそのままプロトコルスタックに伝える仲介役を果たすだけで、実質的な作業は行わない。

ソケットを作る作成フェーズ

データ送受信を依頼するアプリケーション・プログラム(ブラウザを指す)の動作は、最初にSoketライブラリのプログラム部品を指定して、その内のいくつかの部品を決められた順番に呼び出していく。Soketライブラリを呼び出した後は、その内部に制御が移り、ソケットを作る動作を実行し、それが終わったらアプリケーション・プログラム(ブラウザ)に制御が戻る。
 
ディスクリプタ
ソケットができたら、ディスクリプタというものが返ってくるので、アプリケーション(ブラウザ)はそれを受け取ってメモリーに返す。ディスクプリタとはソケットを識別するために使用する。例えば、ブラウザでウィンドウを2つ以上開いて複数のwebサーバーにアクセスする場合、複数のデータの送受信につき、ソケットも複数必要になる。1台のコンピュータに複数のソケットが存在することになり、それぞれを識別しなければならない。そのときにディスクリプタが必要になってくる。一つひとつのソケットに割り当てた番号のようなものがディスクリプタである。
データ送受信の際に、ソケットにディスクリプタ(番号)が付いていれば、どのソケットを使って送受信するのかを、プロトコルスタックがすぐに判別することができる。
  • アプリケーション・プログラム(ブラウザ)は、「ディスクプリタ」という番号札のようなものでソケットを識別する。

サーバー側のソケットにパイプをつなぐ(接続フェーズ)

ソケットができあがったらサーバー側のソケットの接続するようにプロトコルスタックに依頼する。アプリケーション(ブラウザ)はSoketライブラリの「connect」というプログラム部品を呼び出すことでこの依頼動作を実行する。
connect(Soketライブラリ):ディスクリプタ・サーバーのIPアドレス・ポート番号を操作する。
 
 
ディスクリプタ
ソケットを作成したときに返ってきたディスクリプタは、connectによってプロトコルスタックに通知される。プロトコルスタックは通知されたディスクリプタを参照してどのソケットをサーバー側のソケットに接続するのかを判断して、接続動作を実行する。
 
IPアドレス
ここでのIPアドレスはDNSサーバーに問い合わせて調べたアクセス先のサーバーのIPアドレスである。データ送受信を実行する際には、送受信する相手のIPアドレスをプロトコルスタックに通知する必要がある。
 
ポート番号
IPアドレスはネットワーク上に存在する個々のコンピュータ識別するために、それぞれに異なる値を割り当てたものである。なので、IPアドレスが特定できるのはネットワーク上のどのコンピュータまでかというところまでである。
ディスクリプタは、ソケット作成を依頼したアプリケーション(ブラウザ)に渡すもので、直接接続相手に渡すものではない。なので、接続相手側でポート番号の値はわからない。(サーバー側のソケットのディスクリプタはクライアントには分からない)
ディスクプリタは1台のコンピュータの内部でソケットを識別するのに使うのに対して、ポート番号は接続相手側からソケットを識別するときに使う仕組みである。
サーバー側のポート番号はあらかじめ決められているというのが前提である。(Webなら80番、メールならば25番)ポート番号のルールは全世界で統一されていて、IPアドレスと同様に他と重複しないように一元管理されている。
 
IANA(Internet Assigned Number Authority)という機関によって管理。
  • ディスクリプタ:アプリケーション(ブラウザ)がソケットを管理するもの
  • IPアドレスとポート番号:クライアントとサーバーの間で相手のソケットを識別するもの

データを送受信する(送受信フェーズ)

ソケットが相手側とつながったら、データのやり取りが可能になる。アプリケーション(ブラウザ)は直接ソケットにタッチできないので、Soketライブラリを介してプロトコルスタックに送受信を依頼する。そこで「write」というプログラム部品が使用される。
 
write(Soketライブラリ)
最初にアプリケーションは送信データをメモリーに用意しておく。ユーザーが入力したURLに基づいてHTTPのリクエストメッセージが送信データとなる。アプリケーション(ブラウザ)は「write」を呼び出すときに、ディスクリプタと送信データを指定する。そして、プロトコルスタックが送信データをサーバーに送信する。
ソケットにはつながった相手が記録されているので、ディスクリプタでソケットを指定するだけで、送信先の相手が判明してデータ送信をしてくれる。
サーバーは受信動作を実行してデータの内容を調べたあと、処理を実行して、レスポンスメッセージを返信する。
 
read(Soketライブラリ)

レスポンスメッセージを受信する動作では、Soketライブラリの「read」というプログラム部品を介してプロトコルスタックに受信動作を依頼する。その際に、受信したレスポンスメッセージを格納するためのメモリ領域を指定する。このメモリ領域を「受信バッファ」と呼ぶ。レスポンスメッセージは、readが受け取って受信バッファに格納してくれる。

受信バッファはアプリケーション(ブラウザ)内部に用意したメモリ領域なので、受信バッファにメッセージを格納した時点で、メッセージをアプリケーション(ブラウザ)に渡したことになる。
 

パイプを外してソケットを抹消する(切断フェーズ)

ブラウザがデータを受信し終わったら送受信動作は終わる。そのときは、Soketライブラリの「close」というプログラム部品を呼び出して切断フェーズに入るように依頼すると、ソケット間の接続も切断され、ソケットも抹消される。
 
close(Soketライブラリ)
Webで使うHTTPプロトコルでは、本来、レスポンスメッセージを送り終わった時に、Webサーバー側から切断動作を実行することになっている。(クライアントが先になる場合もある)
Webサーバー側でcloseを呼び出して切断すると、クライアント側でのソケットは切断フェーズに入る。そこでは、ブラウザがreadで受信動作をしたときに、readは受信したデータを渡す代わりに、送受信が終了して切断されたことをブラウザに通知する。この動作により送受信が終了したことが判別できるので、同時にブラウザでもcloseを呼び出して切断フェーズに入る。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です