応用Network通論
■ブラウザでURLを開くときのパケットが通る道筋
1:ユーザーがブラウザを起動して、URL欄に「http://akademeia.info/」を入力します。「http://akademeia.info」と略してもうまく補正されますが、本来URLと言えば、最後のスラッシュをつけます。
http://akademeia.info/
2:ブラウザはネットワーク通信を行うので、Socketライブラリを使います。ブラウザがURLを解析してHTTPメッセージを作って、Socketライブラリに渡します。
[HTTPメッセージ]
このHTTPメッセージとはHTTPリクエストメッセージのことです。
このHTTPリクエストメッセージはHTTPプロトコルに準拠しています。
HTTPプロトコルとはクライアントとサーバーがやり取りするメッセージの内容や手順を定めたものです。
HTTPプロトコルの内容はURI(Universal Resource
Identifier)とHTTPメソッド(GETメソッドやPOSTメソッドなど)です。前者が「何を」という目的物、後者が「どうする」という動作を意味します。
3:TCPは送信データをパケットの長さに合わせて分割します(これをフラグメント化といいます)。そして、分割したパケットの先頭にTCPヘッダを付加して、IPに渡します。
[TCP][分割されたHTTPメッセージ] [TCP][分割されたHTTPメッセージ]
4:IPはTCPから受け取ったパケットにIPヘッダを付加します。そのIPヘッダにはWebサーバーのIPアドレスが含まれています。
さらに、最寄のルーターのMACアドレスが先頭に付加されます。
その後、LANドライバに渡します。
[MACアドレス][IP][TCP][分割されたHTTPメッセージ]
5:このまま、LANドライバからLANアダプタへ渡されます。
6:LANアダプタはデータを受け取ったら、デジタル情報として、電気信号に変換して、ツイストペアケーブルに送ります。
7:デジタル信号はツイストペアケーブルを通って、リピータハブにたどり着きます。
別にリピータハブが無いならば、ここは飛ばします。
到達したら、リピータハブの性質より、リピータハブに接続されている全てのホストに対して、デジタル信号が送られます。
8:リピータハブが送信したデジタル信号の一つがスイッチングハブに到達します。
スイッチングハブは届いたパケットのMACアドレスとアドレステーブルを比較して、出力先ポートを判断して、そのポートにパケットを送ります。
この例ではパケットのMACアドレスは最寄のルーターのものなので、アドレステーブルを照合して、そのルーターへパケットを送りつけます。
9:パケットはルーターに到達しました。
すると、届いたパケットのあて先IPアドレスを確認します。これはLAN内の存在するIPアドレスではないと判断して、外部のネットワークへ送出します。
その際、MACアドレスの情報はもう必要ないので、それをとります。
よって、外部ネットワークへ送られるパケットは次のようなものです。
[IP][TCP][分割されたHTTPメッセージ]
10:外部ネットワークへ行く途中、ADSLモデムを通過します。そこで、パケットはATMセルに分割されます。
[][][][][][][][][][]
その後、アナログの電気信号に変換して、電話線に送り出されます。
〜〜〜〜〜〜〜〜〜〜
11:電柱の電話線と通って、電話局の局集合モデム(DSLAM)に到達します。
そこで、アナログの電気信号からATMセルに戻されます。
そして、それらをブロードバンドアクセスサーバーに送ります。
[][][][][][][][][][]
12:ブロードバンドアクセスサーバーは一種のルーターの役目を果たします。
まず、ATMセルを受信すると、パケットに戻します。
戻ったパケットに、次のルーターのMACアドレスを付加します。
付加されたパケットはインターネットの中核部へ送り込まれます。
[MACアドレス][IP][TCP][分割されたHTTPメッセージ]
13:インターネット中核部には多数のルーターがあります。
MACアドレスにしたがって、次のルーターに到達したら、あて先IPアドレスを確認して、自分のネットワークアドレス内のものかどうかをチェックします。そうでないならば、以前と同様に、次のルーターに送り出されます。これが繰り返されます。
自分のネットワークアドレス内のものならば、ネットワークアドレス内に送り出します。
14:ルーターからネットワークアドレス内に送り出される途中にファイアウォールが存在することがあります。厳密に言えば、ルーターを含めた領域がファイアウォールなのですが、ここではわざと区別しました。混乱しないようにしてください。
ファイアウォールはパケットを見て、拒否すべきものか、それとも通過してもよいものかを判断します。
通過した良いパケットだけが、ネットワークアドレス内に送りだされます。
15:Webサーバーの手前にキャッシュサーバーがある場合、ファイアウォールを通過したパケットをキャッシュサーバーが横取りします。
ユーザーがリクエストしたWebページがキャッシュサーバーに保管されていれば、キャッシュサーバーがWebサーバーに代わって、そのWebページを送り返します。
キャッシュサーバーが無い場合やキャッシュサーバーに保管されていない場合は、次のステップへ行きます。
その際、WebサーバーのMACアドレスがパケットに付加されています。
[MACアドレス][IP][TCP][分割されたHTTPメッセージ]
16:Webサーバーにパケットが届いたら、LANアダプタとLANドライバが連携して、パケットを受信します。
そして、TCP/IPソフトウェアに渡します。
[IP][TCP][分割されたHTTPメッセージ]
17:TCP/IPソフトウェアはIPヘッダとTCPヘッダを順に検査します。
誤りが無ければ、パケットからHTTPメッセージの断片を取り出して、元のHTTPメッセージに戻します。
[HTTPメッセージ]
18:元の形に戻ったHTTPメッセージはSocketライブラリを介して、Webサーバーに渡されます。
19:Webサーバーは受け取ったHTTPメッセージの内容を解析して、そこに書かれている内容(メソッド)にしたがって、データを取りだして、クライアントに送り返します。
これがクライアントに届くと、ブラウザにその結果が表示されます。
■Webページを閲覧しているときに何が起こっているのか
●netstat
netstatコマンドは、TCP/IPにおける通信の状態を調査するために使われる、最も基本的なコマンドです。Windows、UNIXにデフォルトで付いています。
netstatコマンドの最も基本的な使い方は、通信中のTCPコネクションの表示機能です。
netstatコマンドを実行すると、ローカルのマシンのTCP/IPプロトコルスタック上で現在アクティブな、TCP通信(コネクション)の状態を表示することができます。
TCPとは、2つのアプリケーション間において、信頼性のある通信路(これをコネクションという)を確立し、お互いにデータをやり取りする通信プロトコルです。ちなみに、アプリケーション間は、同一マシン上のアプリケーション同士でもよいし、異なるマシン上にある2つのアプリケーションでも大丈夫です。
次のように引数無しでnetstatコマンドを実行すると、現在アクティブなTCPのコネクションを調べることができます。あくまでTCPコネクションが確立したものだけです。つまり、これはStateがLISTENINGではないコネクションだけが表示されます。
ここでは、WindowsのDOS窓で実行した例を示します。
-----
> netstat
-----
1ページ以上の出力で、全てが見れない場合は、次のようにmoreコマンドを併用するとよいでしょう。スペースを押すと次の1ページ、[Enter]キーを押すと次の行を表示させることができます。
-----
> netstat | more
-----
<IMG SRC="netstat1.BMP">
netstatコマンドの出力は、次の項目から構成されています。
・Proto
・Local Address
・Foreign Address
・State
○Proto
これは使用中のネットワーク・プロトコルの種類です。TCPまたはUDPと表示されます。
-aオプション無しでnetstatコマンドを実行するとTCPコネクションが確立されたものだけ表示されますので、ProtoにはTCPとしか表示されないはずです。
○Local Address
これはローカル側のIPアドレスと使用中のTCPのポート番号が表示されます。
1つのマシンには複数のIPアドレスを付けることができるし、ローカルのループ・バック・アドレス(127.0.0.1)が使われていることもあるので、「Local
Address」に表示されるIPアドレスは固定的ではありません。
「:」の左側がIPアドレスまたはホスト名、右側がポート番号になります。
○Foreign Address
これは通信相手となっているマシンのIPアドレスと使用しているポート番号が表示されます。
同じマシン同士でもコネクションを確立することができるので、「Foreign
Address」が自分のIPアドレスの場合もあります。
○State
これはTCPコネクションの状態を表しています。UDPコネクションでは表示されません。
TCPはステート(状態)を持つプロトコルであり、コネクションの開始や終了、通信方法などに関しては細かい手順が決められています。
例えば、サーバーとクライアントのどちらの側から先に通信を開始するのか(どちらがサーバ側でどちらがクライアント側か)、終了を宣言するにはどちらの側から最初にコマンドを送り、それに対する応答はどうするのかなどが厳密に決まっています。
通信速度は有限なので、たとえ双方が同時に終了コマンドを送ったとしても、相手側へそれが届くまでにはタイムラグがあります。そのため、ローカル側から先に終了コマンドを送るか、相手側が先に送るか、それとも双方同時に終了コマンドを送るか、などに応じて破綻のないように決められています。
●netstatのState欄
次にStateで表示される状態の一覧表を示します。
===============================================================================
状態 | 頻度 | 概要
===============================================================================
CLOSED | − | 未使用状態のTCPポート。
-------------------------------------------------------------------------------
LISTENING | ◎ | 待ち受け状態(リッスン状態)のポート。
| | netstatに-aオプションを付けると表示されます。
-------------------------------------------------------------------------------
SYN_SENT | ○ | 通信の開始要求(SYN)を送信したが、
| | まだそれに対する確認応答(ACK)を受け取っていない状態。
| | また、相手が無応答のときもこの状態になります。
| | ACKを受け取るとESTABLIHSEDへ遷移します。
-------------------------------------------------------------------------------
SYN_RECEIVED | − | クライアントからSYN要求を受け取った直後の状態。
| | SYNに対するACKを送信するとESTABLISHEDへ遷移します
-------------------------------------------------------------------------------
ESTABLISHED | ◎ | TCPコネクションが確立して通信している状態。
| | どちらかが終了処理を始めると、
| | FIN_WAIT_1またはCLOSE_WAITへ遷移します。
-------------------------------------------------------------------------------
FIN_WAIT_1 | − | 自分の側からFINを送信した状態。
| | そのFINに対するACKを相手から受信すると、
| | FIN_WAIT_2へ遷移するが、
| | 先に相手からのFINを受けるとCLOSINGへ遷移します。
-------------------------------------------------------------------------------
FIN_WAIT_2 | − | FINに対するACKを受信した状態。
| | 相手からのFINを受信して、それに対するACKを返すと、
| | TIME_WAITへ遷移します。
-------------------------------------------------------------------------------
CLOSE_WAIT | △ | 相手からのFINを受け取った状態。
| | アプリケーションが終了すると、
| | FINを送信してからLAST_ACKへ遷移します。
-------------------------------------------------------------------------------
CLOSING | − | FINに対する相手からのACKを受けるとTIME_WAITへ遷移します。
-------------------------------------------------------------------------------
LAST_ACK | − | 送信したFINに対するACK待ち状態。
| | ACKを受け取るとCLOSEDへ遷移して終了します。
-------------------------------------------------------------------------------
TIME_WAIT | ○ | コネクションの終了待ち状態。
| | しばらく待ったあと、CLOSEDへ遷移して終了します。
===============================================================================
●TCPの状態遷移とState欄
ここで、TCPの状態遷移【センイ】について解説します。
netstatコマンドのState欄に表示される状態を示す文字列は、内部的な状態遷移を表します。
大雑把に言えば、TCPコネクションは要求、確立、終了という状態遷移が移ります。
もう少し厳密に言えば、TCP通信では、SYNまたはFINを送信し、それに対して、ACK確認応答を送信します。ちなみに、SYNやFINの送信とACK確認応答はクライアントからサーバーへ、またはサーバーからクライアントへの双方向で行われています。
上の表では、頻度に「-」の状態があることが分かります。これはnetstatのState欄には表示していないが、状態遷移しているときの内部的状態です。
●オプション
○Windowsのnetstatコマンドのオプション
Windowsのnetstatコマンドの書式は次のようになっています。
> netstat [-a] [-e] [-n] [-s] [-p プロトコル] [-r]
[インターバル]
そして、オプションを次に示します。
===============================================================================
オプション | 概要
===============================================================================
無し | 現在の有効な接続(ESTABLISHED)のみを表示。
-------------------------------------------------------------------------------
-a | 現在のすべての接続を表示。
-------------------------------------------------------------------------------
-e | インターフェイスレベル(イーサネット)の統計情報を表示。
-------------------------------------------------------------------------------
-n | 出力をIPアドレスなど数値のみで表示。
-------------------------------------------------------------------------------
-s | プロトコルレベル(IP/TCP/UDP/ICMP)の統計情報を表示。
-------------------------------------------------------------------------------
-p | プロトコルごとの接続をリストします。
| プロトコルにはTCPかUDPを指定できます。
-------------------------------------------------------------------------------
-r | ルーティングテーブルを表示。
-------------------------------------------------------------------------------
-o(※1) | そのコネクションを所有しているプロセスのID(PID)を表示。
-------------------------------------------------------------------------------
インターバル | この間隔(秒単位)で連続自動実行。
===============================================================================
○UNIXのnetstatコマンドのオプション
UNIXのnetstatコマンドの書式は次のようになっています。
-----
$ netstat [-vnNcaeol] [ソケットレベル] ←接続一覧表示
$ netstat [-veenNac] -i ←インターフェイスごとの統計表示
$ netstat [-cnNe] -M ←マスカレード機能の統計表示
$ netstat -s [ソケットレベル] ←ネットワーク全般の統計表示
$ netstat [-veenNcCF] [-A アドレスファミリ名]
-r ←ルーティング・テーブルの表示
$ netstat -V ←ヘルプやバージョン表示
$ netstat -h ←ヘルプやバージョン表示
-----
そして、次にオプションを示します。
===============================================================================
情報源 セキュリティアカデメイア
|