ネットワークはなぜつながるのか 「Webブラウザがメッセージを送る」
ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識
今週は、ネットワークをしっかり理解しよう週間です(^^
えー、これを今やる理由があります。
簡単に言うと、今、取り組んでいるタスクでネットワークの知識が必要だからです。
ネットワークは専門分野ではないので、そんなに詳しくありません…でも必要なんです。
しかし、専門でないからと言って、最低限は知らないとやっていけませんので、
これが良い機会なので、一気にやります。
ひとつの分野を深く知ることも大切だが、浅く広く知っておくこともまた重要なのです。
以下はアウトプットです。
まず、ざっと全体像を把握。
データがネットワークを通じて、違うマシンにだとり着くには、長い道のりがあります。
1章.Webブラウザからメッセージを送る。
2章.TCP/IPのデータを電気信号にして送る。
3章.ケーブルの先はLAN(ハブ、スイッチ、ルータ)機器だった。
4章.プロバイダからインターネット内へ。
5章.Webサーバーにたどり着く。
6章.痛心データが完成し、Webブラウザに戻る。
今日は、1章「Webブラウザがメッセージを送る」
1章 Webブラウザがメッセージを作る
――――――――――――――――――――――
―目次―
――――■探検ツアーのはじまりはURLを入れるところから
■ブラウザはまずURLを解読
■ファイルとディレクトリの違い
■HTTPの基本的な考え方
■HTTPのリクエスト・メッセージを作る。
■リクエストを送るとメッセージがかえってくる。
■送り先となるWebサーバーのIPアドレスを調べる。
■IPアドレスをさがす機能はSocketライブラリが提供
■リゾルバを利用してDNSサーバーに問い合わせる
■リゾルバを呼び出す時の動き
■ソケットを生成して、接続状態を官吏
■IPアドレスとポート番号をTCP/IPソフトへ通知
■サーバー側は待ち受け準備をする
■サーバー側はIPアドレスを照合して接続許可を返信
■さあ、メッセージを送受信開始
■メッセージを送受信の終わりを通知
――――
―内容―
――――
第1章ではWebブラウザの動作を探検します。
URL欄に入力されたURLを解読して、Webページを読み出すためのリクエスト・メッセージを作り、それをWebサーバーに送りだすところまでです。
■探検ツアーのはじまりはURLを入れるところから○URL入力欄にhttp:で始まるURLを入力しますが、URLはhttp:で始まるとは限りません。ftp:ではじまるもの、file:ではじまるもの、mailto:ではじまるものなどがあります。
○ブラウザはいくつかのクライアント機能をかねそなえた、複合的なクライアントソフトだといえるでしょう。
■ブラウザはまずURLを解読
ブラウザが最初にやる仕事は、Webサーバーに送るリクエストメッセージをつくるために、このURLを解読することです。URLフォーマットはプロトコルによって違うので、ここではWebサーバーにアクセスする場合を例に説明します。HTTPの仕様で定められたURLフォーマット
http: + // + Webサーバー名 + / + ディレクトリ名 + / + … +ファイル名
■ファイルとディレクトリの違い
WEBサーバーのURLを書く時、下の例のように最後にスラッシュ(/)をつけたものと、つけないものの2つを見かけます。
(a) http://www.lab.glasscom.com/
(b) http://www.lab.glasscom.comURLフォーマットに従って上の2つを解読してみましょう。
つまり、HTTPプロトコルによって、「www.lab.glasscom.com」というWebサーバーにアクセスし、その「/」というパス名のファイルを読み出せと言うことになります。「/」だけだとわかりにくいですが、これはルート・ディレクトリをあらわします。そして、ファイル名は省略されていることになります。このようにファイル名が省略されている場合、Webサーバーはあらかじめ設定しておいた名前のファイルが指定されたものとみなして、そのファイルをブラウザに返送することになっています。実際には、index.html、あるいは、default.htmという名のファイルが返送される例が多いのですが、それは、ファイル名が省略されていたらindex.html、あるいは、default.htmlというファイルを返送するよう Webサーバーに設定してあるからです。また、例外的に(b)のように書いた場合は、最後に「/」がついているものと見なすことになっています。
■HTTPの基本的な考え方
HTTPプロトコルはクライアントとサーバーがやりとりするメッセージの内容や手順を定めたものですが、その基本的な考え方は単純です。まず、クライアントからサーバーに向けてリクエストのメッセージをおくります。リクエストメッセージの中には「何を」「どうして」欲しいのか書いてあります。
「何を」に相当するものをURIといいます。
「どうして」に相当するものを「メソッド」といいます。
クライアントが送ったリクエスト・メッセージがWEBサーバーに届いたら、Webサーバーはその中に書いてある内容を解読し、URIとメソッドを調べ、「何を」「どうする」か判断してその要求に従って動作します。その結果生じたデータをレスポンス・メッセージに格納します。レスポンス・メッセージには、実行結果が正常終了だったか、異常がおこったかをあらわすステータス・コードも格納します。URLで指定したファイルが見つからないと「404 Not Found」というような表示が出ることがありますが、これがステータス・コードです。そして、それをライアントに送り返します。これで終わりです。
メソッドはGET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE,PATCH,LINK,UNLINKがあります。ふだんはGET,POSTがよく使われます。
■HTTPのリクエスト・メッセージを作る。
実際のHTTPメッセージは、書き方、つまりフォーマットが決まっていますから、ブラウザはこのフォーマットにあわせて、リクエストメッセージをつくります。リクエストメッセージでは、1行目の先頭にメソッドという一種のコマンドを書きます。これで,WebブラウザはWebサーバーにどうしてほしいのかをつたえるわけですが、ここで1つ問題をクリアしなければいけません。メソッドは何種類もあるので、そのうちどのメソッドを角野かを判断しなければならないのです。
これを解くカギはブラウザの状態にあります。メソッドの種類は「場面」によってかわるのです。「場面」の例として、URL欄にURLを入力した場合は、そのページを表示することになっていますからGETmメソッドを使います。ハイパーリンクをクリックした場合も同様に、GETメソッドを使います。フォームの場合は、その中にどのメソッドを使ってリクエストを送るか指定してありますから、その指定に従ってメソッドを使い分けます。2行目からは「メッセージヘッダー」という行が続きます。
メッセージヘッダーに書く内容はブラウザの種類やバージョン、設定などによって異なりいます。いずれにしても、数行から10行程度のメッセージヘッダーを書く例が大半です。メッセージヘッダーを書いたら、その後に何もかかない空白行のデータを1行入れ、その後に、送信するデータを書くことになっています。
HTTPはこの部分を「メッセージボディ」と呼び、これがメッセージ本体となります。
メソッドがGETの場合は、メソッドとURIだけでWebサーバーは何をすべきか判断できるので、メッセージボディに書く送信データは何もありません。
メソッドがPOSTの場合には、フォームに記入したデータを送るので、それをメッセージボディの部分に書きます。これでブラウザのリクエストメッセージ作成は終わりです。
■リクエストを送るとメッセージがかえってくる。
レスポンスメッセージのフォーマットも基本的な考え方はリクエストメッセージと同じです。ただ1行目が違います。レスポンスの場合は、リクエストを実行した結果をあらわすステータスコードとレスポンスフレーズが記述されています。
画像などを貼り込む場合は、文章の中に画像ファイルをあらわすタグという制御情報が埋め込まれているので、ブラウザは画面に文章を表示するときいに、タグをさがします。
文章ファイルを読み出す時と同じように、画像ファイルの名前をURIに指定してリクエストメッセージを送ります。
ですから、このように別々にファイルをよみだすわけです。一つの文章に、画像が3個貼り込んであったら、文章ファイルを読み出すリクエストと画像ファイルを読み出すリクエストで、合計4回、リクエストメッセージをWebサーバーに送ることになります。
■送り先となるWebサーバーのIPアドレスを調べる。
ブラウザはURLを解読したり、HTTPメッセージを作る機能は持っていますが、そのメッセージをネットワークに送りだす機能を持っているわけではありません。その機能はOSが持つことになっているので、ブラウザが持つ必要はないからです。ですからメッセージを送る時は、OSに依頼して送ってもらうことになります。しかし、今この段階で、Webサーバーにメッセージを送ることはできません。OSにデータ送信を依頼する時は、送信データと一緒に送信相手の送信先となるIPアドレスをOSに通知しなければいけないからです。
名前が分かればIPアドレスがわかる。あるいはIPアドレスが分かれば名前が分かる、という仕組みを使って、双方のギャップをうめることにしたわけです。その仕組みがDNS(Domain NameSystem)です。
■IPアドレスをさがす機能はSocketライブラリが提供IPアドレスを調べる方法は簡単です。最寄りのDNSサーバーに問い合わせるだけです。DNSサーバーに問い合わせを送るということは、DNSサーバーに問い合わせメッセージを送り、そこから返送される応答メッセ
ージを受け取る、ということです。これはDNSに対してクライアントとして動作する、というとも言えます。このDNSクライアントに相当する者を「DNSリゾルバ」、あるいは、単に「リゾルバ」と呼びます。DNSの仕組みを使ってIPアドレスを調べることを「ネーム・リゾリューション」と呼びますが(これを直訳して「名前解決」と呼子ともあります)、そのリゾリューションを実行することからリゾルバというわけです。リゾルバの機能は、ブラウザに限らず、いろいろなネットワーク・アプリケーションが必要としています。
またリゾルバは単体で使うことはなく、ネットワークでデータを送受信する機能と一緒に使います。ですから、リゾルバ機能とデータ送受新機能は一緒に使える形にまとめられています。そのまとめ方はOSの種類やプログラミング言語によって異なりますが、「Socketライブラリ」と呼ぶ者の考え方を採用していいます。
■リゾルバを利用してDNSサーバーに問い合わせる
Socketライブラリの実体は他のプログラムから呼び出され動くように書かれたプログラムの集まりで、リゾルバ機能はその中に埋め込まれています。リゾルバを呼び出せば、それがDNSサーバーに問い合わせのメッセージを送ってくれます。すると、DNSサーバーから応答のメッセージがかえってきます。この応答メッセージの中にIPアドレスが格納されているので、リゾルバはそれを取り出して、リゾルバがアプリケーションから呼び出されたときに指定されたメモリー領域にIPアドレスを書き込みます。これでIPアドレスを調べる動作は終わりです。Webサーバーにメッセージを送る時は、このメモリー領域からIPアドレスを取り出して、HTTPのリクエスト・メッセージと一緒にOSに渡して送信を依頼するわけです。
■リゾルバを呼び出す時の動き
リゾルバを呼び出した時のSocketライブラリ内部の動きも簡単にみておきましょう。ネットワーク・アプリケーションがリゾルバを呼び出すと制御がリゾルバの内部に移ります。移るという表現は、プログラミング経験がないと理解しにくいかも知れません。アプリケーション・プログラムに書いてある処理内容は、通常、上から下に順番に実行されていくのですが、それがSocketを呼び出す部分にさしかかりその行を実行すると、そこでアプリケーションの動作が一時的にとまります。そして、Socketライブラリ内部にあるリゾルバが動き始め、アプリケーションから依頼された処理を実行します。このように、別のプログラムを呼び出すことによって、呼び出
し元のプログラムは休止状態となり、呼び出した先のプログラムが動き始めることを制御が移るというわけです。リゾルバに制御が移ったら、そこで問い合わせのメッセージを作ります。これは、ブラウザがWebサーバーに送るメッセージを作るのと似ています。DNSの仕様に従って、「www.lab.glasscom.comというサーバーのIPアドレスを教えて下さい」という意味を持つバイナリ形式のデータを作るわけです。そうしたら、そのメッセージをDNSサーバーに送りいます。そのメッセージ送信動作は、リゾルバが自分で実行するのではなく、OS内部にあるTCP/IPプロトコル処理ソフト(以後TCP/IPソフトと略)を呼び出して実行を依頼します。リゾルバもブラウザと同じp\ '82謔、にネットワークに対してデータを送受信する機能を持っていないからです。リゾルバがTCP/IPソフトを呼び出すと、今度はそこに制御が移り、そこでメッセージを送る動作を実行し、LANアダプタを通じてメッセージがDNSサーバーに向けて送信されます
。コンピュータの内部は、このように多層構造になっています。
■ソケットを生成して、接続状態を官吏
リゾルバを呼び出してWebサーバーのIPアドレスを取得したら、次はSocketライブラリ内のsocketというプログラムを呼び出します。これがOS内部のTCP/IPソフトに送受信の準備を促します。ホテルのチェックインする時のことをイメージして下さい。ホテルにチェックインすると、ホテルはその人に会計用のアカウントを作ります。ホテルのレストランやバーで飲食すればそのアカウントに情報を書き込んでいきます。そして、そのアカウントに書き込んだ情報でその人が今どう言う状態にあるのか把
握します。
TCP/IPソフトのデータ送受信動作もこれと似ており、アプリケーションがどういう状態にあるか常に把握しながら動きます。そのための制御情報などを保管するメモリー領域を用意するのが準備作業の主な目的です。この準備作業を、通称「ソケットを作る」といい、ホテルのアカウントに相当するものを「ソケット」と呼びます。準備が終わったら、TCP/IPソフトは「ディスクリプタ」という値をアプリケーション(この場合はWebブラウザ)にかえします。今のコンピュータは、同時に多数のアプリケーションを実行できますから、それら複数のアプリケーションがTCP/IPソフトを通じて同時にデータ送受信を行うこともあります。このとき、TCP/IPソフトが個々のアプリケーションを識別するために、それぞれのアプリケーションに渡す一種の番号札のようなものが、ディスクリプタです。以後、TCP/IPソフトにデータ送受信を依頼する時に、アプリケーションはこのディスクリプトを提出します。
■IPアドレスとポート番号をTCP/IPソフトへ通知
socketmの実行が終わり、ディスクリプタがかえってきたら、次はconnectというプログラムを呼び出して接続動作を実行します。これも TCP/IPソフトの内部を探検する時に詳しくはなしますが、ここでのポイントはサーバーのIPアドレスとポート番号をTCP/IPソフトに通知することです。TCP/IPソフトにデータ送受信を依頼するアプリケーションは、「どこの」「だれ」と通信したいのかTCP/IPソフトに知らせなければ通信できませんが、その「どこの」「だれ」かを指定するために、IPアドレスとポート番号を使うわけです。逆に言うと、IPアドレスとポート番号の両方が分かっていないと通信はできません。リゾルバを呼び出してIPアドレスをDNSサーバーに問い合わせる理由はここにあります。
■サーバー側は待ち受け準備をする
サーバー側は、クライアントから通信開始の知らせが届く前に準備が必要です。その準備は、socket, bind, listen, acceptというプログラムを呼び出すことです。
■サーバー側はIPアドレスを照合して接続許可を返信
クライアントから通信開始の制御パケットが届いたら、bindで設定したIPアドレスと照合して通信を許可鵜するか否かを判断し、応答パケットを送ります。これで接続動作は終わりです。■さあ、メッセージを送受信開始
長くなりましたが、これでやっと送信の準備が完了です。そうしたらクライアントはwriteを呼び出します。そのとき送信データとそのデータの長さを渡します。すると、TCP/IPソフトがそのデータをサーバーに送ってくれます。Webブラウザが作ったHTTPリクエスト・メッセージが、ここでいうデータです。TCP/IPソフトはその中身には触れず、そっくりそおのままサーバーに送ります。
■メッセージを送受信の終わりを通知
これで、クライアントとのサーバーのやりとりは終わりです。あとは、closeを呼び出して通信終了を知らせる制御パケットを送ります。 TCP/IPのルールでは、どちらから通信終了してもかまわないのですが、Webアクセスの場合はサーバー河から通信を終了します。するとクライアントではreadを呼び出した時の戻り値で通信が終了したことをアプリケーションに知らせます。そうしたら、クライアント側でもcloseを呼び出します。 closeを呼び出すと通信に使ったパケットが抹消されます。これがHTTPのリクエスト・メッセージを送ってレスポンス・メッセージを受け取る際の動きです。