11章について
この章では、これまで学んできたことを結びつけてネットワークの概念について説明してありました。
最終的にシンプルなWebサーバーの実装を通じて体系的に学ぶことができます。
以下まとめです。
ネットワーク
すべてのネットワーク・アプリケーションはクライアント・サーバ・モデルに基づいている。
アプリケーションはサーバと 1 つ以上のクライアントからなる。
サーバは資源を管理し、その資源を操作することでクライアントにサービスを提供している。
ネットワークから受信したデータは、DMA転送によってアダプタからI/Oバスとメモリ・バスを超えてメモリにコピーされる。
また同様にデータはメモリからネットワークにもコピーされる。
- DMA転送 : CPUを介さずに周辺機器やメインメモリ(RAM)などの間で直接データ転送を行う方式。
パソコンなどの機器を有線接続する際の通信規格のこと。
ケーブルの形と機器の差し込み口が統一されないとケーブルが差せないが、イーサネットによりメーカーの異なる機器同士でも接続できる。
ルータ
複数の互換性のない LAN がルータとよばれる専用コンピュータによって接続される。
各ルータは接続されているそれぞれのネットワーク用のアダプタポートを持つ。
プロトコルの機能
異なるネットワーク間の違いを取り除く。
各ホストとルータで動作しているプロトコル・ソフトウェアの層でプロトコルを実装している。
各ホストはインターネット・アドレスを少なくとも1つ割り当てられる。
データをパケットとよばれる別々の塊に詰め込むための方法を定義することで違いをなくしている。
グローバルIPインターネット
インターネットを世界中に広がった次の性質を持つホストの集まりと考える。
ホストの集合 : 32 ビットの IPアドレスの集合にマップされる。
IPアドレスの集合 : インターネット・ドメイン名とよばれる識別子の集合にマップされる。
インターネット・ホストのプロセスはコネクション越しに他のホストのプロセスと通信できる。
インターネット・ドメイン名
人間が分かりやすいようにドメイン名を別に定義している。
通信自体はIPアドレスを使っている。
(例)
ドメイン名 : example.com
IPアドレス : 192.0.2.1
ドメイン名があればいちいちIPアドレスを入力しなくていいので便利。
1988年まではテキストファイルで手動で管理されていたが、現在はDNSとよばれる世界中に分散したデータベースで管理しているという。
TCP/IP : プロトコル群のことで、それぞれのプロトコルは異なる機能を提供している。
TCP : プロセス間で信頼性の高い全二重のコネクションを提供するために、IP の上に構築する複雑なプロトコル。
IP : 基本的な名前づけの体系と、インターネットのあるホストから別のホストにパケットを送ることができる配送メカニズムを提供する。
UDP : IP をわずかに拡張したもの。パケットがホスト間ではなく、プロセス間で転送される。
IPアドレス
符号なしの 32 ビット整数。
TCP/IP では、最上位バイトから下位バイトに向けて順に記述するビッグエンディアンが用いられるため、 IPアドレスの構造体のアドレスは、リトルエンディアンであっても、常にビッグエンディアンのネットワーク・バイト・オーダで格納される。
インターネット・コネクション
クライアントとサーバはコネクション越しにデータのストリームを送受信することで通信を行う。
ソケット
各ソケットはインターネット・アドレスと 16 ビット整数のポートからなり、対応するソケット・アドレスを持つ。
ソケット・ペア
コネクションは 2 つのソケット・アドレスによって一意に特定される。
この一対のソケット・アドレスはソケット・ペアとよばれる。
(クライアントのIP : クライアントのポート, サーバーのIP : サーバーのポート)
として表される。
クライアントのソケット・アドレス : 128.2.192.242:51213 ウェブサーバのソケット・アドレス : 208.216.181.15:80 ソケット・ペア : (128.2.192.242:51213, 208.216.181.15:80)
ウェブの基本の話
クライアントとサーバは HTTP を用いてやり取りを行う。
ウェブ・サーバはクライアントに 2 つの異なる方法でコンテンツを提供する。
- ディスク上のファイルを取ってきて、その中身をクライアントに返す。
- 実行可能ファイルを実行し、その出力をクライアントに返す。
Webサーバによって返されるコンテンツは、サーバが扱うファイルに関連付けられ、それぞれ URL とよばれる一意の名前を持つ。
HTTPトランザクション
HTTP は Linux の Telnet を用いることができる。
HTTPリクエスト
HTTPリクエストは、リクエスト行とリクエスト・ヘッダ、ヘッダのリストを終わらせる空行からなる。
リクエスト行の形式 : method URI version
HTTP は GET, POST, PUT, DELETE, など多くのメソッドをサポートしている。
version フィールドはリクエストが従うべき HTTP のバージョンを示す。
最新のバージョンは、HTTP/1.1 で、初期のシンプルなバージョンに HTTP/1.0 がある。
HTTPレスポンス
HTTPレスポンスはレスポンス行とレスポンス・ヘッダ、ヘッダのリストを終わらせる空行、レスポンス本体からなる。
レスポンス行の形式 : version status-code status-message
status-code はリクエストの性質を湿す3桁の正の整数のこと。 404, 200 とか。
子プロセスの出力先
CGI は動的コンテンツを標準出力に送る。
そのため子プロセスは CGI をロードして実行する前にリダイレクトする。
親プロセスは子プロセスが生成したコンテンツのタイプやサイズを知らないため、子プロセスはレスポンスヘッダの Content-type と Content-length を生成する責任がある。
感想
これまで学んできた知識が繋がってなるほどなぁという感じでした。
表面的なことだけではなく、内部的にどのような仕組みになっているのか学ぶことができてよかったです。
またこの章では、エコー・サーバの実装例など、コードが豊富に記載されていました。
今後ウェブサーバを実装する課題に取り組むときにまた読み返してみようと思います。