第 7 回 TCP

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

7-1. アイスブレイク

本日の属性

Processing はまあまあできる 絵が得意
学籍番号 氏名 (番号欄)
就職先のジャンルをそろそろ考えている ネットワークゲームなど通信を行うゲームをやったことがある

手順

  1. 全色が揃うように4人前後の班を作る
  2. 班ごとに着席する。椅子を動かして机を囲むようにする。(使わない机を動かしても良い)
  3. 順番を決める
  4. 作成した4枚の用紙に決まった番号を記入する
  5. 班員に用紙を名刺代わりに配る
  6. 1番から色を付けた属性を含めた自己紹介を1分程度で行う

7-2. レポート課題

テーマ:ネットワークで共同で絵を描く

本日のワークで最終的に作成した絵を添付し、班員の名前を記入したメール を提出すること。

締切、提出方法

11/6 火曜日の夕方までに <sakamoto@c.dendai.ac.jp>宛にメールすること。

注意

教室のネットワークは、セキュリティの設定上、学生のパソコン同士が通信 できないように設定されているので、この演習はできません。

相互接続できるネットワーク環境が必要になります。 教室ネットワーク以外のネットワーク環境が必要となる場合があります。 公衆ネットワークでも同様の設定がされている場合がありますので、授業時 間以外でワークを実施したいが、環境がない場合はご相談ください。

7-3. グループワーク

ワーク7-1

個人

  1. HTMLカラーチャー トなど、カラーコードを入手できるサイトに行き、自分の色を一つ 選び(白、黒、灰色は避ける)、6桁の16進数を取得する。 以下、説明として #789abc を使用する。
  2. Processing を起動する
  3. Processing のファイル→サンプルを選び、 ライブラリ→Network→SharedCanvasServerを選ぶ。
  4. 起動して、灰色の画面で黒線で絵が描けることを確認する
  5. 以下の手順でカラー化する
    1. 冒頭の import の次の行に mycolor 変数を宣言する
      	
      int mycolor=#789abc;
      
    2. drawメソッドの前半の if 文の中で stroke と c.write を変更す る
      	
       if (mousePressed == true) {
          // Draw our line
          stroke(mycolor);
          line(pmouseX, pmouseY, mouseX, mouseY);
          // Send mouse coords to other person
          c.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + " " + mycolor + "\n");
      }	
      
    3. drawメソッドの後半の if 文の中で stroke を変更する
      
          stroke(data.length>4?data[4]:0);
      
    4. 起動して自分の色で線がかけることを確認する(起動したままにしておく)
    5. 任意の場所に任意の名前で保存する
  6. Processing のファイル→サンプルを選び、 ライブラリ→Network→SharedCanvasClientを選ぶ。
  7. 起動して、灰色の画面に白線で絵を描くと、Server の画面には黒線で 同じ絵が描けることを確認する
  8. 以下の手順でカラー化する(Serverと同じ手順)
    1. 冒頭の import の次の行に mycolor 変数を宣言する
      	
      int mycolor=#789abc;
      
    2. drawメソッドの前半の if 文の中で stroke と c.write を変更す る
      	
       if (mousePressed == true) {
          // Draw our line
          stroke(mycolor);
          line(pmouseX, pmouseY, mouseX, mouseY);
          // Send mouse coords to other person
          s.write(pmouseX + " " + pmouseY + " " + mouseX + " " + mouseY + " " + mycolor + "\n");
      }	
      
    3. drawメソッドの後半の if 文の中で stroke を変更する
      
          stroke(data.length>4?data[4]:0);
      
    4. 起動して自分の色で線がかけ、Serverにも同じ線がかけることを確 認する
    5. 任意の場所に任意の名前で保存する

ワーク7-2

ペアで通信の練習をします。奇数人数の場合は交代で行ってください。

  1. Server を起動し直す
  2. 無線LAN SSID:0sakamoto, password:0sakamoto に接続する
  3. コマンドプロンプトやPowerShellを起動し、 ipconfig コマンドで自分のIPアドレスを、調べる。
  4. ペアで IP アドレスを交換する
  5. Client で、"127.0.0.1" と書かれている部分を相手のアドレスに 書き換える
  6. Client を起動する。
  7. Client で絵を描く。相手のServerの画面にも自分の描いた線が自分の色で描かれることを確認する。
  8. 相手のClientで描いた絵が自分のServerの画面に描かれることを確認する。
  9. 自分のServerの画面に描いた絵が相手のClientの画面にも描かれること を確認する
  10. 通信により、反応が悪かったり、線がとぎれとぎれになったりするなど、通信上の特性を体感すること

ワーク7-3

グループで一枚の絵を書きます。 提出物は画面の絵ですので、提出を意識して絵を描いてください

  1. 班で一人をサーバとして選びます。
  2. サーバの人のIPアドレスを全員で共有します。
  3. サーバの人はServerを起動します。
  4. その他の人は、Client でIPアドレスをサーバのIPアドレスに書き換え て起動します。
  5. サーバの人はServerの画面を、その他の人はClientの画面を使って共同で 絵を書きます。
  6. テストが終わったら、全員でServerまたはClientを再起動して、仕上げ の絵を書きます。
  7. 提出用にスクリーンショットを取ります

7-4. 講義

TCP

Transmission Control Protocol(TCP)はインターネットにおいてメッセージを交換するためのプロトコルです。 これは、端末と端末同士を接続するEnd to End のプロトコルです。 端末間同士ではIPを利用してパケット通信ができるだけですが、これを利用 してパケットよりも大きなファイルを高い信頼性で送ることを実現します。

TCP はポート番号という16bitの番号(0〜65535)までの数で多重化されてい て、それぞれで異なるやり取りをすることができます。 通信形態としては、受け側と送り側があり、通常、受け側は サーバ、送り側はクライアントと呼ばれます。 ポート番号のうち、0から1023までは世界共通でサービスが決まっています (システム領域) 。 特に、80はWWWのポートとして利用されています。 1024から49511までは様々なサービスに使われますが、よく使われる番号は 共有されています。 例えば、8080も実験的なWWWのポートとして利用されています。 49512から65535まではprivateポートといい、自由に使えます。

ソケット

インターネットに対応しているOSにはTCPを使うApprication Program Interface(API)としてソケットと呼ばれる仕組みが用意されて います。 これは、ファイルを扱うのと同じ要領で、ネットワーク間のファイル転送を 実現するものです。

ファイルをプログラムで扱う場合、ファイル名を指定して open することで、 ファイルハンドルを得て、ファイルハンドルに対して、write や read など の操作を行い、最後に close して処理を終了します。

一方、ソケットでは、クライアントとサーバで処理が違います。

クライアントはサーバのアドレスとポートを指定することでソケットを得て、 そのソケットをファイルハンドルのようにreadやwriteて文字列を書いたり 読んだりすることで通信を行います。 従って、クライアントからはほとんどファイルと同様の手順で TCP の通信を 行うことができます。

一方、サーバーはもう少し複雑です。 サーバはクライアントを受け付けると言う仕事と、実際にクライアントにサー ビスを提供すると言う二つの仕事をします。 クライアントへサービスをしている間でも、他のクライアントを受け付けられ るように、通常、受け付け用のポート、プロセスと、サービス用のポートやプ ロセスは別になります。 この考え方をソケットに当てはめると次のようになります。

  1. サーバはまず受け付け用のソケットを作ります。
  2. クライアントの要求が来たら、サービス用のソケットを得ます。
  3. サービス用のソケットを使うサービスプロセスを起動します。
  4. 1 へ戻る。

このような手順を踏むことになりますが、記述の仕方はプログラミング言語に 依存します。 但し、 OS レベルとしてはプリミティブ(基本操作)として次の動作が提供され ます。

クライアントの動作
  1. 特定のホスト、特定のポートに CONNECT
  2. ソケットを得る
  3. ソケットに対して SEND, RECEIVE でデータのやりとりをする
  4. DISCONNECT
Processing
  1. import processing.net.*; でネットワークのライブラリ を読み込む
  2. Client c; などでクライアント用の変数を作る
  3. setup メソッド内で c = new Client(this, "IPアドレス", ポート番号); などと、クライアントオブジェクトを作成する
  4. drawメソッド内で dataIn = c.read(); c.write("文字列") でサーバとやり取りをする。
サーバの動作
  1. 特定のポートを LISTEN する(接続待ち状態)
  2. 接続要求を受けたら、サービスを開始するため、サービス用のポートを用 意する
  3. 別ポートを使用するサービスプロセスを起動する
  4. 1 へ戻る
Processing
  1. Server s;など、サーバの変数を作る
  2. setupメソッドでs = new Server(this, ポート番号); などとサーバオブジェクト作成
  3. drawメソッドで Client c = s.available(); と接続してきているクライアントと繋がるクライアントを求め、求めたク ライアントを使って read, write を行う。

TCPの内部処理

TCPはファイルの送受を双方向で行います。 一方で、通信はすべて IPパケットを介して行います。 そのため、TCPの内部ではかなり複雑な処理が行われていて、様々なアルゴ リズムが開発されています。

  1. ポートによる多重化
  2. ファイルをセグメントに分割する
  3. 宛先ポート番号、セグメント番号の記入されたセグメントを作る
  4. セグメントを一気に送ったらネットワークが輻輳してしまう。 そのため、輻輳制御ウィンドウという送信可能セグメント幅 を決める変数を用意しておいて、その幅に従ってセグメントを徐々に送 る
  5. 受け取った側は、受領した印に、次に必要なセグメント番号を記入した受 領証(Acknowledgement ACK)を送る
  6. 送信側は送られてくるACKを元に、失ったセグメントを再送したり、輻 輳制御ウィンドウを調整したりする
  7. 受け取り側は、受け取ったセグメントを組み立ててファイルにし、アプ リケーションプログラムに渡す

送信側として輻輳制御ウィンドウを始め1とし、ACKを受け取るたびに輻輳制 御ウィンドウを1ずつ増やすアルゴリズムをスロースタートと呼 びます。

問題

単位時間ごとに、輻輳制御ウィンドウの示す数のセグメントを確実に送ること ができると仮定した場合、 スロースタートアルゴリズムで、輻輳制御ウィンドウは時間に対してどんな関 数になりますか?


坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科