通信プリミティブ

情報学類 分散システム					2008年12月09日

                                       筑波大学システム情報工学研究科
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-2008/2008-12-09
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■復習

■今日の大事な話

資料: 谷口 秀夫 (編), 谷口 秀夫, 佐藤一朗, 佐藤 文明, 柴田 義孝, 新城 靖, 横山 和俊 (著): "情報処理学会編集 IT Text 分散処理", オーム社 (2005年9月). ISBN: 4274201333.

第2章 基盤技術 (新城)

■プロセス間通信

2つの重要なパタン プロセス間通信の構造化。send, receive は、goto 相当。

◆プロセスとメッセージ

分散システム: 離れていても心は1つ

ネットワークで接続された複数のコンピュータ上で複数のプロセスを動作させ る。プロセスは、全体として1つの仕事を成し遂げる。

ノード:プロセス、あるいは、コンピュータ

メッセージ:ノード間で交換されるデータ

分散システムでは、次のような集中システムでは普通に使える共有資源が使えない。

分散共有メモリ、分散ファイルシステムが使える場合は 使う方法も検討してもよい。

◆通信プリミティブ

メッセージを送信したり受信したりするライブラリ関数やシステム・コールを 通信プリミティブという。 最終的には、ハードウェア。 分散プログラムを記述する時には通信プリミティブを呼び出した段階まで考え ればよい。以後、プログラミング言語の実行時システムやOSが考える。

◆sendとreceive

通信の基本命令
send()
メッセージを送信する
receive()
メッセージを受信する。

◆通信プリミティブの分類

◆信頼性の有無(reliable or non-reliable)

信頼性性があるかないか。専門用語では、程度問題(高い低い)ではなく、有 るか無いか。

信頼性がある通信プリミティブを利用した場合、あるプロセスが送信したメッ セージは、途中で失われることはなく、有限時間以内に通信相手のプロセスに 送り届けられる。

分散システムでは、メッセージは、失われることがある。

信頼性に対する態度

◆結合(コネクション)が作られるか結合が作られないか

結合が必要な通信プリミティブ
実際に send や receive でメッセージを送受 信する前に結合を確立させる手順を踏む。電話。
結合が作られない通信プリミティブ
送りたいデータをすぐに send することができる。郵便。

プロセスAとプロセスBの間に結合がつくられる時と作られない時

図? 結合が作られる通信プリミティブと結合が作られない通信プリミティブ

◆接続の確立と送受信

接続を作る通信プリミティブでは、send(), receive() で送受信する前に接続 を確立する必要がある。通信の確立では、 電話と似ていて、発信側と着信側に 分かれる。

着信側

    make_port(); // 受付端の登録。
    accept();    // 実際の受付。connect() と対応。

    receive();
    send();
    receive();
    send();

    close();     // 接続の切断。
発信側
    connect();   // 接続要求。accept() と対応。

    send();
    receive();
    send();
    receive();

    close();     // 接続の切断。

◆接続を用いない通信

接続を用いる操作がない。send() と receive() が対応しているだけ。

プロセスA

    receive();
    send();
    receive();
    send();
プロセスB
    send();
    receive();
    send();
    receive();

◆アドレス指定

ほとんどの通信プリミティブは、間接。

◆TCP/IP

TCP/IP は、性質が違う2つのプロトコルから構成されている。 普通にアプリケーションが使うのは、上位の TCP。

◆IP

IPデータグラム(datagram)転送サービス

◆TCP

ストリーム転送サービス データの区切りが保存されると、sequenced packet と呼ばれる。

◆UDP

IPと同じく、データグラム(datagram)転送サービス。 IPと違うのは、アドレス指定のみ。

◆どの通信プリミティブを使うか

分散システムを構築する時に、どの通信プリミティブを使うか 独自の例
順序付きパケット。
ストリームと似ているが、メッセージの区切りが保存される。 TCP で、メッセージ本体の前に、バイト数を送ることで実装できる。
信頼性のあるデータグラム
通常のデータグラムと似ているが、メッセージが紛失した時に再送する。

◆まとめ

TCP IP UDP イーサネット 電話 郵便
信頼性 あり なし なし なし あり なし
アドレス指定 間接 間接 間接 間接 間接 直接
結合   あり なし なし なし あり なし
方向 双方向 単方向 単方向 単方向 双方向 単方向
マルチキャスト 不可 可能 可能 可能 可能 不可
* OS 内。

■marshaling/unmarshaling

プログラム中のデータ項目とネットワーク上を流れるメッセージに対応づける。
marshaling (整列化)
メモリ中からデータ項目を集めて、ネットワークでメッセージとして 転送するのに適した形式にまとめる。
unmarshaling (非整列化)
逆。
英語の綴りは、l が1つのものと2つのもの(イギリス綴り)がある。教科書によって違う。

プロセスAがメモリ中のデータを1個にまとめてネットワークに送り出す。プロセスBが受け取り元に戻す

図? marshalingとunmarshaling

4個の要素からなる構造体を整列化して送信している。 整列化する基本的な方法 ネットワークからデータを受け取ると、先頭から解釈して元のデータを再現す る。

ネットワーク上を流れている時には、整列化された データの先頭にはネットワークのヘッダが付加されている。

◆整数のmarshaling

分散プログラムでは、メッセージを送信するプロセスと受信するプロセスが異 なる CPU で実行されることがある。整数をmarshalingする時には、次のような 点を考慮する必要がある。

◆バイト・オーダ

整数を送るだけでも、バイトオーダに気をつける必要がある。

C言語で扱える整数

(現在のコンピュータのほとんどは、バイト単位でアドレスを付けているので、 1バイトの整数については、バイトオーダの問題はない。)

2バイト、または、4バイトの整数をメモリに保存する方法 : メモリの下位番地に上位バイトを置くか下位バイトを置くか

リトルエンディアン
下位番地に下位バイトを置く。x86 (Intel Pentium/Core, AMD Athlon/Phenom)。
ビッグエンディアン。
下位番地に上位バイトを置く。PowerPC, SPARC, m68k
PowerPC は、両方切り替え可能だが、ビッグエンディアンで使うことが多い。

0x12345678を2000番地に保存する。

図? バイト・オーダー

◆ビッグエンディアンとリトルエンディアンの比較

◆送り方

現在、ネットワーク・バイト・オーダとしては、ビッグエンディアンが広く 使われている。

◆バイトオーダを変換するライブラリ関数

名前 方向 ビット数
uint32_t htonl(uint32_t hostlong) ホストからネットワークへ変換 32ビット
uint16_t htons(uint16_t hostshort) ホストからネットワークへ変換 16ビット
uint32_t ntohl(uint32_t netlong) ネットワークからホストへ変換 32ビット
uint16_t ntohs(uint16_t netshort) ネットワークからホストへ変換 16ビット

◆htonl() を使った整数の送信

unsigned long int hostlong, netlong;    
hostlong = 0x12345678 ;    
netlong = htonl( hostlong );    
send(conn, &netlong, sizeof(netlong), 0);

◆snprintf()/strtol()

snprintf() で文字列に直して送り、strtol() や atoi() でもどす方法もある。 文字列文化。インターネットのアプリケーションでよく使われる。

送信側:

    char buf[BUFSIZE];
    hostlong = 0x12345678 ;    
    snprintf(buf,BUFSIZE,"%d\n",hostlong );
    send(conn, buf, strlen(buf), 0);
思ったほど遅くはない。

注意:sscanf() は、整数をデコードするために使う分には問題ないが、 文字列を受け取るために使うとバッファ・オーバーフローが生じる可能性があるので、 使わない方がよい。

◆文字列のmarshaling

Unicode BOM (byte order mark) 0xffef。

◆XDR

SunRPC (後述) で使われているデータ形式。バイナリ文化。

rpcgen というスタブ・コンパイラがある。 データ構造を与えると、marshaling を行う手続きを自動生成する。

SunRPC を使わなくて、XDR だけを使う方法もある。

xdrmem_create(XDR *, const caddr_t, const uint_t, const enum xdr_op)
メモリの指定されたの番地に保存/回復/メモリの解放。
void xdrstdio_create(XDR *, FILE *, const enum xdr_op)
FILE * を通じて、構造体の読み書き。

◆その他

■クライアント・サーバ・モデル

手続き呼出しの形に見えたら RPC (Remote Procedure Call)。

通信を構造化。send()/receive() を直接使うのは、goto (jump) でプログラ ムを書くようなもの。call/if/while で書きたい。

プロセスを2種類に分類する。通信は、次のパタンを繰り返す。

クライアント
先にメッセージ(要求)を send() 1回、後でメッセージ(応答)を receive() 1回
サーバ
先にメッセージ(要求)を receive() 1回、後でメッセージ(応答)を send() 1回
send() の回数と receive() の回数は同じ。相互に繰り返す。

図? send(),receive()と繰り返すクライアントと receive(),send() と繰り返すサーバ

図? 通信のパタンからみたクライアントとサーバの定義

◆クライアントとサーバに分けて考える意義

混沌とした通信を「構造化」してわかりやすくする。

図? プロセス5つ、構造化されていない通信パタン

図? 構造化されていないもの

図? プロセス5つ、構造化された通信パタン

図? 構造化されたもの

構造化プログラミング:分かりにくいgoto文をつかわないで、わかりやすい goto文だけ使う。

◆サービスの授受

元々の意味
クライアント(client)
サービスを受ける方、顧客
サーバ(server)
サービス(service)を提供する方

図? サービスの授受によるクライアントとサーバの定義

図? サービスの授受によるクライアントとサーバの定義

◆利用者数

サービスを提供する方は、1つのプログラム(コンピュータ)で複数の利用者 の面倒をみる。その結果、1台のサーバに複数のクライアントがつながる。

クライアント
一人で使うもの
サーバ
複数人で共有するもの

図? 複数のクライアントによるサーバの共有

図? 複数のクライアントによるサーバの共有

◆接続方法

TCP/IP の通信では、通信を始める前に、まず、通信路を作る作る必要がある。 これは、電話で話をする前に、まず、電話をかける操作を行うことと似ている。
クライアント
電話を掛ける方に相当する
サーバ
電話を待っている方

以上のように、クライアントとサーバは、いろいろな意味で使われる。これら の意味は、多くの場合、一致しているが、一致していないこともある。

◆能動的・受動的

通信を開始するパタンで、コンピュータ、プログラム、人間は、次の2つに分 類される。

能動的(active)
ほっといても自分でメッセージを発信し始める
受動的(passive)、受け身
何か言われると答えるが、自分ではメッセージを発信し始めることはない
クライアントとサーバから作られたシステムは、クライアントが能動的になり、 サーバは、受動的になることが多い。

図? 能動的なクライアントと受動的なサーバ

図? 能動的なクライアントと受動的なサーバ

例:WWWサーバは、WWWクライアントから何か要求が来ない限り、ずっと 黙っている。

コンピュータを使う時には、人間が能動的になり、コンピュータが受動的にな る。

テレビを見ている時には、人間が受動的になり、テレビが能動的になる。

講義形式の授業では、サービスの授受では、教官がサーバで、学生がクライア ントになる。通信の開始の方法では、教官が能動的になり、学生が受動的にな る。

大学以上では、学生は、能動的になることが求められている。

◆Peer to Peer (P2P)

P2P (Peer to Peer) という用語の意味は、怪しい。

混沌とした通信を 構造化 してわかりやすくしたものが、クライアント・サーバ・モデルである。

サーバあるシステムでは、サーバが落ちるとシステム全体が動作しなくなる。 このように複数の要素から構成されているシステムで、ある要素が故障した時 に、全体が動作しなくなるような場所を、単一障害個所(single point of failure) という。

コンピュータサイエンスでは、古くから、単一障害個所を避けるための研究が 行われてきている。もっとも成功している方法は、サーバを複数用意する方法 である。

サーバがないシステムでは、下手に作るとどの要素が故障してもシステム全体 が止まってしまうことになる。

サーバがないシステムで成功している例はある。

peer は、「対等の仲間」の意味。「通信相手」という意味もある。

検索は、サーバで索引を集めた方が速い。Web 上の検索エンジンなど。

サーバがない方法の利点(特徴)

サーバがない方法の問題点 Napster

Napster は、学問的には、特に目立った新技術はない。

◆RPC

クライアント・サーバ・モデルに基づくプロセス間通信で、 手続き呼出しの形に見えたら RPC (Remote Procedure Call) ( 遠隔手続き呼び出し )

■今日のまとめ

プログラムのパタン。

◆クライアント

要求を一度だけ送る場合。クライアントは複数回動作したり、複数のクライア ントが同時に動くことが多い。
main() {
    connect(); // 結合が作られる通信プリミティブを使う時
    marshal();
    send();
    receive();
    unmarshal();
    close();   // 結合が作られる通信プリミティブを使う時
}

◆サーバ

サーバ側は、無限ループを含み、何度でも要求を受け取る。
main()
  make_port(); // 結合が作られる通信プリミティブを使う時
  while( 1 )
  {
    accept(); // 結合が作られる通信プリミティブを使う時
    receive();
    unmarshal();
    仕事();
    marshal();
    send();
    close(); // 結合が作られる通信プリミティブを使う時
 }
}

Last updated: 2008/12/07 20:15:09
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>