プロトコルスタックは送信依頼をどのように実行するか

ソケットを作成する

プロトコルスタックの内部構成

 

プロトコルスタックの内部構成は、役割の異なるいくつかの部分に分かれている。上図の構成は、ある作業を依頼する側が上にあり、その依頼を受けて作業する側が下にあるということである。最も上にあるのが「ネットワークアプリケーション」で、ブラウザ・メーラー・webサーバー・メールサーバーといったプログラムがこれに相当する。ここから図の下のカテゴリに向けてデータ送受信などの作業を依頼する。
ブラウザに限らずどのアプリケーションでもネットワークでデータを送受信する動作は似通っている。アプリケーションによって送受信するデータの内容は異なるが、データを送受信するときの動作は共通であるのでアプリケーションによる違いは無くなってしまっている。
アプリケーションの下の部分には「Soketライブラリ」があり、その下には「リゾルバ」が埋め込まれている。これらがDNSサーバーにIPアドレスを問い合わせる動作を実行する。
その下がOSの内部を表していて、ここにプロトコルスタックがある。プロトコルスタックの上部には「TCP」というプロトコルを使ってデータ送受信を行う部分と。「UDP」というプロトコルを使ってデータ送受信をする部分があり、この2つがアプリケーションからの依頼を受けて送受信動作を実行する。
ブラウザやメールなど通常のアプリケーションはTCPを使ってデータを送受信し、DNSサーバーへの問い合わせなどで短い制御用のデータを送受信する場合にはUDPを使う。
その下にはIPプロトコルを使って送受信操作をコントロールする部分がある。インターネットでデータを運ぶときは、データを小分けにして「パケット」という形で運ぶが、そのパケットを通信相手まで運ぶのがIPの主な役割である。
そのIPの中には「ICMP」と「ARP」と呼ばれるプロトコルを扱う部分が含まれる。
ICMPは、パケットを運ぶ時に発生するエラーを通知したり、制御用のメッセージを通知するときに使うものである。
ARPは、IPアドレスに対応するイーサネットの「MACアドレス」を調べるときに使う。
IPの下の「LANドライバ」は、LANアダプタのハードウェアをコントロールするもので、その下にあるLANアダプタが実際の送受信操作、つまり、ケーブルに対して信号を送受信する動作を実行する。
※:MACアドレス:IEEEで標準化されたLAN方式の機器が使用するアドレスをMACアドレスという。
ソケットの実体は通信制御用の制御情報
プロトコルスタックには内部に制御情報を記録するメモリー領域を持ち、そこに、通信動作を制御するための制御情報を記録する。通信相手のIPアドレスは幾つなのか、ポート番号は何番か、通信動作がどのような進行状態にあるのかなどの情報が代表的なものである。ソケット自体には実体はないが、この制御情報がソケットの実体と言える。もしくはこれらの制御情報を記録したメモリー領域をソケットの実体と呼んでもいい。
 

 




プロトコルスタックは、この制御情報を参照しながら動作する。
ソケットには通信動作をコントロールするための様々な制御情報が記録されており、プロトコルスタックはそれを参照することで次に何をすべきかを判断している。
socketを呼び出したときの動き

 

最初にブラウザがSocketライブラリを介してプロトコルスタックにTCPプロトコルを使ってデータを送受信するように依頼する。
ソケットを作成するフェーズにおいてアプリケーションが図のように、soketを呼び出してソケットを作成するように依頼したら、プロトコルスタックはその依頼にしたがってソケットを1つ作る。
その際にプロトコルスタックはソケット1つ分のメモリー領域を確保する。ソケットの制御情報を記録するメモリー領域は最初からは存在しないのでそれを確保する。メモリー領域を確保するということは、制御情報を入れる器を用意するということで、そこに中身に相当する制御情報を記録する。この時点ではソケットは作成直後のため、まだ送受信が始まっていない初期状態であるので、初期状態であるということを表す制御情報をソケットのメモリー領域に記録する。こうしてソケットができあがる。
次に、そのソケットを指し示すための「ディスクリプタ」をアプリケーションに示す。ディスクリプタは、プロトコルスタック内部にある多数のソケットに中のどれかを指し示すための番号札の役割を果たす情報である。
このディスクリプタを受け取ったアプリケーションは、それ以後、プロトコルスタックスタックにデータ送受信を依頼するときに、ディスクリプタを通知してくる。ソケットには、何処とそこが通信しているのか、それがどんな状態にあるのかという記録が成されているので、ディスクリプタによってどのソケットなのかを示せば、必要な情報はすべてプロトコルスタックの方で判明する。このことにより、いちいち通信相手の情報をアプリケーションから通知してもらう必要が無くなる。
※:「メモリー管理」というソフトウェアモジュールがメモリー領域を管理している。

コメントを残す

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