browser

Webブラウザはメッセージの作成部隊 ブラウザ内部動作4項

前回は、「ネットワークはなぜつながるのか」の全体像と主なキーワードについてまとめた。ここでは、メッセージを作成するブラウザの内部動作について、HTTPリクエスト・メッセージ作成、DNSサーバー問い合わせ、DNSサーバー連携、プロトコル・スタックへの送信依頼の4つに分けて整理する。

1 HTTPリクエスト・メッセージを作成する

URL入力

URL(Uniform Resource Locator)とは、統一資源位置指定子と訳され、インターネット上に存在する情報資源(文書や画像など)の場所を指し示す記述方式である。例えば、http:やftp:、file:など。共通点は、URLの先頭にある文字列がアクセスする方法(プロトコル:通信動作のルールを定めたもの)を表すことである。

 

URL解読

Webサーバーにアクセスする場合を例に説明する。HTTPの仕様に沿って考えると、URLは「http: // Webサーバー名 / ディレクトリ名 / … ファイル名」といった要素に分けられる。順に、http:はプロトコル、//は後に続く文字列がサーバーの名前、/以降はデータ源(ファイル)のパス名を表す。

 

ファイル名を省略した場合

末尾が「/」で終わっているものは、/以降に書くはずのファイル名を省略しているということである。URLのルールでは、このように省略しても構わないことになっている。大半のサーバーはファイル名を省略した場合に備えて、index.htmlやdefault.htmというファイル名を設定している。

 

HTTPの基本的な考え方

HTTPプロトコルとは、クライアントとサーバーがやり取りするメッセージ内容や手順を定めたものである。まず、クライアントからサーバーに向けてリクエストのメッセージを送る。そのメッセージの中には、「何を」「どうして」ほしいのかが書いてある。この「何を」に相当するものをURI(Uniform Resource Identifier、統一資源識別子)といい、URLやURN(Uniform Resource Name、統一資源名前指定子)を含む概念である。普通、ページのデータを格納したファイルの名前やCGIプログラム(Webサーバー・ソフトからプログラムを呼び出すときのルールを定めたもの)のファイル名をURIとして書く。例えば、/dir1/file1.htmlや/dir1/program1.cgiなど。他に、http:で始まるURLをそのまま書くこともできる。

次の「どうして」に相当するものをメソッドといい、Webサーバーにどのような動作をしてほしいのか伝えるものである。HTTPの主要なメソッドには以下の8つがあるが、特に重要なのはGETとPOSTである。

  • GET:URIで指定した情報を取り出す。ファイルの場合、そのファイルの中身を送り返す。CGIプログラムの場合は、そのプログラムの出力データをそのまま返送する
  • POST:クライアントからサーバーにデータ送信する。フォームに入力したデータを送信する場合などに使う
  • HEAD:GETとほぼ同じ。HTTPのメッセージ・ヘッダーを送り返すだけで、データの中身は返さない。ファイルの最終更新日時などの属性情報を調べるときに使う
  • OPTIONS:通信オプションを通知したり調べるときに使う
  • PUT:URIで指定したサーバー上のファイルを置き換える。URIで指定したファイルが存在しない場合は、新たにファイルを作成する
  • DELETE:URIで指定したサーバー上のファイルを削除する
  • TRACE:サーバー側で受け取ったリクエスト・ラインとヘッダーをそのままクライアントに送り返す。プロキシ・サーバーなどを使う環境で、リクエストが書き換えられる様子を調べるときに使う

このリクエスト・メッセージがWebサーバーに届いたら、Webサーバーはその中に書いてある内容を解読し、URIとメソッドを調べ、「何を」「どうする」か判断して、その要求に従って動作する。その結果生じるデータをレスポンス・メッセージに格納する。その先頭部分には、実行結果が正常終了だったか、異常が起こったかを表すステータス・コード(「404 Not Found」など)がある。その後にヘッダー・フィールドとページのデータが続く。そしてそれがクライアントに届き、ブラウザがメッセージの中からデータを取り出して画面に表示する。

 

HTTPのリクエスト・メッセージを作る

URLを解読しWebサーバーとファイル名が判明したら、ブラウザはそれを基にHTTPのリクエスト・メッセージを作る。そのフォーマット(書き方)は決まっている。まず、1行目にはリクエスト・ラインを書く。先頭に書くメソッドで大まかな内容が決まる。その選定基準はブラウザの動作状態で決まる。メソッドを書いたら空白を空け、URIを書く(通例「/<ディレクトリ名>/…<ファイル名>」)。最後に、そのメッセージがHTTPのどのバージョンの仕様に則って書いてあるのか表すために、バージョン番号を書く。

2行目からはメッセージ・ヘッダーという行が続く。1行に1つのヘッダー・フィールドを書く。これでリクエストの付加的な情報を表す(例えば、日付、クライアント側が扱えるデータの種類、言語、圧縮形式など)。その行数は状況によって異なり、空白行までがメッセージ・ヘッダーとみなされる。数行から10数行程度のメッセージ・ヘッダーを書く例が大半である。主なヘッダー・フィールドには以下の4種類がある。

  • ジェネラル・ヘッダー:リクエストとレスポンスの両方で使われる。Data、Pragmaなど
  • リクエスト・ヘッダー:リクエストの付加情報として使われる。Authorization、Fromなど
  • レスポンス・ヘッダー:レスポンスの付加情報として使われる。Location、Serverなど
  • エンティティ・ヘッダー:エンティティ(メッセージボディ)の付加情報として使われる。Allow、Content-Encodingなど

メッセージ・ヘッダーを書いたら、その後に何も書かない空白行を1行入れ、送信するデータを書く。この部分をメッセージ・ボディと呼ぶ。これがメッセージの本体であり、クライアントからサーバーに送信するデータである。フォーム・ページに入力したデータをPOSTメソッドでWebサーバーへ送るときなどにデータが入る。

 

リクエストを送るとレスポンスが返ってくる

このメッセージを送るとWebサーバーからレスポンス・メッセージが返ってくる。メッセージのフォーマットは基本的にリクエスト・メッセージと同じだが、1行目が異なる。レスポンスの場合は、正常終了したのかエラーが起きたのかといったリクエストの実行結果を表すステータス・コードとレスポンス・フレーズを書く。ステータス・コードは数字で書いたもので、主にプログラムなどに実行結果を知らせる目的を持っている。それに対して、レスポンス・フレーズは文章で書かれており、人間に実行結果を知らせるのが目的である。ページが文章だけの場合はこれで終わりだが、画像などを貼り込む場合は以下のように処理が続く。

文章の中に画像ファイルを表すタグ(制御情報)が埋め込まれているので、ブラウザは画面に文章を表示するときにタグを探す。そして、画像を貼り込むという意味のタグ(<img src=””>など)に出会ったら、そこに画像用のスペースを空けて文章を表示する。この作業を繰り返す。リクエスト・メッセージに書くURIは1つだけなため、複数のファイルを読み出すときは、別々にリクエスト・メッセージをWebサーバーに送るのである。

 

2 WebサーバーのIPアドレスをDNSサーバーに問い合わせる

IPアドレスの基本

HTTPのメッセージを作ったら、次はそれをOSに依頼してアクセス先のWebサーバーに向けて送信してもらう。その際すべきことは、URL中に書いてあるサーバーのドメイン名からIPアドレスを調べることである(OSはIPアドレスで相手を指定しなければならないため)。

インターネットや社内のLANはTCP/IPの考え方に基づいて作られている。TCP/IPとは、小さなサブネット(ハブに何台かのパソコンが接続されたもの)をルーター(パケットの中継装置の一つ)でつなげることによって、全体のネットワークができあがるものである。まず、サブネットを住所の丁目に相当するものと考え、○○丁目(ネットワーク番号)××番地(ホスト番号)というネットワークの住所(IPアドレス)を割り当てる。次に、宅急便の伝票に宛名を書くように、通信データの宛名記入欄にアクセス先のアドレスを記載してデータを送る。すると、ルーターが宛名を見て、それがどちらの方向にあるのか調べ、その方向にデータを中継する。この中継動作を繰り返すと、アクセス先にデータが届く。

実際のIPアドレスは、32ビットのデジタル・データである。それを8ビット(1バイト)ずつドットで区切って10進法で表記する。この内、ネットワーク番号とホスト番号の境界(内訳)を表す情報をネットマスクと呼ぶ。ネットマスクはIPアドレスと同じ32ビットのデジタル・データで、左側に1が並び、右側に0が並ぶ値をとる。そして、ネットマスクが「1」の箇所がネットワーク番号を表し、ネットマスクが「0」の箇所がホスト番号を表す。なお、IPアドレスのホスト番号がすべて「0」だとサブネット自体を表し、すべて「1」だとブロードキャスト(サブネット上にある機器全員にパケットを送付する)を表す。

 

ドメイン名とIPアドレスを使い分ける理由

人間の記憶力と実行効率から使い分けている。数字の羅列にすぎないIPアドレスを覚えるのは大変なため、人間はドメイン名(名前)を使う。ネットワークの速度を速く保つために、ルーターはIPアドレスを使う(IPアドレスは32ビット(4バイト)分しかないのに対して、ドメイン名は少なくても数十バイト、最大で255バイト)。サーバー名とIPアドレスを対応づけるしくみがDNS(Domain Name System)である。

 

IPアドレスを探す機能はSocketライブラリが提供

IPアドレスを調べる方法は、最寄りのDNSサーバーに問い合わせればよい。すなわち、DNSサーバーに対してクライアントとして動作することである。このDNSクライアントに相当するものをDNSリゾルバ(リゾルバ)、DNSの仕組みを使ってIPアドレスを調べることをネーム・リゾリューション名前解決)と呼ぶ。リゾルバ(resolver)の実体はSocketライブラリに入っている部品化したプログラムである。

Socketライブラリとは、ライブラリの一種で、OSに組み込まれているネットワーク機能をアプリケーションから呼び出すための部品を集めたものである。ライブラリとは、いろいろなアプリケーションから利用できるように部品化したプログラムを多数集めたもので、プログラムの部品集といえる。

 

リゾルバを利用してDNSサーバーに問い合わせる

リゾルバを利用するには、アプリケーションの中にリゾルバのプログラム名(gethostbyname)とWebサーバーの名前(kaihooo.com)を書くだけである。これでリゾルバが呼び出され、DNSサーバーへIPアドレスの問い合わせ動作を実行できる。

 

リゾルバ内部の動き

ネットワーク・アプリケーション(ブラウザなど)がリゾルバを呼び出すと、制御がリゾルバの内部に移る。そして、複数のプログラムが順番に処理を引き継いでいくことで、データが送信される。制御が移るとは、別のプログラムを呼び出すことによって呼び出し元のプログラムが休止状態となり、呼び出した先のプログラムが動き始めることである。

リゾルバに制御が移ったら、そこでDNSサーバーに問い合わせるためのメッセージを作る。そしてそのメッセージをDNSサーバーに送信する。このメッセージ送信動作は、リゾルバが自分で実行するのではない。OS内部に組み込まれたプロトコル・スタック(OS内部に組み込まれたネットワーク制御用ソフトウェア)を呼び出して実行を依頼する。リゾルバがプロトコル・スタックを呼び出すとそこに制御が移り、メッセージを送る動作を実行し、LANアダプタを通じてメッセージがDNSサーバーに向けて送信される。このように、コンピュータの内部は多層構造になっていることがポイントである。

 

3 世界中のDNSサーバーが連携する

DNSサーバーの基本動作

DNSサーバーの基本動作は、クライアントから問い合わせメッセージを受け取り、その問い合わせの内容に応じるように情報を回答する。その問い合わせメッセージには以下の3つの情報が含まれている。名前とタイプによって調べる情報を指定し、それに従って該当するものを探してクライアントに返答するのである。なお、名前、クラス、タイプ、クライアントに返答する項目の4つに相当するものをリソース・レコードと呼ぶ。

  • 名前:サーバーやメール配送先(メール・アドレスの@以後の名前)などの名前のこと
  • クラス:現在は常にインターネットを表す「IN」という値。以前はインターネット以外のネットワークでの利用との識別のために用意されていた
  • タイプ:名前にどのようなタイプ(種類)の情報が対応づけられているのか表す。例えば、タイプが「A」であれば名前にIPアドレスが対応づけられており、「MX」であれば名前にメール配送先が対応づけられていることを表す

 

ドメインの階層

DNSサーバーに登録する情報にはすべてドメイン名という階層構造を持つ名前が付けられている。ドット(.)が階層の区切りを表す。例えばwww.lab.glasscom.comという名前は、「com事業部glasscom部lab課のwww」という名前と同じようなものである。そして1つの部署に相当するものをドメインと呼ぶ。1つのドメインはひとまとまりのものとしてDNSサーバーに登録される。

 

担当のDNSサーバーを探してIPアドレスを取得

DNSサーバーに登録した情報を探すためには、ルート・ドメインから順に下位のドメインをたどっていけばよい。逆に登録するためには、DNSサーバーのIPアドレスを、上位のDNSサーバーに登録することを繰り返せばよい。上位のドメイン(comやjpなど)をトップレベル・ドメインと呼ぶが、さらに上位のドメインのことをルート・ドメインという。普通は省略されるが、明示的に書く場合はcom.というように、最後にピリオド「.」をつけて表す。また、ルート・ドメインのDNSサーバーをインターネットに存在するDNSサーバー全部に登録することもできる。

 

DNSサーバーはキャッシュ機能で素早く回答

キャッシュ機能とは、一度使ったデータを、データを利用する場所に近いところの高速な記憶装置に保管し、2回目以降の利用を高速化する技術のこと。「データがない」というデータも保存することができる。注意点は、キャッシュに保管された後変更される場合もあるため、有効期限を設定することである。

 

4 プロトコル・スタックにメッセージ送信を依頼する

データ送受信動作の概要

データ送受信動作の概要は、次の4つに要約できる。1)ソケットを作る(ソケット作成フェーズ)、2)サーバー側のソケットにパイプをつなぐ(接続フェーズ)、3)データを送受信する(送受信フェーズ)、4)パイプを外してソケットを抹消する(切断フェーズ)。ソケットとは、パイプの両端にあるデータの出入口のこと。また、上記の4つの動作を実行するのは、OS内部のプロトコル・スタックである。

 

ソケットを作る作成フェーズ

まず、Socketライブラリのsocketというプログラム部品を呼び出す。すると、ディスクリプタが返ってくるので、アプリケーションはそれを受け取ってメモリーに記録しておく。ディスクリプタとは、ソケットを識別するために使うものである(ウィンドウの複数展開時など)。

 

パイプをつなぐ接続フェーズ

次に、Socketライブラリのconnectというプログラム部品を呼び出す。そして相手とつながったら、プロトコル・スタックはつながった相手のIPアドレスやポート番号などの情報をソケットに記録する。これでデータを送受信できる状態になる。ここでのポイントは、connectを呼び出すときに指定するディスクリプタ、サーバーのIPアドレス、ポート番号の3つである。ディスクリプタはアプリケーションがソケットを識別するもので、IPアドレスとポート番号はクライアントがサーバー間で相手のソケットを識別するものである。

 

メッセージをやり取りする送受信フェーズ

メッセージを送るためには、Socketライブラリのwriteというプログラム部品を呼び出す。すると、ディスクリプタが送信データをサーバーに向けて送信、その後レスポンス・メッセージを返信してくれる。メッセージを受信するためには、Socketライブラリのreadというプログラム部品を呼び出す。すると、readが受け取って受信バッファに格納してくれる。

 

切断フェーズで送受信は終了

通信を切断するためには、Socketライブラリのcloseというプログラム部品を呼び出す。すると、ソケットの間をつないでいたパイプのようなものが外れ、ソケットも抹消される。

 

最後に

ブラウザからサーバーにメッセージを届けるためには、ブラウザ内で1)HTTPリクエスト・メッセージの作成、2)WebサーバーのIPアドレスをDNSサーバーに問い合わせる、3)世界中のDNSサーバーが連携する、4)プロトコル・スタックにメッセージ送信を依頼するという、4つの動作がなされている。特に、プロトコル・スタックというOSに組み込まれたネットワーク制御用ソフトウェアの働きが重要であることがわかる。

次回は、メッセージを実際に送受信するプロトコル・スタックとLANドライバ、そしてLANアダプタの働きについてまとめる。

ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識


コメントを残す

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

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