【読書】TCP/IP解析とソケットプログラミング

TCP

コネクション型でのエンドツーエンド間を接続するためのトランスポート層のプロトコル。信頼性を考慮しているため順序制御、ウインドウ制御、再送制御、フロー制御など上位アピリケーションに信頼性を提供している。

順序制御

FTPなどのプロセスからのデータをセグメントに分割して相手ホストに送信する。信頼性のために全てのセグメントに応答確認が必要である。1セグメント毎に応答を待つ。

ウインドウ制御

1セグメント毎に応答確認を待っていると通信性能が悪くなることがあるので、ウインドウという概念を取り入れて送信したセグメントの応答確認を待たずに複数のセグメントを送信することで通信性能を向上させている。

再送制御

ウインドウ制御をおこなっている時に、下位IP層はコネクションレスのためにセグメントが失われる可能性があるのでセグメントの再送を行う制御がある。受信側重複応答確認を送り次のセグメントを催促する。3回同じ応答確認を受けたらセグメントを再送する。

フロー制御

ウインドウ制御をおこなっている時に、受信側がセグメントを取りこぼすことがある。取りこぼすと送信側は再送しなくてはならず、処理効率が悪くなる。そのため受信側が応答確認時にWINDOWフィールドの値を制御することにより相手の送信データ量を規制する。受信側のバッファに余裕ができるまでデータ転送は中断され受信側からのウインドウ更新通知によりデータ転送が再開される。ウインドウ更新通知自体が紛失する可能性があるため送信側からウインドウプローブを時々送信し、受信側の状態を確認している。

コネクション型プログラムの通信の流れ

データを送受信する順番が決まっていないプログラムに多く使われる。

サーバプログラム

  1. サーバプログラムでソケットを作成し、それに名前をつける(bind)。ソケットに名前をつける時に使用するポート番号とプロトコルを決定する。ソケット作成にはアドレスファミリ、ソケットタイプ、プロトコルの情報が必要。TCPの場合ソケットタイプはバイトストリーム(連続したデータ)、アドレスファミリはインターネットアドレスファミリを設定する。ソケットを作成するとシステムからソケット記述子が得られる。
  2. クライアントからの接続要求を待つ(listen)。具体的には、クライアントからの接続要求をシステム側で保持するためのキューを用意する。
  3. クライアントから接続要求がきたら受け入れる(accept)。受け入れができると新しいソケット記述子を返す。

クライアントプログラム

  1. ソケットを作成しサーバの名前またはIPアドレスを探す(getbyhostname/getbyhostaddr)。getbyhostnameはホスト名からIPアドレスを取得するときに使用。DNSサーバやhostファイルが存在するときに有効。
  2. サーバへ接続要求する(connect)。connectが完了すると、サーバとの仮想回線が確立したことになる。回線が確立すると両方のプログラムがソケットに対して送受信することができる。

データの送信

送信側でデータをすべて送出できたか判定する責任がある。sendで送出できたバイト数が帰ってくるので 、送りきっていなかった場合は再送する必要がる。

データの受信

送信と同様にデータを読み込み終えるまでrecvしなければならない。TCPの上位プロトコルによって確認する必要が有る。受信データを待機する場合、1つのクライアントにrecvをだしてデータが送出されるまでrecvの制御が帰ってこなければ他のクライアントからの接続要求やsendに応えられない。待機方法としては割り込みや、ポーリングなどがある。様々な解決方法があるのでプラットフォーム毎に適切な対策をする。

ストリームデータの扱い

データに境目がない分期待したデータよりもたりなかったり、余分にデータを受信することがよくある。少ない場合:受信プログラムは受信データのヘッダと送信プログラムが先頭に付与したデータ長と比較する。たりない場合はバッファの先頭アドレスに受信したデータ分のアドレスを付与してそこから受信するようにTCP/IPへRecvを発行する。多い場合:再度Recvを発行せず、次のデータとして処理を行う。

クライアントプログラムからソケットを閉じる(勝手にソケットを破棄するのは良くない)。

①FINパケットを送る。送信するデータがなくなった側がFINパケットを送信する。FINを受信した相手は送信するデータがなければFINパケットを送信。残っていたら全部送信してからFINパケットを送信。

②RSTパケットを送る。強制的にその時点のコネクションが消滅する。

  1. クライアント→サーバ:sendの禁止
  2. 滞留しているすべてのデータをrecvする。
  3. ソケットを終了する(closesocket)。

コネクションレス型プログラムの通信の流れ

データグラムとして送受信するプログラムに使用される(データを受信したら送信する等順番が決まっているもの)。サーバとクライアント間で接続を確立せずにデータの送受信ができる。データを送受信するたびに識別情報をつけて送る。通信が終了したら両方のプログラムでソケットを閉じる。

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>