#概要
クライアントが送ったリクエストが「どのような形」で「どのような経路」を通ってサーバーに届くのかを図を用いてまとめました。詳細を理解するというよりは、図をもとにイメージを理解できることの役に立てればと思います。
「ネットワークはなぜつながるのか」を要約した内容になります。
#目次
- どのような形で送られるのか
- データはパケットという単位に分割されて送られる
- パケットはヘッダーとデータ本体で構成される
- どのような経路で送られるのか
##どのような形で送られるのか
####データはパケットという単位に分割されて送られる
インターネットを流れるデータはパケットという単位に分割されます。
1つのパケットのバイト数は決まっているので、総データ量/1つのパケットのデータ量分のパケットに分割される。
複数のパケットに分割する理由は、大きなデータを分割せずにインターネットに流すと、長時間1つの通信で回線を専有してしまって、他の通信ができなくなってしまうから。
送りたいデータだけでは、インターネットを通して目的の相手に届かない。
なぜなら、どこにそのデータを届けるのか、どのような方法で届けるのか等の情報がないから。
そこで、そのような、送りたい本来のデータ(図で言うアプリケーションデータ)以外の情報をヘッダとして追加する。
ヘッダは段階的に追加される。
どのような段階を踏むかというと、TCP/IPモデルという階層モデルで、各階層でそれぞれヘッダが追加される。
TCP/IPモデルはよく郵便が届く過程に例えられるので以下の2つの例を対比させて表にしてみました。(あくまでイメージです)
- hoge.comというサーバにあるfoo.htmlというファイルを送ってもらうリクエストをする
- hogeさんに書類fooを送ってほしいと依頼する書留郵便を送る
上位の階層でヘッダがつけられ、下位の階層に渡される。このとき 下位の階層は上位の階層で追加されたヘッダもデータとして扱う。
例えば、
トランスポート層でアプリケーションデータにTCPヘッダを追加してインターネット層に渡した場合、インターネット層はアプリケーションデータ+TCPヘッダをデータとして扱う。
そこにIPヘッダなど自身の階層のヘッダを追加する。そしてまた下位の階層にデータを渡す。
それぞれの階層は他の階層の情報は見ないので独立して処理を行っている。
こうすることで、__通信の方法に柔軟性が生まれるメリット__が有る。
例えば、あるときはアプリケーション層はHTTPを使って、トランスポート層でTCPを使い、またあるときはトランスポート層はUDPにするなど。
郵便の例で考えると、本文や宛先は同じだけど、書留でなく普通の郵便を使うなど、必要に応じてその階層の部分だけを変えられる。
すみません、ごちゃごちゃと書いてしまいましたが、まとめると__インターネットに送るデータは相手に伝えたいデータ本体だけでなく、それを適切に届けるための付加情報(ヘッダ)がついた状態__でインターネットに送り出される。
どのような経路で送られるのか
###バケツリレーでパケットを宛先まで届ける
直接LANケーブルなどでつながっている場合は、直に通信ができるが、多くの場合そうではない。
そこで、パケットはヘッダについたIPアドレスを目指してルーターやハブを経由して届けられる。
例えば、上の図でローカルネットワークAにあるPC1(以下PC1)がローカルネットワークCのPC3(PC3)にパケットを届けたい場合を考える。
先程のhoge.comにリクエストをする例と対比させると、PC1がクライアントでPC3がhoge.comのサーバーと言うことになる。
順序としては
1.
PC1が宛先IPアドレスにPC3を、MACアドレスにルーターAを設定したパケットを作成する。
IPアドレスには最終的な宛先、MACアドレスアドレスにはバケツリレーしてもらうための最寄りの中継先(ルーター)を設定する。
パケットを受け取ったルーターAが次の中継先であるルーターDにMACアドレスを書き換える。
書き換えるのはMACアドレスのみ
ルーターDがパケットを受け取りルーターCにMACアドレスを書き換える。
ルーターには宛先IPアドレスに応じてどの次の中継先はどこかわかるように、__宛先IPアドレスと次の中継先のMACアドレスの対応表のようなものがある__ので、ルーターBではなく、ルーターDに中継できる。
また、上の図ではインターネット部分にルーターが簡略化のため1つしかがないが、実際には多数のルーターがある。
原理的には同じ要領でパケットを中継している。
最終的にルーターDからPC3にパケットが届けられる。
#余談
ハブ(スイッチングハブ)は届いたパケットを中継する。
ルーターと違い自身にIPアドレスやMACアドレスアドレスはなく、パケットの宛先MACアドレスを元にパケットを振り分ける。