【初学者向け】インターネットはなぜつながるのかを簡単に解説
こんにちは。はるまきです。
先日、社内の新卒向けに、「ネットワークはなぜつながるのか」をテーマに簡単な勉強会を開催しました。
ブログにも記載したいと思います。
この記事はこんな人向けに記載しています。
・ネットワークの基礎を知りたい方
・パケットやTCP/IPを聞いたことあるけどよくわからない方
またこの記事では以下のことについて記載します。
・ネットワークの簡単な歴史
・ネットワークの仕組み
・TCP/IPの説明とその特徴
・パケットの説明
・ブラウザで検索ボタンをポチしてから描画されるまでのデータの流れ (雑に。)
新卒の皆さんからは好評でした。ありがたい!
ネットワークの全体像のイメージ
まずネットワークの簡単な全体像を示します。右側にユーザー側(クライアントサイド,ブラウザなど)があります。左側にはサーバーがあります。ユーザー側は、ルーター, アクセス回線, 電話局, プロバイダなどを通り、最終的にはサーバー側と通信を行います。ざっくり全体像をイメージするだけでも、OKだと思います。
通信技術の歴史
次に通信技術の歴史について簡単に説明します。通信とはなんでしょうか?私はなんでもいいから遠く離れた相手と意思疎通を行うことだと思います。古くは伝書鳩などがありますね。そのあと、世界大戦中に発展したのが腕木信号です。腕木信号は腕の形をした木を変形させて遠く離れた人に情報を送ります。
そのあとに登場するのがモールス信号です。有名なラピュタのムスカ大佐?がピコピコとしているシーンがありますね。これは信号を使って通信をしています。
そのあとに登場するのが現代的なコンピューター同士の通信です。(かなりざっくりですが、、)
有名なARPAネットというものがあります。これはコンピューター同士を結びつけて研究結果などの文書を共有する目的で誕生しました。この頃に初期のルーターが誕生したようです。
より詳しくネットワークの通信を知りたい人にはこちらの本がおすすめです。
通信技術の基礎
それではさっそくネットワーク通信をみていきましょう。
が、その前にパケットについて触れたいです。
皆さんが、研究者でコンピューターとコンピューターを通信させたい時、どうやって通信をしようと思いますか?
以下の画像のようにいくつか疑問点が浮かんでくると思います。
通信をモデル化してみる
上記のような疑問への解決策が、プロトコルです。いくつかの階層に分けて捉えます。
僕の個人的な意見ですが、なんの層がどのような意味なのかは初めは覚えなくていいと思っています。それよりもまず、「層」に分けて考えているんだなとイメージすること自体が大切かなと思います。層に分けて考えることで、応用が効くのだと思います。この後にふれますが、結局モデルごとに層の切り分け方が違うので、丸覚えをしようとしてもあまり本質的ではないかなと思います。
このプロトコルって「結婚」に似ているかも
少し話が脱線します。ふと結婚もプロトコルに似ているなと僕は思いました。
まず、下の階層から「出会い層」があります。出会わないと結婚まではいけないからです。んでもって、ビジュアル層や内面層などを突破します。この時点で、要は通信相手(パートナー)と相性がよくないといけないわけです。ルールがあるし、何かトラブルがあったら通信(結婚)はできません。
そしてまた、この世界に、結婚はいくつかのモデルがあります。宗教や地域によって結婚モデルは変わってくると思います。
これと同じように通信にもいくつかのモデルが存在しています。よくみるTCP/IPは一つの通信モデルです。他にもOSI参照モデルや、AppleTalkやら、SNAやらが存在しています。
このように、いくつかのモデルがあります。共有のルールで通信できていればシンプルでありがたいのですが、どんな世界でも多種多様なようにネットワークの通信にもいろんな形(モデル)がありまっせ、ということですね。
そして今一番流行っているのが、TCP/IPですよ、という話です。
通信ですが、パケットという小さなデータが入った箱を使って行います。
これはざっくりというと、文字列データ"ABCDE"があったときに、それを"A", “B", “C", “D", “E"に分けて運ぶイメージです。分割して送るのでネットワークの渋滞をさけたり、途中で通信障害が起こっても、受け手側が「"C"が届いてませ〜〜ん。」と送信側に伝えれるメリットなどがあります。
TPC/IPについてより詳しく知りたい人にはこちらがオススメです!
冒険の始まりだ!
ざっくりとネットワークの概要がわかったところで、早速冒険に出かけましょう。
OSがパケット作り
まずは、ブラウザで検索する際にパソコンの中で起こっていることを説明します。全体像で言うと右上のところですね。
ブラウザでURLを入力しエンターキーをドーン。するとまずはDNSサーバーに問い合わせをし、IPアドレスを取得します。
(余談ですが、DNSサーバーへの問い合わせで使用しているのがUDPで、通信の担保はしないけどより早くIPアドレスを取得するために採用されているのだとか?)
IPアドレスを取得したら以下の画像のようにパケットを作成します。
まずブラウザがOSに対して依頼します。「OSさん、通信したいっす。パケットを作成して〜」その際は、専用のSocketライブラリというものを使用します。これは通信の際にソケットというパイプ(あくまでイメージ)を作成するのですが、それに関するライブラリです。これはブラウザだけでなく、通信をするアプリケーションで使用されます。
OSはブラウザから依頼をうけたら、自信のパケット作成プログラムを使用して、パケットを作成します。
その際に元のデータを分割します。ブラウザでwebページを閲覧するのであれば、http-headerやhttp-bodyをいくつかのデータに分割します。
次にパケットの中にはどのような情報が入っているのかをみてみましょう。
パケットの中身は、↑の画像のように「IPヘッダー」「TCPヘッダー」「データの断片」で構成されています。
IPヘッダーは、宛先や送信元のIPアドレスの情報が含まれています。自分のIPアドレスや相手のIPアドレスが入っています。
TCPヘッダーには、通信状態の情報が入っています。例えば、このパケット自体は全体の何番目なのかといった情報です。ABCDEの例であれば、Cは3番目という情報を持っています。仮にCだけ届いていないのであれば、前後のBとDから、何が届いていないかを割り出せるわけです。以下↓の画像ではより詳しくIPヘッダーとTCPヘッダーについて記載しています。
このようにIPヘッダーとTCPヘッダーは、さまざまな情報を持っています。他にもたくさんの情報を持っています。気になる方はご自身でググって見て下さい。
PCからLANアダプタへ
パケットになった情報は、次にLANアダプタに送られます。LANアダプタは情報を電気信号に変換してくれます。
電気信号になった情報は次にルーターに送られます。
LANからプロバイダへ
LANのルーターからプロバイダまでの流れを説明します。↓の赤枠の箇所です。
LANのルーターからプロバイダまでの道のりはいくつか選択肢があります。ポピュラーなものを3つ列挙しました。
「FTTH(Fiber to the home)」と「ADSL(電話回線)」と「BWS(Broadband-Wireless-System,ポケットWiFi)」です。
FHHT(Fiber to the home)は光ファイバーを自宅(LAN)まで繋げたものです。CMがボンボン流れている「光!」ですね。ADSL(電話回線)は電話回線を使用してインターネットにアクセスする方法です。光よりは一般的に遅いとされていますが、ブラウザで閲覧する程度であれば全く問題ありません。BWS(Broadband-Wireless-System)はいわゆるポケットWiFiのことです。基地局と電波で直接やりとりを行います。
他にもさまざまな手段があるかと思います。手段がどうであれ、結局プロバイダまでデータが届ければOKです。なぜなら、大切な情報はIPヘッダーやTCPヘッダーの中に含まれているからです。とりあえず何かしらの形でバイナリーを伝えればいいだけって、人類の技術えぐいなって感じますよね。。笑
これで、プロバイダまでデータが届きました。
プロバイダからプロバイダへ
次にインターネットの中核であるプロバイダ間の通信について解説をします。下の画像で言うと赤枠のところです。
インターネットの中核は、結局のところ、巨大光ファイバーでつながったプロバイダ同士の集まりにすぎません。下の画像の右側に海の中の光ファイバーがあります。実際に海の中に光ファイバーケーブルが設置されているんですね。またその画像の横に地図があります。これは光ファイバーの地図です。アメリカやアジアのすべてに光ファイバー網が設置されていることが確認できます。
プロバイダ間では、数十個のルーターを経由して、サーバー側が契約しているプロバイダまでパケットが運ばれます。
サーバー側のプロバイダまで送られたデータ(パケット)は、同じくアクセス回線やルーターを通って最終的にサーバー(宛先)に届きます。
サーバー側での処理
最後にサーバー側に送られたデータがどのように処理されるのかを説明します。全体像でいうと以下の赤枠のところです。
サーバーサイドには、往々にしてファイアウォールが設置されています。まずはこのファイアウォールの働きをみましょう。ファイアウォールの仕組みはとても単純です。ファイアウォールでは、IPヘッダーとTCPヘッダーの値を確認してパケットフィルタリングをしています。IPヘッダーとTCPヘッダーの中には「送信元」「宛先」「通信状況」などの情報があります。例えば、特定の送信元からきたリクエストは破棄するなどができるわけです。
サーバー側では、すべてのパケットが揃うまで待機します。クライアントサイドで100個のパケットに分けたとしたら100個揃うまで待ちます。途中かけているデータがあれば、「67番目を再送信して〜」などとクライアントサイドにリクエストします。
すべてのパケットが揃ったらクライアントサイドからのリクエストを解読します。「なるほど、HTTP通信でGETでこのURLの情報を返せればいいのね、おけ。」的な感じです。
最後にサーバー側からクライアントサイドに情報を返します。
最後にサーバー側からクライアントサイドに情報を返す際も、基本的には今までと同じことが行われます。つまり、パケットにしてIPヘッダー/TCPヘッダーを付与してプロバイダ経由で送信するという流れです。
クライアントサイドでは、パケットが揃った中身を解読します。
「どうやらhttp-headerとhttp-bodyだな。中身をブラウザで描画するか。」
これで無事にユーザーさんはそのサイトの画面を閲覧できるわけですね。めでたしめでたし。
以上で、冒険は終了となります。
まとめ
最後まで読んでいただきありがとうございます。
ベテランの方からしたらツッコミどころ満載とは思いますが新卒向けと言うところでご愛嬌。
もっと学習したい方はこちらの本がおすすめです。こちらの本をベースに今回は紹介しました。
以上になります。では。