ある程度ネットワークの知識がついてくると、ある時点で疑問に思うことがあると思います。
「WEBサイトにアクセスした時、自分のMACアドレスはローカルエリア外部に出ると変更されるのになぜ自分のPCにレスポンスが返ってくるのか?」
語彙力があれですが、どうでしょうか、少なくとも過去、私はとても疑問でした。
ローカル通信ではMACアドレスでやりとり、外部ではグローバルIPでやり取り、あれ、でもローカルでクライアントのPCを識別するMACアドレスは外部に出ると変わっちゃうよね、じゃWEBサイトにアクセスできてもレスポンスはなにを元に返ってくるんだろう。
語彙力があれですが、こういう事です。これが解決される仕組みを今回は分かりやすく説明したいと思います。
目次
OSI参照モデル
7階層の通信プロトコル
図のようにレイヤ1~7に分けて定められたコンピューター間の通信手段である「OSI参照モデル」があります。上位から順に頭文字をとって、「アプセトネデブ」で覚えられていますね。
ややこしいのでかなり要約しますが、7~5はアプリ、4はTCPかUDP、3がグローバル通信で2~1がローカル通信て感じです。
例えば個人のPCからヘルニアクソ野郎.comというサイトにアクセスするなら、個人のPCではレイヤ7~1の順に処理が行われ、送信するパケットにそれぞれのデータが格納されます。(要約すると下記のような情報)
①アプリの種類(今回はブラウザ)
②TCP通信
③宛先、送信元の情報
ヘルニアクソ野郎.comでは、受け取ったパケットを逆の手順で処理します。つまりレイヤ1~7の順番です。
①宛先、送信元の情報
②TCP通信
③アプリの種類(ブラウザ)
ヘルニアクソ野郎.comは、アクセスがあった利用者にレスポンスを返すので、次はレイヤ7~1の情報をパケット化し、アクセス元へ返却します。そして利用者側はレイヤ1~7の順番で処理すると。
大まかに言えばOSI参照モデルはこういった通信の仕組みです。
ローカル通信について
MACアドレスでやりとり
まずローカルエリアでの通信について触れておきます。
ローカルエリアに接続されたPCなどの機器には、「ローカルIP」が割り振られていますが、ローカルエリア内でデータのやり取りをするにはPCにあらかじめ割り振られている唯一無二の識別で番号である「MACアドレス」を使ってパケットを転送しています。
しかし、送信したい相手のローカルIPは分かっていても、MACアドレスは分かりません。
そこで、「ARP」という機能を使って、勝手に相手のMACアドレスを調べてくれているのです。
ARP
まず、ローカルエリア内のすべての機器に、「〇〇のIPはどこですか?」というパケットを送信します。(ブロードキャスト)
〇〇のIPに該当する機器があれば、その機器から「MACアドレス」の情報が返ってきます。
したがって、そのMACアドレス宛てにデータの転送が可能になるわけですね。
このように、IPアドレスからMACアドレスを導き出してくれる機能を「ARP」と呼びます。
ネットワークにつながる仕組み
WANに出るまで
それではヘルニアクソ野郎.comに接続する流れを見ていきましょう。
まず、ブラウザでヘルニアクソ野郎.comのurlを叩くと、そのIPアドレスがローカルエリアに存在するか確認を行います。前途したブロードキャストですね。
もちろんヘルニアクソ野郎.comはグローバルIPなので、該当する機器は見つかりません。
その時は、「デフォルトゲートウェイ」に誘導されます。WANへの出入り口であるルーターの事ですね。
ここでアクセス元のローカルIPが「NAT変換」によって「グローバルIP」に変換されます。送信元が一意に、1つのグローバルIPになってしまうのですね。
そしてMACアドレスも、ルーターのMACアドレスに変更されてしまいます。
これだと、一見、もう送信元は分からなくなりますよね?
しかしながら、実はNAT変換の際に、もともとのローカルIPが「ポート番号」と紐づけされていて、その情報がルーターに保存されているのです。
そして紐づけされたポート番号は、送信元の情報としてパケットに乗るのです。
感のいい方はもう全てを理解したかと思います。
DNS(ドメインネームシステム)で目的地へ
例えばWEBサイトへアクセスする際に、相手先のIPを直接入力してもいいですが、通常はそんなことは行いませんよね。「ドメイン名」でアクセスしているはずです。
yahoo.co.jpのように、アルファベットで「ドメイン名」がIPアドレスと紐づけられています。
これは、yahooがホスト、coが2LD(セカンドレベルドメイン)、jpがTLD(トップレベルドメイン)、というようになります。各レベルのドメインは、特定のサーバーが管轄しています。
DNSの挙動は、図にある通りDNSサーバーを介して、TLDから順にホスト(目的地)までの道のりを聞いていく流れとなります。
yahoo.co.jpの名前解決なら
1、ルートDNSサーバーへアクセス、jpサーバーの場所を聞く
2、jpサーバーへアクセス、co.jpサーバーの場所を聞く
3、co.jpサーバーへアクセス、yahoo.co.jpのサーバーを聞く
4、yahoo.co.jpへアクセス、IPアドレスを入手
5、yahoo.co.jpのページが見れる。
となります。
したがってヘルニアクソ野郎.comなら、DNSでcomサーバー配下のヘルニアクソ野郎のIPを聞き出し、アクセス出来るといった感じです。
名前解決の後、ヘルニアクソ野郎.comへ「宛先IP、送信元IP、送信元ポート番号、TCP接続、アプリのポート番号」等が入ったパケットを運びます。
宛先へ到着するまでにいくつものプロバイダを経由(ルーティング)する事になりますが、そのたびに「MACアドレス」は更新されていきます。IPアドレスは変わらず、そのままです。
ヘルニアクソ野郎.com到着
名前解決したIPアドレスをもとに、宛先に到着しました。
しかし、送信元と同じように、この先はローカル環境になっている場合があります。では目的のサーバーへはどうやって接続するのでしょうか?
簡単です。今回はWEBサイトの接続ですので、宛先ポート番号に「80、443」等がパケットに入っています。相手方はWEBサイトを公開しているため、WEBサーバーのポートが開放しています。つまりWEBサイトへのアクセスはポートフォワーディングして公開WEBサーバーへ誘導してくれるのです。
これでヘルニアクソ野郎.comにたどり着きました。それではWEBサイトの情報をレスポンスとして受け取る流れを見てみましょう。
レスポンスの流れ
ヘルニアクソ野郎.comは、送信元のIPアドレス宛に、WEBサイトの情報を返します。
すでにIPアドレスが判明しているので、名前解決は不要ですね。
パケットには同じように「送信元IP、送信元MACアドレス、宛先IP、宛先ポート番号、TCP接続、アプリのポート番号、データ」等が入っています。
アクセス元へ到着するまでは、同じくいくつものプロバイダを経由していきます。
アクセス元へ到着
アクセス元のグローバルIPに到着しました。
さて、ここから先のローカル環境にいる機器は、どうやって判別するのでしょうか?MACアドレスは当てになりません。
そうです、「アクセス元のポート番号」が役立つんですね。
前途した通り、ヘルニアクソ野郎.comにアクセスする際、デフォルトゲートウェイを飛び出すときに、ルーターで「ローカルIP」と「ポート番号」を自動で紐づけてくれているんです。
したがって、ポート番号から、アクセス元のローカルIPを割り出す事ができます。
しかし、ローカルではMACアドレスでのデータ転送となります。そこで、「ARP」を使っているんですね。
つまり、レスポンスデータの受け取りは、
1、ポート番号で紐づいているローカルIPを割り出す
2、ARPで割り出したローカルIPに紐づくMACアドレスを検索
3、返事のあったMACアドレス宛に、レスポンスデータを転送
となります。
少々長くなりましたが、これがネットワーク接続の基本になります。
普段何気に見ているWEBサイトも、最低でもこれだけ複雑な処理の上で成り立っているんですよね。
ICTの技術は生活の中心的存在となっていますので、ネットワークに関する基礎的な知識もある程度は覚えておいて損はないかと思います。