コンピュータネットワーク入門・・・コンピュータネットワークってどうなっているの?

 他のコンピュータとは接続せずに独立して処理を行うコンピュータ、あるいはその状態をスタンドアローンといいますが、以前はほとんどの場合はスタンドアローンでした。しかし、現在はコンピュータはネットワークにつないで利用するのが一般的だといっていいでしょう。では、なぜネットワークにつなぐのでしょうか。ネットワークにつなぐと当然のことながらウィルス感染の可能性もありますし、不正アクセスの可能性もあります。このような不利益があるとしても、それに勝る利点があるということでしょうか。

 単純に考えてもコンピュータのネットワーク化には利点が多そうです。たとえば、プリンターなどの資源をネットワーク経由で使えれば、コストの削減になります。資源は装置だけではありません。もっとも価値のある資源は情報資源です。1つのコンピュータにファイルなどを集約して、それを複数のコンピュータから利用するというのがひとつの形です。このような使い方をクライアントサーバ方式といいます。クライアントサーバ方式は現実社会では、患者さんとお医者さんの関係、依頼人と弁護士さんの関係などになぞらえられます。クライアントは能動的です。患者さんや、依頼人に該当します。これに対して、サーバは受身です。お医者さんや、弁護士さんです。患者さんや依頼人が最初に動かないと、これらの関係は機能しません。

 クライアントサーバシステムを実現するにはコンピュータ同士を接続しなくてはなりません。それでは、どのようにコンピュータをつなぐのか、その方法について具体的に詳しく勉強していきましょう。




1.コンピュータを1対1で直接接続してみよう

 コンピュータをつなぐといっても発電機と扇風機をつなぐようなわけにはいきません。送るのは電気エネルギーではなく情報ですので、それなりの工夫をしなくてはなりません。それも単純な工夫ではありませんので、説明がこの先延々と続くことになります。はじめは簡単なことからはじめて徐々に拡張していくことにしましょう。

 プログラミングの入門書などは、「Hello world」という言葉をどのように画面上に印字するかという説明から始まっているものが多いのですが、この言葉は長いので、ここでは「Hello」という言葉を相手のパソコンに送信するにはどうしたらいいかというところから始めたいと思います。

左側のパソコンAから「Hello」と、右側のパソコンBに呼びかけてみよう!

 左側のパソコンAがHelloといい、それを右側のパソコンBに送信し、それを理解してもらうにはどうしたらいいでしょうか。



1.1 コンピュータに分かるのは「0」と「1」だけ

 コンピュータには電圧が高いか低いか、電流が流れているか、流れていないか(ONかOFFか)ということしか理解できません。ここでは高い電圧と低い電圧を組み合わせて相手に送ることで情報を伝達したいと思います。
 電圧が高い状態を「1」、低い状態を「0」と考えてみるのが1つの案です。これはあくまで案であり、実際は余りいい案とは言えませんが、最初ですので説明の簡単なものを選びました。
 ここでは、伝送路上(パソコンAとパソコンBを結ぶコード)に1度に1つずつ「1」あるいは「0」を逐次的に送ることで情報を送信することを考えたいと思います。「1」あるいは「0」はデータの最小単位で、これをビット(bit)といいます。このように1度に1ビットずつ送る方式をシリアル方式、あるいはシリアル通信といいます。

1.2 0と1で情報を表すには

 0と1を使って情報を表現するには、0と1の組み合わせに対して、情報の基本単位である文字を割り当てます。1ビットだと、2種類の文字しか割り当てられません。2ビットになると、00、01、10、11の合計4つの組み合わせが考えられますので、4つの文字を割り当てることが可能になります。0と1の組み合わせに対する文字の割り当ての方法を文字(character)コード(code)といいます。 8ビットなら256種類の文字を割り当てることができます。2^8 = 256 です(「^」は累乗を表すものとします。以後も同様に「^」を使いますので注意して下さい)。
 コンピュータの開発当初は、コンピュータ1台1台が独立して動作することを前提にしていましたので、コンピュータの開発会社がそれぞれ独自に文字コードを開発しました。しかし、コンピュータをネットワークにつないだ方がいいということになったとき、違う文字コードを利用しているコンピュータ同士は通信できないことが分かりました。特定の0と1の組み合わせに対して、2つのコンピュータが異なる文字を割り当てているとすると通信ができないのは当然です。

A社独自の文字コードを使ったパソコンAとB社独自の文字コードを使ったパソコンBでは、話が通じない 

1.3 文字コードの共通化

 そこで出てきたのが文字コードの共通化の必要性です。共通のコードとして良く利用されるのがASCII(American Standard Code for Information Interchange、情報交換用米国標準符号)(通称はアスキー)コードです。ASCIIコードは英語や西ヨーロッパ言語で使用されるラテン文字を中心として文字コードです。ASCIIは7桁の2進数で表すことのできる整数(0000000~1111111までの128通りの整数)のそれぞれに、大小のラテン文字や数字などを割り当てています。ASCIIのコード表は次のようになります。

ASCIIコード表
     0   1   2   3   4   5   6   7
  0  NUL   DLE  SP   0   @  P   `  p
  1  SOH    DC1  !  1  A  Q  a  q
  2  STX    DC2  "   2  B  R  b  r
  3  ETX    DC3  #   3  C  S  c  s
  4  EOT   DC4  $  4  D  T  d  t
  5  ENQ    NAK  %   5  E  U  e  u
  6  ACK   SYN   &   6  F  V  f  v
  7  BEL  ETB  '  7  G  W  g  w
  8  BS   CAN   (   8  H  X  h  x
  9  HT   EM  )   9  I  Y  i  y
  A  LF   SUB   *   :  J  Z  j  z
  B  VT   ESC   +   ;  K  [  k  {
  C  FF   FS   ,   <  L \  l  |
  D  CR   GS  -  =  M  ]   m  }
  E  SO   RS   .   >  N  ^  n  ~
  F  SI   US   /   ?  O  _  o  DEL

※最上位行は上位3ビットを、左側の列は下位4ビットを表しています。
※ただし、5Cの「\」はバックスラッシュとなります。

アルファベットと数字は問題ありませんが、制御文字は分かりにくいと思いますので、説明します。

制御文字
 16進数 制御文字 スペル  意味
0x00 NUL Null 空文字
0x01 SOH Start Of Heading ヘッダの開始
0x02 STX Start Of Text テキストの始まり
0x03 ETX End Of Text テキストの終わり
0x04 EOH End Of Transmission 伝送の終了
0x05 ENQ Enquery 問い合わせ 
0x06 ACK Acknowledgement 肯定応答
0x07 BEL Bell 警告音を鳴らす
0x08 BS Back Space 一文字後退
0x09 HT Horizontal Tabulation 水平タブ
0x0A LF/NL Line Feed/New Line 改行
0x0B VT Vertical Tabulation 垂直タブ
0x0C FF/NP Form Feed 改ページ
0x0D CR Carriage Return 行頭復帰
0x0E SO Shift Out シフトアウト(多バイト文字終了)
0x0F SI Shift In シフトイン(多バイト文字開始)
0x10 DLE Data Link Escape データリンク拡張(バイナリ通信開始)
0x11 DC1 Device1 制御装置1
0x12 DC2 Device2 制御装置2
0x13 DC3 Device3 制御装置3
0x14 DC4 Device4 制御装置4
0x15 NAK Negative Acknowledgement 否定応答
0x16 SYN Synchronous idle 同期
0x17 ETB End of Transmission Block 伝送ブロック終了
0x18 CAN Cancel 取り消し
0x19 EM End of Medium 記録媒体終端
0x1A SUB/EOF Substitute/End Of File 文字置換/ファイル終端
0x1B ESC Escape エスケープ(特殊文字開始)
0x1C FS File Separator ファイル区切り
0x1D GS Group Separator グループ区切り
0x1E RS Record Separator レコード区切り
0x1F US Unit Separator ユニット区切り
0x20 SP Space 空白文字
0x7F DEL Delete 一文字削除

 ASCIIは7ビットで128通り(2^7=128)の文字を表現することができますが、ASCIIコードができたころにはすでにコンピュータが出現していました。コンピュータは8ビット(情報工学の分野では、8ビットは1バイトというのが普通;ただし、情報通信の世界では1オクテットということが多い)をひとかたまりとしてデータを処理するのが一般的です。したがって、7ビットいうのは中途半端な数になります。そこで当初は、残りの1ビットをエラー検知用のビットとして使うことになりました。このビットをパリティビットといいます。

 パリティという言葉は数学や物理学ではそれぞれ独特の意味で使われていますが、情報通信や情報工学の世界では、ある数字の並びの合計が偶数か奇数かを比較することで通信の誤りを検出する技術として使われています。偶数の場合を偶数パリティ(even parity)、奇数の場合を奇数パリティ(odd parity)といいます。

 先ほどのパソコンAがパソコンBに「Hello」と呼びかけるという例に戻ってパリティの説明をします。Helloの「H」をAsciiコードで表すと48となります。「48」と表すと10進法なのか16進法なのか分からないという場合は最初に0xを付けます。0x48と表せば、16進表示という約束になっています。0x48を2進表示すると「100 1000」となります。8ビットずつ送信するとして、送信ビットの中の1の数の合計を偶数にするようにパリティビットを調整して追加するという約束にすると、「100 1000」には既に偶数個の1が存在しますので、0を追加して、「0100 1000」となります。受信側では1の数を数えます。1の数が偶数になっていないとすると、どこかのビットが反転している可能性があります。このようにして通信の途中での誤りを見つけることができます。しかし、2つ以上のビットが同時にエラーを起こすと、エラーが起きたかどうかは分からないというのが痛いところです。

 8ビットを目いっぱい使うと256通りの場合分けができるので、256種類の文字を表すことができます。したがって、ASCIIのように1バイトで128通りの文字列しか割り当てないというのは非常にもったいないことです。さらに128通りの文字を割り当てることができれば、たとえば日本語の半角カタカナなどをその残りの128の枠に割り当てられるではないかということになります。残り128の部分に文字列を割り当てたASCIIコードの修正版が様々な国で作成されました。

 日本では、ASCII文字に半角カタカナを追加した8ビットのコード体系が作成されました。これはJIS X 0201と呼ばれています。正式にはもちろんASCIIコードではありませんが、ASCIIコードと呼ばれることもあります。

 8ビットコードは様々な国でコード化されたためたくさんの種類があるのですが、8ビットコードにも標準ができています。7ビットコード(正式なASCIIコード)では、英語しか扱えませんが、せめて英語に近いラテン文字の言語、たとえばドイツと、フランス語、スペイン語などで使う文字を追加しようということになり、ß(ドイツ語)、è(フランス語)、ñ(スペイン語)などが使えるようにしたものです。この場合は、ASCIIコードに対応する文字の部分は、最上位ビットとして"0"を追加することになります。

 以上のようにASCIIコードで送ると言っても、最上位にパリティビットを追加するのか、その場合は偶数パリティなのか、それとも奇数パリティなのか、あるいは最上位ビットに"0"を追加するのか、いろいろまぎらわしいことになります。今は、コードの正確性よりもシリアル通信の実験ですので、簡単のために最上位に"0"を追加するということにして、説明を続けることにしましょう。



1.4 文字を送るにはどんな手順が必要か

1.4.1 どんな順番で送ればいいのか

 HelloをASCIIコードに変換する場合、16進表示をすると"48656C6C6F"となります。これをどんな順に送ったらいいでしょうか。これについても決まりがないと、送り手と受け手で意思の疎通ができません。

 バイト単位では、上位から順番に送信するのが標準です。最初に「48」、次に「65」、「6C」と順番に送信します。では、バイトの中はどうでしょうか?バイトの中は最上位ビット(Most Significant Bit、MSBと略記)から最下位ビット(Least Significant Bit、LSBと略記)の順に送るやり方と、最下位ビットから最上位ビットの順に送るやり方があります。

 バイトの中はLSBからMSBの順に送信するのが一般的です。0x6C=0110 1100では最下位ビットの"0"、次に"0"、"1"、"1"という順に送信されます。次は0x6Cを最下位ビットから送信する方式で送った場合の例です。

しかしこれではどこが文字の境目か不明確?読み込みのタイミングがずれると、受信側は何が何だか分からなくなる 

1.4.2 通信には標準が必要

 データを順序良く送信し、相手側もその順番を承知しているとしても、電圧がどれ以上なら電圧が高いと判断していいのか分かりません。電圧の取り決めをしていないと、全ビットが「0」と取られてしまう可能性があります。また、単一ビットの幅はどれくらいにしたらいいでしょうか?単一ビットの幅が、送信側と受信側で一致していない場合、送信側が「1」のつもりで送っても、受け手には「11」と取られる可能性があります。
 高電圧を何ボルト以上とするか、あるいはビットの読み取り幅を何ミリ秒とするかなど正確に取り決めておかないと、同じメーカの製品同士でないと通信ができないということになります。

 そこで通信システムの方式にも取り決めが必要となります。メーカーが製品を開発する際に取り決めた詳しい設計のことを仕様(スペックということもあります。Specification)と言いますが、この仕様を取り決めるときに参考になるような決まりが必要ということです。これを標準仕様と言います。

 コンピュータに関する標準化団体としては、国際的な団体としては、IEC(国際電気標準会議)、ITU(国際電気通信連合)、IEEE(電気電子学会)などがあります。日本国内にはJSA(日本規格協会;JIS規格の発行)、TTC(情報通信技術委員会)等があります。また、特定分野に特化したものとして、IETF(インターネット技術)、W3C(WWWに関する技術)、Wi-Fi Alliance(無線LANに関する技術)などがあります。

1.4.3 シリアル通信のプロトコル

 ネットワーク上での通信の手順を通信手順とか通信規約などと言います。英語にするとCommunication Protocol(通信プロトコル)です。通信を成り立たせるためには様々な手順が必要ですが、とりあえずは1対1で接続されたパソコン同士がシリアル通信をする際に必要な取り決めについて考えてみましょう。

 電圧が高いか低いかはどういう基準で決めるかについては、1に該当するのは何ボルトから何ボルトの範囲、0に該当するのは何ボルトから何ボルトというように決めます。1ビットの幅をどれくらいにするかも重要です。1ビット当たり何秒あるいは何ミリ秒電圧を保持しなくてはならないかですが、これは直接的に決めるのは少し難しくなります。なぜなら、電気の速度が速すぎて1ビットの幅が短すぎるからです。そこで1秒で送信できるビット数という形で表現することにします。例えば、1秒間に9600ビット送信するというような場合は9600ビット/sとなります。ビットあたり(per)何ビットですので、単位はbps(bits per second)が使われます。従って、9600ビット/sは9600bpsとなります。

 1ビット幅をどれくらいにするかについては、難しい問題があります。まず、第1にハードウェア的に正確に電圧を発生させたり、ある電圧から他の電圧に瞬時に変化させることのできる装置は存在しません。また、電気を完全に制御できる導線もありません。電圧を上げるにも下げるにも小さな時間を必要とします。従って、送信装置が生成する波形の不完全性をどこまで許容するかを標準で決めることになります。受信側でいつ電圧を測定するかも標準で決めるということになります。

 次に電圧の理想形と実測値の例を示します。

送信側から送られてくる電圧の波形は通常歪んでいるので、受信側がいつ電圧を測るかで、電圧の値が違ってしまう。 

 ハードウェアが信号を変化させることが出来る最大頻度をバンド幅(bandwidth、単位はHz)(デジタル的にはbpsと同じ)と言いますが、送信側がバンド幅以上の早い変化で送信をしようとすると、ハードウェアは追随できなくなります。これは、送信機が次の変化を送信しようとする前に、ハードウエアが1つの変化を完了できないからです。そのため変化のいくつかは失われます。

 ビット幅の取り決めは政治的な面も含まれてきます。どれくらい短い幅のビットを読み取れるかは、通信装置メーカーの技術力という面も強いので、ライバルを打ち勝てるかどうかという競争となります。特定の会社にしかできないことが標準として決まってしまうと、他社はその分野から撤退しなくてはなりません。

 ビット幅が決まったとして次は、これをどのようにして実現するかということになります。



1.4.4 同期

 コンピュータが外部と通信をするときに、信号そのものを正しく伝えると同時にそれを適切なタイミングで検出できるようにする仕組みを同期と言います。

 同期をとるための一番簡単な方法は、データの送信と並行して、タイミングを取るための信号(タイミング信号)を送ることです。このような方式は外部同期方式と言います。しかし、そのためには複数配線が必要となります。この方法は距離の長い通信には不向きです。今はシリアルにデータを送信することを考えていますので、これは採用できません。

 データ信号の中に同期信号を含める方式を自己同期方式、あるいは内部同期方式と言います。
 
 ビット単位で同期をとる方法は、調歩同期方式と言います。あるいはこれは非同期式だからというわけでしょうか調歩式非同期と呼ばれることもあります。この方式では、1バイトごとにスタートビットとストップビットを使います。情報がない場合はずっとストップビットを流し続け、情報を送信するときにはスタートビットを1ビット送出し、その後に情報ビット(1文字分;7ビット、あるいは8ビット、更にパリティを送ることもあります)を送出し、その後ストップビットを送出します(ストップビットは1ビット、1.5ビット、2ビット等の種類があります)。文字を送り続ける場合は、「スタートビット」+「情報ビット」+「ストップビット」を繰り返します。送る情報が無くなれば、またストップビットを流し続けます。同じ1ビットの周期で送信側と受信側が「調歩」するために、送信側では自分のクロックに合わせてデータの送信を行い、受信側では受け取ったビットに合わせて自分のクロック信号を調整します。スタートビットとストップビットで同期をとっているわけですから、やはり調歩「同期」方式というべきだと思います。
 調歩同期方式では、1バイトごとにスタートビットとストップビットを付けますので、送信者は送信と送信の間を任意の長さで待つことが出来ます。これは文字と文字との間の間隔を自由に空けることが出来るという意味です。これは、キーボードとコンピュータの間の関係としては最適です。ソフトウェアとハードウェアが簡単であるということも利点です。欠点は、伝送効率が悪いということです。伝送効率のことをあまり考慮する必要のない通信ではよく利用されます。例えば、パソコンをルータやスイッチと直接接続して設定を行う場合などでは今でもよく利用されています。

 情報を1バイトよりも大きなブロックとして送信する場合などにはキャラクター同期やフラグ同期などの方法が採用されます。キャラクター同期は、例えばASCIIコードのSYN(0x16)を転送文字列の前に付加して同期を行う方法(例としてはベーシック同期)です。フラグ同期は文字コードではない一般的なビット列で同期をとる方法です。HDLC(High-Level Data Link Control)という伝送方式の場合は、0111 1110というビット列(フラグ)が伝送ビット列の前後に付加されます。伝送ビット列の中に5ビット以上の1の連続がある場合には、フラグとの誤認を防ぐために、1ビットの0がその後に挿入されることになっています。受信側は、5ビット連続した1の後に0が続くときは0を除去します。インターネットでは、データ伝送部分を規定していませんので、ネットワーク毎に様々なデータ伝送方式が採用されています。大学のいわゆる構内ネットワーク(キャンパスLAN)とか、企業内ネットワークなど(いわゆる企業内LAN)では、イーサネットという方式が採用されていますが、イーサネットは伝送ビットを送信する前にプリアンブルという同期をとるための信号を送信します。プリアンブルは、サイズが8オクテット(64ビット)で、1と0が交互に続き、最後は11で終わっています。

イーサネットのプリアンブル
10101010 10101010 10101010 10101010 10101010  10101010 10101010 10101011

1.4.5 RS-232C

 コンピュータとモデム間、あるいはコンピュータとキーボード間等の短い距離での調歩式同期(通常は、非同期と呼ばれることが多い;非同期という名前の同期方式)のシリアル通信の標準として一般的に広く使われる方式にRS-232Cという方式があります。規格の正式名はEIA-232です。
 パソコンにはRS232C準拠のシリアルポート(COMポート)がついていることが多い(少なくとも昔のパソコンにはついていました)のですが、このシリアルポートはRS232C規格とはかなり違っているようです。これは、IBM社が1981年にIBM/PCを販売した時に、シリアルポートの規格としてRS232Cの規格の一部を借用してこれをRS232C準拠とうたったため、”PCのシリアルインターフェース=RS232C規格”のようになってしまったためです。しかし、ここではRS232C規格とパソコンのシリアル端末の違いをこれ以上論じることは致しません。
 RS232Cでは、1は-15v~-3vで、0は+3v~+15vの間で表現します。データビット数は任意ですが、7ビットあるいは8ビットを使うのが標準です。パリティビットを挿入することもできます。ビット幅については通信を始める前に合意する必要があります。スタートビットは0、ストップビットは1(1ビット、1.5ビット、2ビットの場合など)となります。
 
※RS232Cインターフェース(COMポート、シリアルポート)がついているが使えないというパソコンもあります。これは、最近RS232Cの装置(デバイス)が少なくなったので使用できないようになっているからです(このような場合は、OSのデバイスマネージャに表示されない)。この場合は、PCの起動時にBIOSを起動し(Deleteキーを押しながらということが多いのですが、BIOSのメーカによって違うので各自で確認して下さい)COMポートをEnableに変更して下さい(たぶんDisableの設定になっています)。



2 シリアル通信をしてみよう

2.1 パソコンとルータとの通信

 キーボートを打つとパソコンのディスプレイにその文字が表示されるというのが、今までの説明の実際の動きなのですが、これでは余りにも当たり前すぎて実感がわかないでしょうから、少し違う実験をしてみようと思います。もし皆さんの手元にルータがあったらそれをパソコンとシリアル回線でつないでみましょう。

Cisco Systemsのルータ(表側) Cisco Systemsのルータの背面 ルータ背面のConsoleポート パソコンのシリアル(COM)ポート
       
 ルータ付属のシリアルケーブル   シリアルケーブルにUSBシリアル変換ケーブルを接続  パソコンのUSBポート シリアルケーブルを使ってルータとパソコンを接続 

 ルータとパソコンをシリアル回線で接続するというのはルータの設定をする場合の常套手段です。ルータにはコンソールと呼ばれるポート(インターフェース)がありますので、そのコンソールポートとパソコンのCOMポート(RS232Cインターフェース)を接続します。接続に使うのはシリアルケーブルです。シリアルケーブルはルータを購入した場合に付属品としてついてきているはずです。ただし、インターフェースの形がパソコンのCOMポートの形状と合わない場合は、アダプターが必要となります。

 パソコンにそもそもCOMポートがついていないという場合も最近は多くなっていますが、この場合はパソコン側はUSBポートを使ってください。USBポートからシリアル回線を使う場合は、USBシリアル変換ケーブルが必要となります。

 準備ができたらパソコンとルータをシリアルケーブルで接続します。パソコン側のポートは"COM"と書いてある場合と"|0|0|"と書いてある場合があります。ポートが複数ある場合は、使っているポートが何番か確認して置いてください。ルータ側のポートは"CONSOLE"と書かれていると思います。Ethernetのポートと形状が同じなので間違わないようにしてください。ポートを間違えると、ルータを壊してしまう可能性があります。

 通信をするにはパソコン側でHyperterminalというプログラムを使うという方法が一般的でしたが、最近のWindowsには入っていないようですので、代わりにTeratermを使いましょう。HyperterminalよりもTeratermの方が扱いが簡単です。TeratermはWindowsには入っていませんが、フリーのソフトですので、インターネットで見つけてインストールしてください(Googleで簡単に見つかります)。

 インストールしたらパソコンのディスクトップ上にteratermのアイコンが表示されると思います(デフォルト設定の場合)ので、アイコンをクリックしてください。ポートの選択の画面が表示されますので、シリアルを選択します。ポートは自分のパソコンのポート番号を指定します。USBシリアル変換ケーブルを使っている場合は、「USB Serial Port」を選択します。

 ルータの電源を入れると、ルータの起動の様子がわかります。起動後コマンドを打った様子を次に示します。これでルータとパソコンがシリアル回線を介して通信をしていることが確認できました。

ルータが起動している途中の画面
 
ルータが起動した状態。コマンドプロンプトが表示されている(いつでもコマンド入力を受け付けることができる状態)。 
 コマンドを入力してモードの変更(ユーザモードから特権モードへ)をしたところ




2.2 パソコンとパソコンを1対1で直接接続して通信してみよう

 ルータが手元にあればやってみましょうといいましたが、たぶん多くの方はルータをお持ちでないと思います。自宅でインターネットをするときに使っているブロードバンドルータは、今回の実験には不向きです。そこで、パソコン同士を1対1でシリアル回線で接続することを考えましょう。

 今度もTeratermを使います。ケーブルはシリアルケーブルですが、これは大型の電気店等に売っていますので、買い求めてください。

シリアルリバースケーブル(シリアルクロスケーブル)
※必ずリバースあるいはクロスと明記してあるケーブルを入手してください。
USBシリアル変換ケーブル シリアルリバースケーブルとUSBシリアル変換ケーブルを接続した様子 パソコン同士を1対1でシリアル接続した様子

 パソコンとパソコンを1対1でシリアル回線で結べば、今までの説明通りの実験ができそうですが、少し躊躇して、皆さんが余り持っていそうもないルータを使ったのには訳があります。パソコン同士を1対1で接続するというのは現在では余り需要がありませんので、実験が簡単ではないのです。そこで近いことをやりたいと思います。現在はインターネットの全盛時代ですが、その以前にパソコン通信の時代がありました。パソコン通信の時代に盛んに利用されていた方法が今までの説明に近いので、今回はそれをやってみようと思います。

 電話回線(シリアル回線)でパソコン同士をつないで通信をしていたときの手法がまだ使えますので、それを実験で確認したいと思います。プロトコルとしてはXMODEM、YMODEM、ZMODEMなどがあります。今回はZMODEMを使います。電話回線を使ってパソコン通信をするプロトコルとしては当初XMODEMが開発されましたが、YMODEM、ZMODEMと改良されています。機能的にはRS232Cよりもだいぶアップしています。

 Xmodemの基本を簡単に説明すると次の通りです。
●RS232Cでは1バイトずつ送信していましたが、XMODEMではブロック毎にデータを転送します。ブロックの大きさは、128バイトあるいは1024バイトです。データの最初にはSTX(Start of Text)をつけ、データの最後にはETX(End of Text)をつけます。データの前にはヘッダをつけますが、ヘッダにはデータサイズが入ります。そして、ヘッダの先頭に、SOH(Start of Header)がつけられます。
●受信側では、データの塊を受け取ったら、ACK(Acknowledgement、データを受け取ったことの確認)を返します。送信側がACKを受け取ったら、次のデータブロックを送信します。この繰り返しで、送信側がデータを送り終わったら、EOT(End of Transmission)を送ります。
●エラーの発生を確認する機能もあり、エラーがあったらエラーのあったブロックを再送できます。受信側から再送要求(NAK)を送信することもできます。

 YMODEMはXMODEMを改良し、ファイル名、ファイルサイズ、タイムスタンプなどを送信できるようになりました。一度に複数のファイルを送信することもできます。

 ZMODEMはYMODEMをさらに改良しました。ファイルをパケット単位で送信しますが、YMODEMのようにACKを待って次の送信をするのではなく、ACKを待たずに次のパケットを順次送信できるようになっています。時間内にACKが返ってこない場合は、改めて再送を開始します。これによって伝送速度が格段に改善されました。

 さて準備が整いましたので実験を開始します。パソコンAからパソコンBにファイルを転送します。ここではファイル名はtestfile20160125とします。転送ファイルはパソコンBのTeratermのフォルダーに格納されますので、パソコンB側に同名ファイルが存在していないことを確認しておいてください。デフォルトでは、teratermは"program files"というフォルダーにあるはずです。

 確認はもちろんファイルマネージャ(ファイルエクスプローラ)で構いませんが、今後のことを考えるとShellに慣れておくのもいいかもしれません。ここでは、Windowsシステムに付属しているpowershellというツールで調べる方法を簡単に紹介しておきます。

 OS(Operating System、オペレーティングシステム)の核心的な部分はカーネル(kernel)などと呼ばれます。カーネルは非常に大切な部分ですので一般ユーザには余り触らせたくない部分です。しかし、どうしても触らないと困る場合もあります。そこで、ユーザがカーネルと話し合うために特別なツールが必要となります。これがShell(シェル)です。Windowsは以前から「コマンドプロンプト」というシェルをユーザに提供していましたが、コマンドプロンプトを機能強化したものがpowershellです。

 powershellはWindows7ではStartボタンから「すべてのプログラム」を選んで、「アクセサリー」の中から探してください。Windows8.1の場合は、「スタートボタン」から「↓」をクリックして探してください。

 powershellのコマンドをいくつか紹介します。まずprogram filesというフォルダに移動しないといけませんので、フォルダを移動するコマンドです。フォルダを移動するにはプロンプト(入力を促す記号)に対して"cd"と入力して、その後に移動したいフォルダ名を指定して、Enterキーを押してください。

例)
>cd \ (フォルダの一番上(ルート)に移動します)
>cd .. (1つ上のフォルダーに移動します)
>cd "program files" (フォルダー名にスペースが入っているので、"で囲んでください)(相対パス)
>cd \"program files"\teraterm (絶対パス)
>ls (フォルダ内のファイルを表示)
>dir (lsと同じ)
>cat ファイル名 (ファイルの中身を表示)
>get-command (コマンドのリストを表示)
>exit (Shellから抜け出す)

 前置きが長くなりましたが、実験を始めましょう。パソコンAとパソコンBでteratermを起動してください。「新しい接続」の画面でシリアルポートを選択します。USBシリアル変換ポートを使用している場合は、「USB Serial Port」を選択してください。次は、シリアルポートの設定です。メニューバーの「設定」からシリアルポートを選びます。シリアルポートの設定例を次に示します。パソコンAとパソコンBは同じ設定にしてください。

ポート:(システムにしたがって選択;これはAとBが同じである必要はない)
ボーレート:9600
データビット:8ビット
パリティ:なし(none)
ストップ:1ビット
フロー制御:none
などを選んで、「OK」ボタンを押してください。

 ファイル転送側では、teratermのメニューバーの「ファイル」>「転送」から、「ZMODEM」を選んで、「送信」から、ファイルを選択します。

 パソコンA(送信側)の設定
teratermのメニューバーの「ファイル」>「転送」>「ZMODEM」>「送信」をクリック
 ファイル選択用のウィンドウが開くので、実験で使用するファイルを選択して、「開く」ボタンをクリック

受信側では、teratermの「ファイル」から「転送」を選択し、「ZMODEM」の「受信」を選択してください。小さなファイルなら瞬時に転送されます。ファイルが大きい場合は、転送モニターが表示されると思います。



3 バス接続で通信をしてみよう

3.1 バス構造のネットワーク

 これまではパソコンを1対1で接続する方法を考えてきましたが、これで効率のよいネットワークは構築できるでしょうか。

コンピュータを1対1で接続(ポイントツーポイント接続)
 
1対1接続で4台のコンピュータをつなごうとすると、6本のケーブルが必要となる 

 コンピュータ同士を1対1で接続する方法をポイントツーポイント(Point to Point)接続ということもありますが、ポイントツーポイントでN台のコンピュータを接続するにはN*(N-1)/2の接続が必要となります。4台なら6本で済みますが、コンピュータが200台あると19900本のケーブルが必要です。大きな部屋にある200台のパソコンを相互にシリアルケーブルで接続しようとすると、部屋はケーブルでいっぱいになり、たぶんコンピュータの経費よりも、ケーブルの経費のほうが高くなります。

 もう少し現実的な方法はないかということで開発されたのがバス型構造のネットワークです。

バス型ネットワーク:バスといってもお風呂(bath)じゃありません。みんなで乗り合わせるというイメージでしょうか(omnibus)


 次に示すのはバス型ネットワークの代表的な例である、Ethernetのネットワーク図です。複数のパソコンが回線を共有します。同じ時期に回線を使いたいというパソコンが複数あると回線の奪い合いになります。奪い合いですから、けんか(信号の衝突)になってしまいます。やはり規則が必要です。

バスに接続したパソコンはみんなでバスを使用できる。これはマルチアクセスと呼ばれる(Multi Access、MA)。しかし、いつでも使えるわけではない。使いたい人は、誰か回線を使っているマシンがないか確認する。これをキャリアセンス(Carrier Sense、CS)という。
 
Carrier Senseしてデータを送信したとしても、同時にデータを流したマシンがあるかもしれない。そういう場合は信号が衝突(Collision)してしまう。衝突を検知(Collision Detection、CD)したら、一定時間待ってデータを再送する。 

 バスに接続したパソコンはみんなバスを使用することができます。これをマルチアクセスといいます(Multi Access、MA)。しかし、いつでも誰でも利用できるということになると、けんか(信号の衝突)になってしまいます。そこで、使いたい人(端末)は、誰かが回線を使っていないか調べて(キャリアセンス;Carrier Sense、CS)、使っている人がいない場合は使うということになっています。しかし、どんなによく調べても衝突してしまうことはあります。ほとんど同時にキャリアセンスを行った端末は使っている人がいないので、信号を送ってしまうでしょう。こうなると衝突が発生してしまいます。データの衝突の検出(コリジョンディテクション;Collision Detection、CD)は、衝突破片(ラント、runt)が届くことで判断します。衝突を検知したら一定時間待ってから、再送を試みます。衝突した双方が同じ時間待って再送すると、また衝突が発生してしまいますので、双方の待ち時間は違う値になるように調整されるメカニズムが採用されています。

 これで、イーサネットがどのように回線競合を調整しているかが分かっていただけたでしょうか。イーサネットの回線競合を回避するプロトコルはCSMA/CDと呼ばれます。

 回線競合を回避できれば次は如何にして同期をとるかですが、これについては既に説明しました。イーサネットではデータ送信に先立ってプリアンブルを送信することで行われます。プリアンブルは「10101010」が7バイト連続し、その後「10101011」が続きます。
 
 イーサネットにはいくつかの方式がありますが、基本となるのは10Mbpsの標準イーサネット(標準イーサネットにも更に様々な仕様がありますが、今は細かいことは言わないことにします)です。標準イーサネットでは符号化方式としてマンチェスター符号化方式を採用しています。マンチェスター符号化方式では電圧の「低から高へ」の変化で「1」を、「高から低へ」の変化で「0」を表します。この方式では、ビット区間で電圧の状態を必ず変化させますので、データの中にクロック信号を埋め込んだようなものです。このため同期が取りやすく衝突検出も容易になります。
 マンチェスター符号化方式は実質的には1を「01」(送信順をLSBからとするか、MSBからとするか、0を高電圧とするか低電圧とするかで、異なりますが、とりあえず2ビット必要という位の意味に考えて下さい)、0を「10」で符号化させるのと同じで、単純に1を高電圧、0を低電圧とする方法(あるいはその逆)の2倍のビット幅が必要となるという欠点があります。これでは伝送効率が悪くなりますので、100Mbpsのファーストイーサーネット、1000Mbps(1Gbps)のギガビットイーサーネットでは他の方式を採用せざると得ないということになります。



3.2 相手の識別の必要性

 次に考えなくてはならないことは、相手を如何にして識別するかということです。今までずっとポイントツーポイント接続の話をしてきましたが、ポイントツーポイント接続では、相手は一本の枝分かれのない管の先につながっているコンピュータですので、特別に相手を指定するような手順は必要ありませんでした。しかし、バス構造ではバスの先につながっている相手が2人(2つ)以上いますので、相手を指定(識別)しなくてはなりません。通信ですから、返事をもらう必要もありますので、自分を指定(識別)することも必要となります。

 イーサーネットで自分と相手を識別する識別子をMACアドレスと言います。MACアドレスは48ビットの識別子です。通常は16進表示で表しますので、12桁の文字列ということになります。MACアドレスについては、また後で説明したいと思います。

バス構造では相手を指定しない限り通信が成り立たない。
 
 バス構造では、信号は全てのコンピュータに電気的には到達するが、通信相手として指定された相手以外は信号を破棄することになっている(デフォルトでは)
※MACアドレスは48ビット(16進では12桁の文字列)だが、簡単のために16進4桁の文字列を使用した。



3.3 イーサネットで実験してみよう

 以上の説明で準備が整いましたので、イーサーネットの実験をしてみましょう。準備するのは2台以上のパソコン、バス構造を自分の中に持っているネットワーク機器、ハブ(HUB)あるいはスイッチ(Switch、スイッチングハブという名前で売られていることが多い)、パソコンとハブ(あるいはスイッチ)を接続するケーブル(LANケーブルという名前で売られていることが多い)です。

 バス構造と言いましたが、標準イーサーネットの当初の仕様(具体的には10BASE5と言います)では、同軸ケーブルという太いケーブルを天井裏などに引き回し、コンピュータをつなぎたいときは、タップという分岐装置を同軸ケーブルに取りつけて分岐させていました。タップは同軸ケーブルの心線に針を刺すような形で接続していましたので、俗にバンパイヤータップなどと呼ばれていました。しかし、同軸ケーブルは太くて引き回しに難点があり、また分岐装置の取り付けが面倒(工事屋さんは天井裏を這いつくばって設置。もう大変。工事費も当然高い)という問題点がありました。そのうちにいくつかの改良を経て、バスという配線構造を自分の中に持ち、細いケーブルでコンピュータとの接続を実現するハブ(HUB)という装置を使う方式(細かいですが、今標準イーサーの基本形になっている10BASE-T)が開発されました。ハブとコンピュータを接続するという形は、これ以降に開発されたイーサーネットの仕様でも一般的になっています(もっとも、ハブはスイッチに置き抱えられていることが多いですが)。

 10BASE-Tで使用されるケーブルはツイストペアケーブルと呼ばれるケーブルで、両端にはRJ-45と呼ばれる8ピンのコネクタがついています。
 コンピュータやプリンターなどをネットワークに接続するにはNIC(Network Interface Card、通称はニック)と呼ばれる拡張カードが必要となります。このNICをパソコン(ディスクトップ)の拡張スロットに挿入して使用します。ただし、新しいパソコンには購入時から装着されていると思います。パソコンの裏にRJ-45のインターフェースがついていれば問題ありません。ない場合は購入して下さい。
 LANケーブルにはストレートとクロスという2種類がありますが、ストレートケーブルを購入して下さい。皆さんの身の回りにあるのは多分全部ストレートだと思いますので、そのまま利用できます。

NIC(ディスクトップ用):ノート用にはもっとコンパクトなものがあります。 RJ-45コネクターのついたLANケーブル NICとLANケーブルを接続
     
 ハブ ノートパソコンのRJ-45インターフェース   ノートパソコンをハブに接続  

 バス型ネットワークで通信するには相手を指定する必要があり、また返事をもらう必要から自分が誰かも知らせる必要があると言いました。そして、このための識別子がMACアドレスだと言いました。それなら通信をする際の相手の指定はMACアドレスで行わなくてはならいのかと思うのが当然だと思いますが、そうする必要はありません。何故でしょうか。

 大学の構内ネットワーク(キャンパスLAN)や、企業内ネットワークなど(いわゆる企業内LAN)では、イーサネットという方式が採用されていると言いましたが、皆さんが家庭や学校や企業その他の組織のネットワークで実際に利用しているネットワークはほとんどイーサーネットだと言っても言い過ぎではありません。皆さんがインターネットをするときに利用しているのもイーサーネットです。インターネットを実際に実現している通信手順(プロトコル)はTCP/IP(ティシーピイアイピー)というプロトコルなのですが、実はTCP/IPは物理的なネットワーク部分に関するプロトコルを定めておりません。TCP/IPというプロトコルは、実際の物理的なネットワーク部分については、他のものを借りるつもりで規定が出来上がっています。そして、実際に利用されている物理ネットワークはイーサネットであるということになります(少なくとも、皆さんの身近にあるLANというネットワークではそうだと言っていいでしょう。LANについてはまた後で説明します)。

 ここでの実験でもイーサネットの実験と言いながら、インターネットのプロトコルも利用しています(詳しいことは後で説明します)。

 インターネットは小さなネットワークの集合体ですが、皆さんの身近にある小さなネットワークは物理的にはイーサネットというネットワークです。物理的な実体としてはイーサネットなのですが、これを利用してインターネットが構築されていることになります。正確にはインターネットの一部が構築されています。世界中にはさまざまな物理ネットワークがありますが、その物理ネットワークという大家さんの土地に借家を建てて住んでいる住人の集合体がインターネットだといっていいでしょう。LANの場合の大家さんは今やほとんどイーサネットになっています。インターネットでは、相手を指定する手法としてIPアドレスを使っていますが、イーサネットの世界では相手を識別する手法としてMACアドレスを使っています。つまり、相手を識別する仕方にはMACアドレスと、IPアドレスという方法があり、これらが二重構造のようになっているのです。


 今回の実験はイーサネットの実験といいながら、イーサネットの上に抽象的なインターネットが乗っかっている構造で実験を行いますので、インターネットが用意しているツールを使うことができます。インターネットにはIPアドレスで相手を指定した時に、そのIPアドレスに該当するMACアドレスを調べる手法が用意されています。この方法をARPと言います。ARPについては後で詳しく説明しますが、今回はそんなものかということで理解して下さい。

 イーサネットには内と外という概念があると思ってください。1つのバスをどこまでもどこまでも伸ばしていくのは限界があります。どんどん伸ばしていくとやがて使い物にならなくなります。多くのコンピュータが1つのバスに接続するという状態になりますと、衝突(Collision)ばかり発生してしまうからです(イーサネットの原理を思い出してください)。この最小単位のバス型ネットワークをサブネットなどと呼びますので覚えて置いて下さい。

 では先に進みましょう。ハブに接続した2台のWindowsパソコンを起動して、次のように設定して下さい。「スタートボタン」>「コントロールパネル」>「ネットワークとインターネット」>「ネットワークと共有センター」へと進み、「ローカルエリア接続」から、「プロパティ」を表示して、ここから「インターネットプロトコルバージョン4(TCP/IPv4)をアクティブ表示(白青反転表示)して、「プロパティ」をクリックします。

 実験の後、元の状態に戻すために必要ですので、現状の設定をメモしておいてください(具体的なIPアドレス等、あるいは「IPアドレスを自動的に取得する」など)。設定は次の例に従ってください。

・IPアドレス:192.168.1.200 (パソコンA)、192.168.1.201 (パソコンB)
・サブネットマスク:255.255.255.0 (パソコンA、Bとも同じ)
・デフォルトゲートウエイ:192.168.1.254

 この設定では、一番小さなネットワーク、つまりサブネットワークのレベルでパソコンAとBが同居している設定になっています。この点については、まだまだ土台が出来ていないので説明が難しいのですが、サブネットマスクの1のビットの長さ24(この長さのことをプレフィックス長といいます)をIPアドレスに物差しの定規のように当ててみると、上位24ビットまでが同じになっていることが分かると思いますが、これが2つのパソコンが同じサブネットに同居するための条件になります(詳しいことは後で説明します)。

 これでパソコンAとパソコンBが同一のサブネットに接続しているという状態が出来ました。
 同じサブネットに接続しているパソコン同士はpingというコマンドを打つことで接続を確認できますので、1つのパソコンのpowershellのプロンプト(>)に次のようにコマンドを打ってみて下さい。

>ping ≪相手のIPアドレス≫

つながっていれば、pingの応答が返って来るはずです。
 Windowsのファイル共有を使うと、相手のパソコンがファイルマネージャの画面のネットワークの部分に見えると思います。Windowsファイル共有が有効になっていない場合は、「スタートボタン」>「コントロールパネル」>「ネットワークとインターネット」>「ネットワークと共有センター」へと進んで、左側のウィンドウの「共有の詳細設定の変更」で設定を変更して下さい。


4 ネットワークはルータを使わないと拡大できない

 前節では、イーサネットでは最小のネットワーク単位であるサブネットワークが出来るということを理解しました。ただし、この最小というのはインターネットプロトコルという視点からで、イーサネットの視点からはちょっと違う見方が出来るのですが、このような詳細は今は無視して、全体を俯瞰することを優先したいと思います。

 最小のネットワーク単位の中では、IPアドレスが最上位から見て、サブネットワークのマスク長(これをプレフィックス長というのでしたね)分だけ同じだということが分かりました。この同じ部分をIPアドレスのプレフィックスと言います。つまり、同じサブネット内のパソコンのIPアドレスのプレフィクスはみんな同じなんです。これは逆に言うとプレフィックスが違うパソコンは同じサブネットワークに同居できないということです。プレフィックスはネットワークアドレス(あるいはサブネットワークアドレス)ということもあります。

 では、異なったプレフィックスのサブネットワーク同士を接続するにはどうしたらいいでしょうか。ここで登場するのがルータです。

 
ハブ スイッチ ルータ ネットワーク(インターネット) PC Webサーバ Webブラウザ 

 これからはさまざまなネットワーク図が登場しますが、いちいち写真を使うのも大変ですので、アイコンを使って簡単に表示したいと思います。パソコンのアイコンは既に使っていますが、それ以外によく利用するものを上に示しました。

 ルータは異なるサブネットワークを接続することが出来ます。ルータは機能的にはコンピュータと同じですので、インターフェース部分はIPアドレスを持っています。

ルータによるサブネット接続:ルータの各インターフェースは必ず異なるサブネットに接続 

 ネットワークアドレスの後ろの”/”の後の数字はプレフィックス長を表しています。/24は255.255.255.0と同じ意味になります。例えば/20なら、255.255.240.0です。第3オクテットの中の、240は”11110000”を表します。このあたりのことは後でじっくり説明しますので、今分からなくても構いません。インターフェース(ifと略記)のアドレスは、第4オクテットだけ表示しています(/24の場合は、第1~第3オクテットまでは同じ)。

 ルータは複数のサブネットを接続します。サブネットはそれぞれネットワークアドレス(プレフィックス)が異なります。各サブネットに接続するルータのインターネットのアドレスは、そこに接続するサブネットと同じプレフィックスをセットされています。

 これでどこまでもどこまでもネットワークを拡大して、やがてそれはインターネットになるのでしょうか。そうはいきません。これはあくまで大学や企業などのLANの範囲の話です。



5 WANを使ってネットワークは更に拡大する

 イーサネットのサブネットを相互接続しただけではインターネットにはなれないというのはなぜでしょうか。それは、イーサネットのネットワークを拡大するには障害があるからです。大学や企業のネットワークは通常LAN(Local Area Network)などと呼ばれます。LANは基本的に自分で、つまり大学のネットワークなら大学が、企業のネットワークなら企業が構築・管理・運用を行います。しかし、このLANは公道などをまたいで構築することは出来ないことになっています。離れたLAN同士を接続するのは通信事業者の役割です。そして、通信事業者が構築して提供するネットワークがWAN(Wide Area Network)なのです。WANを構築するためのネットワーク技術は広域イーサネットなどというものも最近は出てきていますが、基本的にはイーサネットではありません。

ルータを使ってサブネット同士を接続しLANを拡大する
 
WANを介して離れたLAN同士を接続する 

 これで離れたLANを接続することが出来ます。これでどんどんネットワークを拡大することが出来るのですが、インターネットとはまだ言えません。

LANをアクセス回線を介して中継網からISPに接続。ISP同士はIXを介して接続される。

 LANと中継網を接続する回線をアクセス回線と言います。アクセス回線には電話線を利用するダイアルアップ接続やADSL(Asymmetric Digital Subscriber Line)、ケーブルテレビの回線を利用するCATV(Cable Television)、光ファイバーの回線を利用するFTTH(Fiber To The Home)などがあります。アクセス回線で通信会社の局舎に接続されます。通信会社の局舎間の接続によって中継網が形成されます。ISP(Internet Service Provider)は通常通信事業者の局舎内にルータを設置し、そのルータを中継網で接続し、ISP内ルータネットワークを形成しています。また、個々のISPルータ網はIX(Internet eXchange)を介して互いに結びついています。このIXを介して相互接続された、ISPルータネットワークがインターネットの実態です。更に、LANもインターネットに参加します。
 皆さんにサービスを提供するサーバはLANの中にも存在するかもしれませんが、LANの中に存在するサーバは主としてLAN内のクライアントに対してサービスを提供することが多いでしょう。インターネット上のユーザに広くサービスを提供しているサーバは多くの場合ISPのルータネットワークの中で稼働していることが多いでしょう。では、LANの中で稼働しているコンピュータから、ISPのネットワーク内で稼働しているサーバまでどのようにしたら通信ができるのでしょうか。



6 パケットはルーティングによって世界の果てまでも

 インターネットでの通信はデータグラムという一塊のデータの送受信によって行われます。データグラムというのはプロトコル(TCP/IP)の正式名で通常はパケットという名前で呼ばれることが多いと思います。このパケットを世界の果てまでも届けてくれるのがルータによって構築された通信網です。
 ではどうやってルータはこれを実現しているのでしょうか。パケットにはデータが格納され、データの先頭部にヘッダと呼ばれる制御情報が付加されています。制御情報はそのパケットを宛先まで正確に届けるための情報と、受信先が正確に情報を処理するための情報からなります。代表的な制御情報は送信元のIPアドレスと、宛先のIPアドレスです。
 
 ルータはIPアドレスを目安にして宛先まで正確にパケットを送り届けます。イーサネットの説明のところで、イーサネットではMACアドレスを識別子として通信をするが、ユーザが指定するのはIPアドレスだという話をしましたが、覚えているでしょうか。ここに既にインターネットの秘密が隠されています。MACアドレスは通信装置(のNIC)に割り当てられています。このアドレスは他と重複しないように慎重に割り当てられていますので、MACアドレスを宛先としてインターネットの通信が出来そうな気がしますが、これが現実にはほとんど無理なのです。何故かというと、特定のMACアドレスを付けた装置(NIC)がどこで稼働しているかを管理している人(装置?)が誰もいないのです。世界中に何百億あるか分からない装置を一つ一つ探してやっと相手を探し当てることが出来るようでは瞬時の通信は成立しえません。IPアドレスはどうでしょうか。IPアドレスとMACアドレスの違いは階層化されているかどうかです。MACアドレスは平面構造ですが、IPアドレスは階層構造を持っています。つまり、IPアドレスは何々国何々県何々市にあたるような大きな括りの住所情報と、住居の存在する地番のような細かい情報が混在して格納されているのです。既にIPアドレスとサブネットマスクの関係について少しお話をしましたので、ぴんときた人がいるかもしれませんが。サブネットマスクは、IPアドレスから、大きな括りの住所情報を切り出すためのツールなのです。大きな括りの住所情報とはネットワークアドレスのことです。

 次に150.8.200.254というIPアドレスから、サブネットワークマスク255.255.255.0を使って、ネットワークアドレスを切り出す方法を説明します。IPアドレスと、サブネットマスクを各位のビット毎にAND計算をします。AND計算とは0+0=0、1+0=0、0+1=0、1+1=1となる計算です。

 ルータはルーティングテーブルと呼ばれるファイルを保持し、受け取ったパケットの宛先をルーティングテーブルのエントリに照らし合わせて、宛先確認を行い、それに従って最適な出口(インターフェース)からパケットを送り出します。次に示すのがルーティングテーブルの例です。

1行目の"show ip route"はコマンド
1列目の記号はエントリの入手根拠
2列目は宛先ネットワーク
viaの後ろはネクストホップ(nesthop)
最後の列は出力インターフェース

 ルーティングテーブルには、基本的に各エントリがどのような理由で得られたかの根拠、宛先ネットワークアドレス、そのエントリの評価、ネクストホップ、そのエントリが得られてからの経過時間、出口インターフェースが保持されています。
 
 ルータ同士は互いに会話(情報交換)をし、ルーティングテーブルを作成しています。その時の会話の手順にはいろいろの方式があります。小さなネットワークに適した会話方式、比較的大きなネットワークに適した会話方式、ISP間の通信を主として考えて作られた会話方式などです。ルータの会話の方式は通常ルーティングプロトコルと呼ばれています。上のルーティングテーブルの2行目の例では、小さなネットワーク向きのルーティングプロトコルとしては代表的なRIPというプロトコルが使用されています。4行目、6行目の"C"はそのネットワークが直接接続している(connected)ことを示しています。

 宛先ネットワークは2列目に記載されています。

 2行目第3列は、ルートの評価です。ルータはさまざまな手法によってルーティングテーブルのエントリを獲得します。直接接続している場合、あるいはネットワーク管理者がルートの設定を手作業で行うこともあります。また、ルーティングプロトコルによって入手したという場合もあります。場合によっては、複数のルーティングプロトコルが稼働している場合もあります。そこで、このさまざまな手法で手に入れたルートのどれが一番適切なルートなのかを評価する必要が出てきます。その評価結果が書かれているのが[ ]の中です。ここは少しややこしいので後で説明することにします。

 2行目のviaの次はそのルートを通る場合の経由ルータです。一般にnexthopなどと呼ばれていますが、ここでは必ず経路(ルート)上の次のルータが表示されます。2つ先、3つ先ではなく、必ず次のルータです(だから、nexthopです。hopとはルータを経由する意味です)。

 その後に、そのエントリを獲得してからの経過時間が書かれます。余り古い情報では頼りないからです。

 最後に、ルータの出口インターフェースが表示されています。

 ルータは受信パケットのあて先ネットワークとサブネットワークマスクからあて先ネットワークを切り出しますが、このときに使うサブネットワークマスクは、受信データグラムの中には記述されていません。サブネットワークマスクという概念は後から出てきたもので、インターネットの開発当初はなかったので、データグラムにはそれを書くためのフィールドが用意されていないのです。そこで、ルータは自分のルーティングテーブルに記述されたエントリの情報から、サブネットワークマスクを取り出して、計算しています。計算結果とルーティングテーブルのあて先アドレスを比較し、一致したらそのエントリのnexthopにパケットを渡します。nexthopは出口のインターフェースの先に接続しています。

 ルーティングテーブルには世界中のネットワークのアドレスを格納しなくてはならないでしょうか。しかし、それではなかなか適切なルートを探せなくなります。ルーティングテーブルの中をもっと簡略化する手法が何か必要となります。このあたりのことは少しややこしいので今は簡略化したお話をしておきます。1つは、ネットワークアドレス部の上位ビットが同じもので、同じ先にあるものを大きい括りにして1行で表示してしまう方法です。これをルートの集約といいます。埼玉県内の市宛は全部、埼玉県宛として1つの郵便局に集約してしまうようなものです。1っ箇所に集約してから、それぞれの市町村毎に配送します。こうするためには、1括りにしたルートは例外なく1つのnexthopの先になくてはなりません。もっと集約するのには、ISP毎にまとめてしまう方法があります。ISPはIXによって接続されているといいましたが、複数のISPを経由して、最終的な宛先に行くようなルートは、途中のルートはIPアドレスではなく、ISPの識別子によってルーティングさせればいいということになります。ISPはネットワークアドレス以外にISPの識別子を持っています。これをASといいます。AS(Autonomous System、自律システム)は、インターネットにつながるネットワークやルータの集合体で、特定のルーティングポリシーで運用されているものを指します。したがって、ISPのための特別の識別子と言うわけではありませんが、ISPや通信会社、レンタルサーバ会社、特別大きな会社、比較的大きな大学などはこのAS番号を持っています。AS番号を元にしてルーティングする際に利用するプロトコルとしてBGPなどがあります。BGPを使うと、途中のルーティングはAS番号で効率的にできるということになります。
 どうでしょうか?これで、どこへでもパケットを届けられると思いませんか?ところがそうはいきません。話はまだまだ続きます。


7 通信相手は特定のサーバ

 パケットを届ける相手は誰でしょうか。皆さん宛の手紙は皆さんの住所宛できますか、それともその住所で生活している人間(つまり、皆さん)宛に来ますか?皆さん宛に来ますよね。そうなんです。インターネットの通信も同じです。ここでは最初に出てきたクライアントサーバの話に再び戻ります。

 サーバという言葉は、インターネットサービスを提供するプログラム(サービス)の意味で使う場合と、サーバと呼ばれるプログラムがたくさんインストールされているコンピュータ(マシン)という意味で使われることがあります。サーバプログラムがたくさんインストールされているコンピュータは多くのクライアントからのアクセスが予想されますので、CPUやメモリ、ハードディスク、通信機能、セキュリティなどを強化した高性能マシンであることが求められます。そこで、高価かで高性能で、多くのユーザにインターネットサービスを提供するのにふさわしいコンピュータという意味で、サーバマシン、あるいはサーバコンピュータなどと呼ばれることになり、省略して、サーバということが多くなったのだと思います。ただ、サーバマシンは、クライアントからの要求に応答するマシンという意味ですので、サーバプログラムがたくさん入っていて、クライアントにサービスを提供している場合は、そのマシンがたとえ高性能のマシンでなくても、サーバマシンということになります。紛らわしいといえばそうなのですが、大体どちらの意味で使われているかは文脈で分かります。しかし、初心者の方が多いと思いますので、この節ではいちいちサーバとサーバコンピュータと使い分けることにします。

 Webを例にとると、WebサーバとWebクライアントから成り立ちます。Webサーバは種々のドキュメントを保持しており、Webクライアントの求めに応じてそのドキュメントを提供します。Webクライアントは皆さんにもおなじみのWebブラウザです。IEやFirefox、Chromeなどがよく利用されています。皆さんはサーバに接続するときに、サーバなら何でもかまわないからつなげようとはしていないはずです。まだ分からないという人もいると思いますが、皆さんは、WebクライアントであるWebブラウザを使うときにはWebサーバにしか接続することができません。メールクライアントを使う場合は、メールサーバにしか接続できません。

 つまり、クライアントはサーバに接続する際に接続相手がどんな種類のサーバなのかを指定する必要があります。サーバを種別する識別子として、サーバはポート番号という番号を持っています。たとえば、Webサーバなら通常は"80"番という番号を持っているのです。そのサーバがインターネット上のどこにあるかはIPアドレスで指定しますので、IPアドレスと、ポート番号を指定すると、特定のコンピュータと、そのコンピュータ上で稼動しているサーバプログラムを指定することができます。

 IPアドレスとポート番号の組み合わせは通常「ソケット」と呼ばれます。サーバのポート番号は公開されています。代表的なものとして、Webの80番とか、電子メールの25番などがあります。

ソケットは電気器具のソケットのイメージそのまま
ソケット接続では、送信者と受信者がともにソケットと呼ばれるエンドポイントを生成し、そこにファイルがあると見立てて、そのファイルに対して書き込み、読み込みを行う。

 サーバのポート番号をもっと知りたいという方は、前に簡単に説明したPowershellで確認することができます。WindowsOSの場合は、cdコマンドを駆使して、「\Windows\Systems32\drivers\etc」というフォルダーに移動し、dir(あるいはls)というコマンドで、servicesというファイルがあるか確認し、見つかったら、cat(あるいはtype)コマンドで、ファイルの中を表示してみてください。
 ファイルの中を見るときは絶対パスと相対パスという考え方に注意してください。相対パスは、現在いるフォルダから考えて、相対的にファイルの場所を指定する方法です。このときには、「../」が1つ上のフォルダを表すことを覚えておいてください。"/"の代わりに"\"を使うこともできます。したがって、">cat <ファイル名>"なら、同じフォルダー内のファイルを閲覧することができ、">cat ../<ファイル名>"なら、1つ上のフォルダ内のファイルを閲覧することができます。同様に2つ上のフォルダーにファイルがある場合は、">cat ../../<ファイル名>"ということになります。絶対パスはマシン内の上部から特定のファイルやフォルダを指定する方法です。WindowsOSの場合は、"C:/<フォルダ名>/<フォルダ名>/<ファイル名>"のようにフォルダやファイルを"/"や"\"で区切って指定します。

 IPアドレスとポート番号を指定するとサーバに接続できます。では、サーバは誰に返事を出せばいいでしょうか。クライアントサーバシステムでは、必ずクライアントから話しかけることになっていますので、クライアントのポート番号は、あらかじめ公開されている必要はありません。しかし、ソケット接続では、サーバの返事もクライアントのIPアドレスと、ポート番号の組み合わせに対して出すことが必要となります。そこで、クライアント側はサービス要求をする際にOSがそのときにたまたま空いているポート番号を割り当てるということになっています。しかし、たまたま空いているポート番号といっても何でもいいというわけにはいきません。大体の目安は決まっていますが、これについては後で説明することにします。

 今までの説明で大体インターネットの通信はできそうだなということは分かっていただけたのではないでしょうか。後は、エラーが発生したときにどうするのか、インターネットのさまざまな要求に細かく応えていくにはどうしたらいいかなどですが、これについては後で説明することにしたいと思います。




8 ドメイン名システムを使って名前であて先を指定

 今までの説明でインターネットがある程度理解できたと思います。IPアドレスとポート番号の組で指定すると、相手サーバを指定できて通信が成り立つ?かも知れないと思っていただけましたか。試しにIPアドレスの指定でWebサーバにアクセスしてみましょう。
 次に説明する通りに実行してみてください。理屈については後で説明します。



 powershellを起動しプロンプト(">")に対して、"nslookup yahoo.co.jp"というコマンドを実行(Enterキーを押す)してみてください(nslookupとyahooの間にスペースが1つありますので忘れないでください)。IPアドレスが表示されると思います。このIPアドレスをブラウザのアドレスバーの"http://"の次に入れて、実行してください(IPアドレスの後ろに/を入れるのを忘れないでください)。いつも利用しているYAHOOのページが表示されたと思います。IPアドレスで通信ができたというわけです。ソケット接続ではポート番号を入れないといけないのでは?その通りです。しかし、ブラウザを使う人は80番ポートを使うのが一般ですので、貴方が入れ忘れてもシステムが補ってくれます。どうしても80番と入れないと気がすまない人は"http://<yahoo.co.jpのIPアドレス>:80/"と入力してください。同じ画面が表示されていると思います。Webサービスを提供したいが、内部の人にしか使わせたくないというような場合があります。そのような場合は、ポート番号を80番以外に設定しておきます。よく使われるのが8080とか、8088などです。こうしておくと、ポート番号を内々に教えてもらっているユーザ以外はアクセスが難しくなります。

 でもこんなことをしたのは初めてではないでしょうか。yahoo.co.jpならすぐにお馴染みの"YAHOO!"だと分かりますが、IPアドレスだとどこのアドレスなのかピンときませんね。もっと人間に分かりやすい方法が必要だと思ったのは貴方だけではありませんでした。

 人間に分かりやすい名前をIPアドレスと対応させれば、もっと扱いやすいのではないかということになりました。当初は1つのファイルに名前とIPアドレスの対応関係を書いてそれを世界中のユーザが共有すればいいと考えたようですが、しかしあまりにも急激にインターネットが発展するので、共通ファイルを更新して、これを世界中にユーザが共有するという方法では間に合いません。そこで考えられたのがクライアントサーバで名前システムを管理する方法です。この名前システムはDNS(Domain Name System)と呼ばれています。世界中に無数のDNSサーバがあり、そのDNSサーバが連携して働いています。このようなシステムを分散処理(Distributed Processing)システムといいますが、DNSは典型的な分散処理システムだといえます。DNSではインターネットの世界を細かいドメインに分割し、そのドメインごとにDNSサーバが機能し、各ドメインサーバが役割分担をして働いています。

インターネット上の名前空間はツリーを逆さまにした逆ツリー構造
ツリーの節点(ノード)が各ドメインを表す。一番上がルート(名前はスペース" ")、その下にトップレベルドメイン、セカンドレベルドメインという形で整列

 ドメイン名空間はツリー(木)を逆さまにした逆ツリー構造で、ツリーの各節点(ノード)に名前(ラベル)がついています。この名前がドメイン名です。逆さツリーの根っこに当たる部分はルートと呼ばれます。ルートには" "というラベルが貼られています。つまり、ルートの名前はスペースです。ルートに下に続くのがトップレベルドメインと呼ばれるドメインで、"com"、"net"、"jp"などがあります。その下にセカンドレベルドメイン、さらにその下にサードレベルドメインと続きます。自分から1つ上のドメインは親ドメイン、自分から1つ下のドメインは子ドメイン(サブドメイン)となります。
 あるノードから、枝を通ってルートにたどり着くまでに経由するノードのラベルをドット(".")で結んだものをそのノードの完全ドメイン名(full domain name)といいます。あるいは絶対ドメイン名という呼び方もあります(fully qualified nomain name、FQDN)。最後は空ラベルのルートで終わっていますので、見た目は"."で終わっているように見えます。

 ドメイン名システムでは分割管理の原則が採用されています。基本的には各ドメインごとにDNSサーバが置かれ、そのドメイン内のドメイン名を管理しています。しかし、厳密に言うとちょっと違います。実はドメインにはDNSサーバが置かれていないところもあります。小さなネットワークであるとか、DNSサーバを管理する適当な人材が見つからないなどの理由です。こうなると、親ドメインにあるDNSサーバにドメイン名の管理を頼まなくてはなりません。その結果、特定のDNSサーバが責任を持ってドメイン名を管理している範囲と、ドメインの範囲が違ってくる場合があります。このような場合に備えて、DNSサーバが責任をもって管理している範囲をゾーン(zone)と呼び、ドメインと区別しています。

 DNSサーバがゾーン内のドメイン名を責任を持って管理することを、「ゾーンに対して権威を持つ」といいます。

cybernetドメインに新たにgaドメインを追加 
新しいgaドメインの管理をcybernetドメインのメールサーバが責任を持って管理している場合は、gaドメインもcybernetのゾーンに含まれる 
 
gaにドメイン内を責任を持って管理するサーバが置かれ、cybernetのメールサーバがgaのメールサーバに権限の委任をすると、gaが独立したゾーンとなる  

 cybernetというドメインに新たにgaというサブドメインができたとします。すでにあるengとaccというサブドメインには権威を持つDNSサーバが稼動しているとします。したがって、engとaccはゾーンということになります。新たにできたgaには管理者がいないので、しばらく親ドメインのDNSサーに管理を任せたとすると、cybernetのゾーンにはgaも含まれます(eng、accはcybernetのゾーンからは外れています)。管理の人員も確保できサーバの経費も用意できて、新たにgaにこのドメインを責任を持って管理するDNSサーバが設置され、親ドメインのDNSサーバが権限の委譲を行うと、gaは新たな独立したゾーンとなります。権限の委譲というと大げさな感じですが、具体的には親のDNSサーバに子供のDNSサーバを指し示すポインターを記述するだけです。このポインターによって、gaに関する問い合わせがきたら、gaに聞くようになります。

 ゾーンの中には1台以上のDNSサーバが稼動していなくてはなりません。大きなゾーンでは安全性を担保するために複数のDNSサーバが稼動しているのが普通です。しかし、ゾーンに対して責任を持たなくてはならないDNSサーバが複数台稼動しているとその複数台の間で整合性を維持することが必要となります。これを同期と言います。ゾーン内を同期させるためには、ゾーン内のDNSサーバにプライマリーマスターサーバと、セカンダリーサーバ(スレーブサーバ)というように役割分担を与えます。プライマリーマスターサーバはゾーン内にただ1つ設置され、自分の持つドメイン名情報を他のDNSサーバ(セカンダリーサーバ)に配布します。この配布の手順をゾーン転送といいます。ゾーン転送をすることで、ゾーン内の複数のDNSサーバは情報を一致させることができます。ただし、プライマリーサーバもセカンダリーサーバもゾーン内での権限という点では変わりはありません。

 DNSシステムもやはりクライアントサーバシステムを採用しています。皆さんのパソコンの中にはDNSクライアント(リゾルバーなどと呼ばれることがあります)が入っていて、たとえばユーザがWebブラウザのアドレスバーにドメイン名を入力して、実行キーを押すと、パソコン内で動いているリゾルバーに助けを求め、リゾルバーはDNSサーバに聞きにいって答えをもらって、Webブラウザに返事をしています。これで、IPアドレスが分かりますので、このIPアドレスを宛先として、質問のパケット(クエリー)を送信するということになります。先ほど、無理やり皆さんに実行してもらったnslookupもDNSリゾルバーの1つで、ネットワーク技術者が運用管理などを行う場合に使うようにということで用意されています。

DNSがない場合は、ブラウザやルータなどは宛先を理解できない
 
ブラウザからの問い合わせで、IPアドレスが分かる。IPアドレスで指定されればルータも対応が可能となる 



9 通信が成り立つためには通信プロトコルが必要

 今までの説明で、クライアントからサーバまでデータが届きそうなことは分かったと思います。しかし、インターネットの通信が成り立つためには送信者と受信者が約束を守る必要があります。通信を成り立たせるために守るべき約束は通信手順とか、通信プロトコルなどと呼ばれています。以前にイーサネットのプロトコルについて簡単な説明を行いましたが、インターネット通信を成り立たせるためにはもっと詳細なプロトコルが必要となります。インターネットのプロトコルとして有名なのがTCP/IPです。TCP/IPは多数のプロトコルの集合体です。その中に、Webとか、電子メールなどのプロトコルが含まれています。

9.1 よくできたOSI基本参照モデル

 インターネットの初期には様々なプロトコルが考えられました。多くの場合、プロトコルモデルというものが作られ、それに沿って具体的なプロトコルが開発されていきました。プロトコルモデルとして有名なのがOSI基本参照モデルです。OSI基本参照モデルは、ISO(International Organization for Standardization)という団体が定めた設計指針です。いろいろのメーカがそれに沿って通信機器を製作すると、他社製の通信機器と問題なくつながるように配慮されています。OSI基本参照モデルはコンピュータの持つべき通信機能を7階層の分割しています。

アプリケーション層 データ通信を利用した様々なサービスを人間や他のプログラムに提供する。
プレゼンテーション層 第5層から受け取ったデータをユーザが分かりやすい形式に変換したり、第7層から送られてくるデータを通信に適した形に変換したりする。
セション層 通信プログラム同士がデータの送受信を行うための仮想的な経路(コネクション)の確立や解放を行う。
トランスポート層 相手まで確実に効率よくデータを届けるためのデータ圧縮や誤り訂正、再送制御などを行う。
ネットワーク層 ネットワークの先にある(ルータを越えた先にある)ネットワーク上の相手までデータを届けるための通信路の選択(※ルーティング)や、アドレスの管理(※IPアドレス管理)を行う
データリンク層 通信相手との物理的な通信路(※データリンク層はケーブルを通して物理的に直接つながっている装置同士の関係)を確保し、通信路を流れるデータのエラー検等を行う。
物理層 データを通信回線に送り出すための電気的な変換、機械的作業など。ピンの形状やケーブルの特性なども

 OSI基本参照モデルは1984年に完成しました。当初の予定では、このモデルに準拠したネットワーク機器やソフトウェアが次々に開発されるはずだったのですが、実際はそうはいきませんでした。OSI基本参照モデルは、モデルとしては非常に出来が良かったというのが一般的な評価ですが、しっかりしたモデルを作ろうということであまりにも時間をかけすぎてしまったようです。OSI基本参照モデルが完成した時には、既にTCP/IPが完成していて(1982年完成)市場に投入される製品はどれもTCP/IP準拠のものでした。製造業者はOSI基本参照モデルに準拠した製品を作ることを躊躇したようです。結局OSI基本参照モデルは決して実装されることはありませんでした。

 OSI基本参照モデルは完成までに時間を掛けすぎたという問題がありますが、それ以外にも実装面での欠点を持っていたようです。それはOSI基本参照モデルは階層が多すぎるということです。ほとんどのアプリケーションはセション層とプレゼンテーション層を必要としていません(いらないのにヘッダフィールドだけは追加されていくということになります)。また、フロー制御やエラー制御を各層で行っていて非効率だという面があります。また、モデルそのものが複雑すぎて、効率的に実装することが困難という面もありました。

9.2 実用性に徹したTCP/IP

 TCP/IPは標準化組織に依存しないオープンなボランティア組織によって決められていきました。定義は、実装を作り、実験を重ねながら決められたようです。したがって、標準だけが先にたって実装で苦労するということはありませんでした。実際に通信実験をしながら決めていったので、シンプルなプロトコル群が作成されました。TCP/IPはOSI基本参照モデルの上位3層分をアプリケーション層1つにまとめてしまっています。これだと、OSI基本参照モデルのセション層の機能を必要とするアプリケーションは、アプリケーション層の中でそれを実現すればいいということになります。必要としないアプリケーションはそれを実装しないだけです。プレゼンテーションに関しても同じことが言えます。また、TCP/IPは第1層、第2層についてはほとんど規定していません。第1層と、第2の機能に関しては、たとえばイーサネットのような物理ネットワークを利用(借用)しようというわけです。

アプリケーション層 SMTP、FTP、HTTP、DNS 通信アプリケーションプログラム 
トランスポート層 TCP、UDP OS 
ネットワーク層 IP、ARP、RARP
データリンク層 イーサネット、トークンリング、FDDI、X.25、ATM、フレームリレー、ISDN等 デバイスドライバー
NIC 
物理層

 第1層と第2層はTCP/IPではありません。既存の物理ネットワークを借用しようという算段です。LANの物理ネットワークとしてはイーサネットが代表的です。第3層から第5層がTCP/IPということになります。第3層で代表的なプロトコルはIPです。IPは送信元から宛先までデータを送り届けるためのプロトコルです。第4層はトランスポート層で、接続を確立することによって確実にデータを送り届けようとするTCPと、手順を簡略化することで処理を単純化しようとするUDPが代表的なプロトコルです。第5層がインターネットサービスで、SMTP(電子メール)、FTP(ファイル転送)、HTTP(Web)、DNS、SNMPなどに関するプロトコルということになります。

通信をしたいのは通常はアプリケーション層のプログラム(サーバとクライアント) 

 通信をしたいのは通常はアプリケーション層のプログラム(サーバとクライアント)ですが、彼らには直接の通信手段がありません(アプリケーション層のレベルでは線はつながっていない)。そのため、彼らは誰かに頼む必要があります。頼むことが出来るのは、下位層のプログラムです。頼む相手はTCPか、あるいはUDPか、他の選択肢もあるにはあるのですが、この2つのいずれかであるというのが一般的です。これは決まっていると考えて下さい。なぜなら、TCPとUDPは性質が全く異なったプロトコルなので、そのプロトコルに従って作成されたプログラムは全く違ったものになります。アプリケーション層のサービスは信頼性を重視するものか、あるいは簡易迅速性を重視するかに分かれますので、信頼性を重視すればTCPに頼むし、簡易迅速性を重視するならUDPに頼むというわけです

 アプリケーション層のプログラムがWebプロトコルに準拠してつくられたものであるなら、トランスポート層のプログラムはTCPというプロトコルに準拠して作成されたプログラムを選ぶことになっています。何とかのプロトコルに準拠して作成されたプログラムといちいち言うのは厄介なので、ここでは簡略化してプロトコルということにしたいと思います。WebはトランスポートのプロトコルとしてTCPを選択します。TCP同士も当然直接つながっていませんので、下のプロトコルにサービスを頼みます。下のプロトコルはIPです。そして、IPも直接つながっていませんので、下のネットワークにサービスを依頼します。LANの場合にはイーサネットに頼みます。

 しかし、アプリケーション層のプログラムには相手と直接通信を行う手段がない。どうするか?

 頼む頼むと言っても自分は誰で相手は誰と指定しないと正しく通信は出来ませんので、自分の指定と相手の指定が大切になります。アプリケーション層の指定はどんなIPアドレスを持ったマシン上の、どのポート番号を持った相手かということです。トランスポート層は、プロトコル番号という識別子を使います。TCPなら、プロトコル番号は6となります。ネットワーク層での指定はタイプ番号です。IPはタイプ番号0x0800という番号を持っています。

 アプリケーションはデータの塊を作って、それをトランスポート層に渡しますが、アプリケーション層で作られるデータの塊は普通メッセージと呼ばれることが多いと思います。トランスポート層はこれにヘッダを付けて、ネットワーク層に渡します。この時の塊はTCPの場合はセグメントなどと呼ばれます。ところが、UDPではデータグラムなどと呼ばれます。これにヘッダを付けて、ネットワーク層に渡しますが、これはIPの規格(TCP/IP)では、データグラムと呼ばれますが、OSI基本参照モデルではパケットと呼ばれますので、パケットという人もいます。また、IPパケットなどと言う人もいます。データリンク層のレベルは、OSI基本参照モデルではフレームと呼んでいます(TCP/IPでは規定していません)。説明の都合上これらの言葉を使わざるを得ないので、一応説明しておかなくてはならないなという思いで説明しました。しかし、これらの言葉はそれほど厳密に区別されずに使われているというのが実情です。単にデータを送るときの単位という位の意味で使っている人も多いと思います。

 セグメントや、データグラムやイーサネットフレームはさまざまなフィールドから構成されていますが、その中で代表的なフィールドと、今説明しようとする手順に必要なフィールドだけ取り出して示します。

 イーサネットフレームのデータフィールドにデータグラムが格納され、データグラムのデータフィールドにセグメントが格納され、セグメントのデータフィールドにメッセージが格納されることになります。

 WebクライアントとWebサーバが通信をする場合を例にとり、送信元のクライアントからあて先のサーバにどのようにメッセージが到達するかについて具体的に説明します。

 WebクライアントはIPアドレスがいくつのマシン上のどのポート番号のサーバと通信をしたいという形で、下位層のプロトコルに仕事を依頼します。このときトランスポート層のプロトコルはセグメントヘッダにあて先のポート番号80をセットします(返事をもらう都合がありますので、自分のポート番号もセット)。トランスポート層はこのセグメントをネットワーク層のプロトコルに渡します。IPアドレスについては、あて先のサーバマシンでの開封順序の問題がありますので、セグメントヘッダに格納せずに、手渡しするイメージです。セグメントを受け取ったネットワーク層のプロトコル(この場合はIP)はあて先のTCPに渡すという意味でプロトコル番号フィールドに6をセットします。それから手渡しされたあて先のサーバマシンのIPアドレスと自分のIPアドレスを格納します。これでデータグラムが完成しましたので、これをイーサネットに依頼します。イーサネットは、IPから依頼をうけたので、これを相手側のIP渡さなくてはなりません。そこで、IPを示す0x0800という値をタイプ番号フィールドにセットします。あて先のMACアドレスはARPというプロトコルを使って入手します。これでフレームが完成しましたので、物理ネットワークに送り出します。あて先のサーバマシンに到着するまでにデータグラムはいくつもの物理ネットワークを経由していきますが、その都度フレームは更新されていきます。フレームは個々の物理ネットワークにしか通用しないからです。途中ルータ等の世話になりつつ、ようやくあて先のサーバマシンにまでたどり着きます。

 さて、あて先のサーバマシンにたどり着いたフレームは、サーバマシンのNICがこれを受け取ります。NICは、あて先MACアドレスと、自分が保持しているMACアドレスを比較し、自分宛のフレームかを判断します。自分宛のフレームなら、それを受け取り、タイプ番号を調べます。この場合は、0x0800となっていますので、IP宛であることが分かりますので、フレームのデータフィールドにセットされているデータグラムを取り出して、上位層プロトコルであるIPにこれを渡します。データグラムを受け取ったIPはあて先IPアドレスで、自分宛のデータグラムであることを確認します。IPは必要な処理を行い、次にプロトコル番号フィールドを確認し、データフィールドからセグメントを取り出して、トランスポート層のプロトコルにこれを渡します。プロトコル番号が6なら、TCPに渡すことになります。TCPは必要な処理を行い、あて先ポート番号を確認して、データフィールドのメッセージをあて先のサーバに渡します。

 これでようやくクライアントマシンのアプリケーションプログラムから、サーバマシン上のアプリケーションプログラムにメッセージが渡されることになります。「TCPは必要な処理を行い」などと、簡単に書いていますが、実際はかなり複雑なことをしています。しかし、ここでは全部省略しました。

9.3 インターネットプロトコルはどうやってできているの?

 インターネットのプロトコルについていろいろ話をしてきましたが、ではこの規定は誰が決めるのでしょうか。インターネットを管理している人?あるいは会社?組織?が決める?インターネットは小さなネットワークの集合体ですが、個々のネットワークには管理者がいます。しかし、インターネット全体を管理している人や組織は存在しません。個々のネットワークを運用する会社や、ISPなどがそれぞれ個々のネットワークが最適になるように頑張っていて、その結果インターネット全体がうまく機能しているというのが実情です。もちろん、IPアドレスや、DNSなどを管理する組織はあります。これは誰かが管理しないとぐちゃぐちゃになってしまいますから。でも、Webはどうやって動くのとか、電子メールはどうするのとかに関しては、管理者はいません。

 では、Webなどはどうやって動いているのでしょうか。Webに関しては、HTTPや、URL(URI)、HTMLなどのプロトコルがあります。これらのプロトコルはRFC(Request for Comentの略)という文書(ドキュメント)の形で公開されています。RFCを公開しているのはIETFというボランティアが運営する非営利組織です。新しいシステムをインターネット上で実現したい人は、ドラフト文書という形で、IETFに提案します。このドラフトは6ヶ月間IETFのサーバに置かれ、全世界の人に公開され、討議されます。この討議はワーキンググループやメーリングリストで行われますが、誰でも参加することができます(RFCの意味が「コメント頂戴」だというのは、こういうことです)。ただし、会社ではなく、個人の資格で参加します。討議の結果、インターネットにとって有益だと判断されるとRFC番号が割り振られて、今度はIETFの公式文書(インターネット標準)としてサーバで公開されます。IETFで標準化が決まると、インターネット利用者の共通の決まりごとになりますので、インターネットに関わるベンダー、プロバイダー、メーカーはRFCに準拠した製品化を行わなくてはなりません。
 提案した会社は通常の場合、既に開発を終わっていますので、先行者としての利益を得ることができます。ただし、開発しても標準化が得られなかった場合は、開発費が無駄になってしまいます。インターネットの世界では、自社で標準を取ることがきわめて重要となりますので、世界(会議等)に出て積極的に発言し(当然英語で?)、周りの意見を聞きつつ修正を行い、周りの賛同を得られるように、普段から準備をしておくことがきわめて重要ということになります。

 これでコンピュータネットワーク、インターネットの概要がイメージできたと思いますが、最後にインターネットの代表的なプロトコルである、電子メールと、Webについて簡単に説明しておきたいと思います。



10 MIMEによって更に便利になった電子メール

 電子メールは通信ネットワークを介してコンピュータ等の機器の間で文字を中心としたメッセージのやり取りをするシステムで、携帯電話やPHS(Personal Handy-Phone System)などで使われているSMS(Short Message Service、Cメールなどと呼ばれることもある)、各種のネットワークサービスやアプリ内で提供される利用者間のメッセージ交換機能から、インターネットの標準プロトコルとして規定されている方式までさまざまなものがあります。ここではインターネットの標準プロトコルとして規定されている電子メールについて説明したいと思います。インターネットではSMTP(Simple Mail Transfer Protocol)やPOP3(Post Office Protocol)、IMAP4(Internet Message Access Protocol)、MIME(Multipurpose Internet Mail Extension)などのプロトコルが使われています。

 電子メールを使えるようになるには、一般にはISP(Internet Service Provider、インターネット接続業者)と契約してISPから電子メールアカウントをもらう、あるいは大学に入って電子メールのアカウントをもらう、あるいは企業等に入社してその企業から電子メールのアカウントをもらう、などの方法があります。

10.1 メールサーバによるメールの配信

 メールアカウントとは電子メールを使う権利のようなものです。例えば銀行などの口座もアカウント(account)と呼ばれますが、アカントを開くと口座番号をもらえます。この口座番号が利用者と紐づけられることで、利用者は銀行のサービスを受けることが出来るようになります。メールアカウントもこれと同じで、アカウントをもらうと電子メールサービスを受けられるようになります。具体的は、ISPからメールアカウントをもらうと、ISPが運用しているメールサーバと呼ばれるマシン上にメールボックスと呼ばれる箱を用意してもらうことが出来ます。そして、そのメールボックスには名前が付けられます。自分用のメールボックスは"<あなたが自分で決めるID>@<メールサーバの名前>.<メールサーバマシンのドメイン名>という形式の名前を持っています。@以下はISPから勝手に指定されると思います。これはISPのサーバの名前なので、ユーザの勝手を許すことは出来ないからです。@の左側はユーザ勝手に決めます。全体でメールアドレスなどと呼ばれます。電子メールにおける貴方の住所氏名のようなものです。貴方に電子メールを出したいという人は、このメールアドレスを宛先にしてメールを送信すると、貴方のメールボックスまで配信されます。

受信者のメールアドレスの"hoge"は受信者のID、"msv"はメールサーバの名前、"example.com"はメールサーバが稼働しているネットワークのドメイン名


10.2 メールの閲覧

 次に問題となるのが、メールサーバに届いたメールをどのように読むかです。インターネットの初期にはユーザはメールサーバに直接ログインして読んでいました。メールサーバはUNIX(OS)であることが多く、一般のユーザにはあまり使い勝手のいいものではありませんでした。メールサーバを管理している者からすると、UNIXを良く知らないユーザに直接ログインを許すのは余り気が進みません。直接ログインすればShellでOSのカーネルに変更を加えることもできてしまうわけですから、安心できません。また、ユーザにしてみれば、いちいちメールサーバのところまで出向かないとメールが読めないというのは不便でした。メールサーバは常時インターネットに接続していなくてはならないという事情がありますので、ネットワーク環境がよくない当時は、どこにでもメールサーバを置けるというようなわけにはいかなかったのです。メールサーバはユーザから見ると不便なところにありました。
 やがて、メールサーバにリモートからログインしてメールを読むという方法が可能となりました。しかし、依然としてメールサーバにログインする必要があり、サーバの管理者は何かあったら困るとひやひやしていました。
 現在は、メールサーバにログイン必要はありません。メールサーバ上にPOP3や、IMAP4などのサービスが稼働しており、ユーザはメーラー(メールソフト)からPOP3やIMAP4などのサーバにアクセスして、自分のメールボックス内のメールを読むことが出来ます。これでメールサーバの管理者の心配も解消されることになりました。

 ①インターネットの初期には、メールサーバに直接ログインして読んでいた(サーバ管理の面からは危険なことであり望ましいことではない)

 ②やがて、リモートからログインして読む手法が採用される(多少便利になったが、管理面からは不安が残る)
 
 ③現在は、ログインはせずに、POP3、IMAP4などを使って、メールだけ読むという手法が採用されている(便利になり、管理的にも不安が解消された)。

 hogeさんのメールボックスには、hogeさん宛てのメールが届いていますので、他の人には見せたくありません。そこで、hogeさんは自分が確かにhogeであることをメールサーバに対して証明しなくてはなりません。これはIDとパスワードを示すことで行います。これを認証といいます。通常はIDとパスワードを示して行います。POP3、IMAP4のいずれの場合にも認証を通った人にのみ認められます。

10.3 メール送信時にも認証を

 では、メールの送信はどうでしょうか。メールの送信はSMTPというプロトコルによって行われますが、従来はSMTPサービスを受けるには認証が必要とされませんでした。ということは、Aというhogeさん以外の人がhogeさんに成りすますことができてしまうことになります。つまり、成りすましメールです。そこで、SMTPの拡張版として、送信時にもユーザ認証を求めるSMTP認証(SMTP Authentication)が規定され、導入例も多くなっています。SMTP認証ではメール送信時にもユーザにアカウント名やパスワードの入力を求めて、正規のユーザであることを確認してから、送信依頼に応じています。

10.4 7ビットコードでの送信

 以上で、送信したメールはDNSやルータなどの手助けを受けて確実に相手先まで届きそうな気がします。でも、メールの内容を確実に読んでもらえるかは分かりません。文字化けして相手には何のことやら分からないという場合も珍しいことではありません。もともとの規定(RFC822)では、インターネットの電子メールは7ビットのASCII文字以外は送信できないということになっています。インターネットの初期はこれで問題はありませんでした。利用するのは米国の研究者だけだったのですから。しかし、徐々に利用者が拡大すると、当然不便だということになります。ラテン語系でも、フランス語、スペイン語、ドイツ語のような発音用の補助記号付の文字は使えません。また、ロシア語系の言語で多用されているキリル文字なども扱うことはできません。正式なASCII文字コードは7ビットなので、8ビットを1つの単位として考えると、最上位ビットを1とした文字空間が128文字分空いています。ここに、特殊文字を押し込めたくなるのは人情というものでしょう。日本でも8ビット文字空間の空いた部分に半角カタカナ文字を押し込める日本語用ASCII(JIS X 0201、正式名は「7ビット及び8ビットの情報交換用符号化文字集合」)が開発されています。8ビットのASCII(正規にはASCIIではありませんが)コードに対して、もともとの正式なASCIIはUS-ASCIIなどと呼ばれることがあります。

 SMTPを実装したメールサーバや、メールクライアントは当然US-ASCIIを文字セットとして扱うように設計されています。もともと7ビットの文字コードで作られてシステムを、後発の8ビットの文字コードで動作させようとするのには無理があります。現に、ヘッダに半角カタカナを入れた結果メールサーバが誤動作を起こして、インターネットが大混乱を起こしたということもあります。そこで、メールサーバの中には8ビットセットの最上位ビットを強制的に"0"に変更しようとするものも出てきました。すると今度は、本文もおかしくなってしまいます。本文に8ビットASCIIが使われている場合、最上位ビットを強制的に"0"に変換されると、本文が文字化けしてしまいます。

10.5 7ビットコードの壁を打ち破るMIME

 7ビットコードという制限の打開策として提案されたのがMIME(Multipurpose Internet Mail Extensions; 多目的インターネットメール拡張、通称はマイム)です。MIMEはRFC2045、RFC2046、RFC2047、RFC2049、RFC4288で規定されていますが、MIMEを使うことでインターネット電子メールでさまざまなフォーマットを使うことができます。

 電子メールの規定はメッセージの本文に関して、(制御コード以外の)US-ASCII文字を使うことしか規定していません。開発者はここに目をつけました。音声や画像などのバイナリデータ(1と0の組み合わせのうち、文字コードで割り当てられた組み合わせ以外を使っているデータ。つまり、任意の"1"、"0"の組み合わせのデータ)や8ビット文字コードなどを全部US-ASCII文字に変換してしまえば、問題がないということになります。

 MIMEの基本は全部7ビットのUS-ASCIIに変換してしまうわけですが、元のデータがどんなもので、それをどんな方法で変換(エンコード、符号化)したかを示すことが大切です。これを示すことで、受信者側のメーラも面食らうことなく元の内容の通りにユーザにメール内容を表示することができます。これらの情報はMIMEのヘッダフィールドに記述します。MIMEのヘッダフィールドのうち代表的なものは、MIMEのversion、Content-Type、Content-Transfer-Encodingです。

MIME-VersionはMIME仕様のバージョンを示すことで、将来の仕様の変更にも対応できるようにしています。Content-Typeフィールドでは、MIMEで扱うコンテンツのタイプ(データの種類)を示します。ここではtype、subtype、parameterを示すことが出来ます。typeでは、text、image(画像)、audio(音声)、video(動画)、application、model、message、multipartの8種類が指定できます。subtype(副型)はそれぞれのメディアタイプ(type)の中をさらに細分化して定義しています。textはUS-ASCII文字を使っている場合は、そのまま表示して下さいという意味で、text/plainとなります。HTMLを使っている場合は、text/htmlです。画像(image)は、gif、jpeg、tiff、pngなどの画像型がそのまま、subtypeとして使用されます。audioはPCMならaudio/basicとなります。VideoのsubtypeにはMPEGなどがあります。詳細はIANA(Internet Assigned Number Authority)という団体が管理していますので、IANAのWebページ(http://www.iana.org/assignments/media-types/)をご覧下さい。

 次に符号化方式を示す必要があります。符号化方式(Content-Transfer-Encoding)は、7bit、8bit、binary、base64、quoted-printableのいずれかです。7bitは文字通りUS-ASCIIが本文に使用されていますので、変換(Encoding)しないで送りますという意味になります。8bitは8ビット文字コードを使っているので変換の必要ありという意味です(ただし、拡張機能をサポートしているシステムでは8bitのままで処理できます)。binaryも文字通りバイナリーデータなので変換の必要ありという意味になります。base64とquoted-printableは実際の変換方式です。

 次の例は、日本語でメッセージを作成した場合のものです。

 text/plainは平文であることを示します。平文とは、書いたままにそのまま表示して下さいということです。いかなる書式付きの命令・指令も含んでいないことを意味します。つまり、7ビットASCIIが使用してあるので、そのままですということになります。parameterはcharsetが指定されています。charsetは文字(character)のセットということです。charsetにはiso-2022-jpが使用されています。これは日本語を7ビットで扱うように設計された文字セットです。JIS X 0208で定義されるいわゆる7ビットJISコードを元にして、日本語の部分を「ESC$B」と「ESC(B」(または「ESC(J」ではさむことで表現できるようにしています。日本語が始まると、その前にUS-ASCIIの「ESC」(0x1B)、「$」(0x24)、「B」(0x42)を挿入し、日本語が終わると、「ESC」、「(」(0x28)、「B」を追加します。

 次は、ビットマップ形式の絵を送りたい場合です。画像(バイナリ)ですので、encodingは8bitを指定しています。



 8ビット文字やバイナリーは7ビットのUS-ASCIIコードに変換しなくてはなりません。変換する方法は、quoted-printableとbase64です。全体から見るとほとんどがUS-ASCII文字だという場合は、それ以外の文字をquoted-printableで変換します。8ビット文字、あるいはバイナリーが全体の多数を占める場合はbase64で変換します。

 Quoted-Printableは印字可能なASCII文字(0x21~0x7E)(ただし0x3Dの"="だけは例外)はそのまま変換なしに表し、それ以外には頭に"="を付けて、文字のコードの16進数表記をそれに続けるという方法をとっています。受信側では、"="を取り除き16進表記になっているコードを対応する文字に置き換えるだけです。

 ほとんどがバイナリあるいは8ビットコードの文字だという場合は、有無を言わせず全部変換してしまいます。これがbase64という方法です。base64では8ビットコードの3文字分あるいはバイナリの3文字分(24ビット)を取り出して、6ビットずつに分割し、その分割したビット並びに対して1文字ずつ計4文字のUS-ASCII文字を割り当てる方式です。6ビットでは2^6=64文字を表現することができますので、"A-Za-z0-9+/"の計64文字を割り当てることが可能です。元のデータを6ビットずつに分割しますが、6ビットに足りない場合は"0"を追加します。そして、各6ビットを変換表に従って、文字を割り当て、その文字を4文字ずつのセットにします。このとき、4文字に足りない場合は、"="を補います。

base64変換表
10進 2進 文字 10進 2進 文字 10進 2進 文字 10進 2進 文字
0 000000 A 16 010000 Q 32 100000 g 48 110000 w
1 000001 B 17 010001 R 33 100001 h 49 110001 x
2 000010 C 18 010010 S 34 100010 i 50 110010 y
3 000011 D 19 010011 T 35 100011 j 51 110011 z
4 000100 E 20 010100 U 36 100100 k 52 110100 0
5 000101 F 21 010101 V 37 100101 l 53 110101 1
6 000110 G 22 010110 W 38 100110 m 54 110110 2
7 000111 H 23 010111 X 39 100111 n 55 110111 3
8 001000 I 24 011000 Y 40 101000 0 56 111000 4
9 001001 J 25 011001 Z 41 101001 p 57 111001 5
10 001010 K 26 011010 a 42 101010 q 58 111010 6
11 001011 L 27 011011 b 43 101011 r 59 111011 7
12 001100 M 28 011100 c 44 101100 s 60 111100 8
13 001101 N 29 011101 d 45 101101 t 61 111101 9
14 001110 O 30 011110 e 46 101110 u 62 111110 +
15 001111 P 31 011111 f 47 101111 v 63 111111 /

 では、Helloという言葉をbase64で変換してみようと思います。Helloは全部ASCII文字でできていますので、base64で変換する必要はありませんが、ここはbase64の手順を学ぶというつもりで読んでいただければと思います。

HelloをBase64で変換

 MIMEを使うことで、8ビット文字もバイナリーもUS-ASCIIの7ビット文字に変換することが出来ました。これによって、フランス語などの発音用補助記号付きの文字や、キリル文字なども扱うことが出来るようになっただけでなく、音声や画像、動画なども問題なく扱うことが出来るようになりました。また、日本語、中国語などの1バイトでは不自由な言語も扱うことが出来るようになりました。





11 世界規模の電子図書館を築くWeb

 WebはWWWと呼ばれることもあります。WWWとはWorld Wide Webという意味です。世界規模のweb、つまり世界規模にまで大きくなった蜘蛛の巣ということです。Webは蜘蛛の巣状に連携したドキュメントの集合に対して、アクセスを可能にするシステムです。蜘蛛の糸を辿ってどこまでも何処までも情報を追求していくことが出来ます。どうしてこんなことが可能かというと、Webで扱うファイルは、文中の単語や画像、あるいは他のファイルや画像の位置情報を埋め込むことで、その文書や画像などに移動することが出来る仕組みを持っているからです。これをハイパーリンク(hyperlink)といいます。ハイパーリンクを埋め込まれたテキストはハイパーテキストなどと呼ばれます。

 Webシステムはクライアントサーバシステムを採用しています。Webクライアントは、皆さんがよくご存知のWebブラウザです。IE(Internet Explorer)やfirefox、Chromeなどがあります。Webシステムはまるで「アラジンと魔法のランプ」の話のようです。アラジンがWebブラウザに語りかけるとランプの精の様に魔法をあやつるWebサーバが出てきて、なんでも望みをかなえてくれます。この魔法は3つのキーワードから成り立っています。1つがHTMLです。もう一つがURLで、最後のキーワードがHTTPです。

11.1 Webドキュメントの書き方

 HTML(Hyper Text Markup Language)はハイパーテキストを記述するための言語です。今皆さんが読んでいるこのページもHTMLで書かれています。URL(Uniform Resource Locator)はインターネット上の様々なリソースに対する統一的な名前付けの手法です。この手法によって、HTMLで書かれたドキュメントの在処を指定することが出来ます。HTTP(Hyper Text Transfer Protocol)は、URLで指定したドキュメントをサーバとクライアント間でやり取りするための手順です。

 HTMLは簡易マークアップ言語で、ドキュメントがどのように整形されるかを記述するための言語です。「マークアップ」という用語は元々は、英国の出版業界で、著者、編集者、印刷業者の間で指示を与えるための方法として使われていました。原稿編集者が文書に印をつけてプリンター(印刷業者)にどのようなフォントを使用するかの指示を与えていたことに由来します。標準化したマークアップコマンドをファイルに埋め込めば、Webブラウザは自分の環境に合わせて、正しく表示できるように、再び組版を行うことが出来ます。環境次第で、たとえば24ビット・カラーの1600×2400の画面で作成されたページを8ビット・カラーの640×320の小さなウィンドウに表示することも可能です。マークアップコマンドは、タグを利用して記述されます。

 タグは元々は荷札とか付箋と言った意味の言葉で、予め定められた特殊な記法により文書に付加情報を埋め込むための手法です。HTMLでは、元になる文書に「<」と「>」で囲まれた指示を埋め込みます。よく使うタグを次に示します。

 コマンドの表示方法は、<something>ターゲット</something>となります。htmlはWebページがHTMLで記述されていることの宣言です。HTMLの文は全体が<html>...</html>で囲まれ、その中はヘッド部とボディ部に分けられます。ヘッド部はheadで囲まれ、ボディ部はbodyによって囲まれます。HTMLという言葉を太字にしたい場合は、<b>HTML</b>となります。titleはタイトルの定義、pは段落を表します。imgは画像の取り込みです。srcは画像のURLを示します。aはアンカーを表します。どこかに飛ぶときの目印の意味です。hrefはハイパーリンクの定義です。どこかに飛びたい場合には予め目印(アンカー)を付けます。アンカーの付け方は<a name="アンカー名">文字</a>です。この場所に移動したい場合は、<a href="#アンカー名">文字・画像</a>で、アンカー名を付けた場所にジャンプします。別のファイルにジャンプする場合はファイル名も指定しなくてはなりません。この場合は、<a href="ファイル名#アンカー名">文字</a>となります。これでファイル名で指定したファイルの中のアンカーに移動することが出来ます。例えば、<a href="http://www.nasa.gov/"><image src="shuttle.gif" alt="NASA"</a>と言うコードの場合、shuttle.gifという写真をクリックすると、NASAのホームページ(http://www.nasa.gov/)にジャンプします。ユーザが自動画像表示をオフにしている場合は、写真が示されるべき個所にNASAというテキストが表示されます。

 何か難しそうと思った人が多いいと思いますが、最近はWord感覚で書くと、それをHTMLのプログラムに直してくれるツールが出ていますのでそれを使うこともできます。このページもそのようなツールを使って作っています。ただし、トラブルに見舞われた時などにはソースコード(プログラム)を開いて修正することが出来ると便利ですので、HTMLの知識は必要だと思います。プロでない限りは、傍らに専門書を置いて分からない時はそれを参照する(専門書を読んで理解できる)程度で問題ないと思います。

11.2 Webドキュメントはどこにあるのか

 では、ドキュメントがある場所はどのように示すのでしょうか。既にNASAの例で出してしまいましたが、http://<Webサーバのドメイン名>/<ドキュメントのファイル名のパス>という形となります。このような指定の仕方をURL(Uniform Resource Locator)と言います。Resource(情報資源)とはデータやサービスなどを示します。これがどこにあるのか指し示す(Locator)ために決められたデータ形式(Uniform)です。これによって、資源の取得方法や、ネット上のどこに当該資源があるのかを示します。位置はその資源が存在しているコンピュータのネット上でのアドレスと、そのコンピュータ内部の場所(ディレクトリ、あるいはWindowsの言葉ではフォルダー)へのパスという形で指定することになります。URLの例を次に示します。

 先頭にあるhttp:は、後で説明しますが、情報資源を取得するための方法です。最初に情報資源の取得方法を記述するのが決まりで、これをスキーム名と言います。スキーム名は通信に用いるプロトコルを指定するのが普通です。httpやftpなどが最初に来ますが、ローカルファイル(当該コンピュータ上に存在するファイル)の所在を記述する場合は「file:」のような指定します。

 スキームに続く部分の記述形式は、スキーム毎に違いますが、スキームに通信プロトコルが使われている場合は、<サーバのドメイン名や、IPアドレス>:ポート番号/フォルダ(ディレクトリ)名/ファイル名という形になっているのが普通です。上の例では、「kmownet.com」がサーバのドメイン名、「:80」がサーバのポート番号、/w/がサーバのフォルダの位置、「computernw.html」が取得したいファイルの名前ということになります。フォルダ名/ファイル名はパス(あるいはパス表示)と言われることがあります。パスとはサーバのディレクトリ構造の中の公開領域のトップ(ドキュメントルートと言います)からたどった場合のパス(path)ということです。検索に条件が付けられている場合は、パスの後ろにクエリ(query)という形で追加されます。クエリはURLの末尾に「?」マークを付けて、それに続けて「名前=値」の形で記述します。値が複数ある場合は、「&」(アンパサンド)で区切ります。「?page=2」は2ページ目を表示してくれという意味です。「?sort_price=low」は価格の安いもの順に並べ替え(sort)てくれという意味になります。ポート番号はWebの場合は80番が通常ですので、省略した場合は80が補われます。

11.3 WebクライアントとWebサーバの通信はどうやってするのか

 Webシステムはクライアントサーバシステムを採用しています。Webクライアントにあたるのがブラウザです。では、ブラウザとWebサーバはどのようにして通信を行うのでしょうか。この通信の手順を規定しているのがHTTPというプロトコルです。
 HTTPはWebクライアントとWebサーバのメッセージ交換の仕様について規定しています。クライアントの要求の仕方、サーバの応答の仕方についての決まり事です。

 クライアントの要求はメソッドという形で行います。メソッドの主なものとしてはGET、PUTなどがあります。GETは最もよく利用されるメソッドで、クライアントがサーバにドキュメントを要求する場合に使用します。このときドキュメントを指定する方法が既に説明したURLということになります。GETには"If-Modified-Since"(~以後、更新している場合)、"If-Unmodified Since"(~以後、更新していない場合)、"If-Match"(一致する場合)、"If-None-Match"(一致しない場合)、"If-Range"(~の範囲)などの条件を付けることもできます。PUTはリモートのサーバにWebページのコレクションを構築する場合に使います。

 Webサーバはクライアントの求めに応じて情報を返すだけです。全ての応答にはその応答の状態を示す行がついています。状態行では要求が満たされたか、失敗したか、失敗した場合はその理由は何かなどが示されます。状態行ではコード番号(ステータス番号)が使われています。100番台は単なる情報です。200番台は成功(ただし、コンテンツが存在しない=204という場合もあります)、300番台は転送(例:301=ページが移動した)、400番台はクライアントの誤り(例:403=ページが存在しない、404=ページが見つからない)、500番台はサーバの誤り(例:500=サーバ内部に誤りあり、503=再試行せよ)を示しています。

分類 番号 メッセージ 説明
情報 100 Continue 処理の継続。続きのリクエストを送って欲しい
成功 200 OK 成功
201 Created Locationヘッダで指定した場所に新しいコンテンツが作成された
202 Accepted 要求は受理された。ただし、処理は完了していない
204 No Content コンテンツはないが処理は成功した
206 Partial Content コンテンツの一部のみ返送
転送 302 Found Locationヘッダで指定した別の場所で見つかったのでそちらを見てほしい
304 Not Modified 更新されていない。※GETでIf-Modified-Sinceヘッダを使った場合の返信
クライアントエラー 400 Bad Request 要求が不正
401 Unauthorized 認証されていない
403 Forbidden アクセスが認められていない
404 Not Found 見つからない
405 Method Not Allowed 指定のメソッドはサポートされていない
406 Not Acceptable 許可されていない
408 Request Timeout リクエストがタイムアウトした
409 Conflict リクエストがコンフリクト(衝突・矛盾)した
410 Gone 要求のコンテンツがなくなった
412 Precondition Failed 指定条件(If-で指定)に合致しない
415 Unsupported Media Type サポートされていないメディアタイプ
サーバエラー 500 Internal Server Error サーバで予期しないエラーが発生
501 Not Implemented 実装されていない
503 Service Unavailable サービスは利用できない
505 HTTP Version Not Supported このHTTPバージョンはサポートされていない

11.4 Webサーバは相手のことを何も知らない

 HTTPプロトコルでは不特定多数の利用者が不定期に要求を出し、サーバがこれに応答するというプロトコルです。何処の誰かも分からない利用者からの要求にサーバが応答を返すと、それだけで一つの通信(トランザクション、1つの取引という考え方)としては終わってしまいます。当然のことながら、サーバもクライアントもトランザクションの結果生じる状態(state)変化は、トランザクションの終了とともに忘れてしまいます。このようなシステムをステートレス(stateless)と言います。

 Webシステムは好んでこのステートレスという手法を採用しました。開発当時はステートレスプロトコルを採用するライバルのシステムが複数存在していました。ステートフル(状態を覚えておくシステム)にするという選択肢ももちろんありましたが、ステートフルにすると、サーバ側で状態を格納する場所を必要とするなどの手間がかかり、競争力の低下につながるという判断があったようです。Webシステムが開発された当初は、どこの誰からの要求であるかは頓着せずに、要求された学術文書を効率的に配布できればそれで十分という考えだったと思います。しかし、Webシステムがいいということになり、ビジネスに利用できないかという段になると、これではとても使い物にならないということになります。

 Webシステムを開発当初の生のままで利用すると、Webサーバはリクエストを送ってきた主を特定することが出来ません。例えば、オンラインショッピングで本屋さんを開いている場合、Aという本を注文した人がどこの誰だかわかりません。次にBという本の注文があった場合、Aの本と、Bの本を注文した人が同じ人か、違う人かも当然のことながら分からないということになります。


11.5 Webでビジネスを行うためには何が必要か

 Webシステムを開発当初のままで使うとビジネスは出来ないということが分かります。しかし、Webシステムは商品紹介などの点でとても魅力的です。どうにかして、Webシステムを使ってビジネスをしたいという場合にはどうしたらいいでしょうか。

 Webでオンラインショッピングのサイトを作成するという場合について考えてみましょう。通常ユーザはいくつかの画面(Webページ)を渡り歩いて一つの取引を行います。ここでいう取引とはHTTPのトランザクションの意味ではなく、純粋に商売上の取引のことを指します(ちょっとまぎらわしいですが)。ところが、HTTPでは各ページでの買い物が1つ1つのトランザクションとなります。生のHTTPでしたら各ページでの買い物が全部独立して相互に無関係なのですが、これを何らかの方法で関連付ける必要があります。

 どのページで何を買い物かごに入れたか、買い物かごに入れたものの合計数はいくつか、価格の合計はいくらか、注文は確定したか、商品の送り先はどこか、決済方法は何か、カードの場合ならカード番号は入力されたか、入力内容の表示、金額の確認ページを表示したか、取引は終了したかなどのことを全部関連付けられなくてはなりません。この問題を解消するのがセションという概念です。セションという概念を使って、一連のリクエストをそれをした人とを結びつけます。

 セションという概念を有効に機能させようとすると、1連のトランザクションを1つのセションとしてそれをした人に結び付けるためのキーのようなものが必要となります。このセションの鍵として利用されているのがCookieです。Cookieには、ホームページを訪れた回数や、ユーザID、パスワードなどの会員情報なども含まれます。




更新履歴


2016/05/07 修正(電子メールのMIMEの部分を「インターネットのメールシステム」に移動)2016/02/01 作成





























































































































































































































 ページの先頭へ