logo Al Arkhabil الأرخبيل
真空の個人チャンネル @vericava

インターネットの技術について

この記事は,アドベントカレンダー企画 にて第1日の記事「インターネットの技術について」として書かれたものです。

筆者:真空 (ネットワークスペシャリスト)

公開日:2023年12月01日


インターネットって何だっけ?

インターネットと聞いて想像するものは何でしょうか。

スマホ? サイバーな空間?

インターネットはコンピュータどうしをつなぐネットワークとして始まりました。 そして,あらゆるものがコンピュータになるにつれ,あらゆるものがインターネットにつながる——Internet of Things (IoT) として 再び注目を集めるようになってきています。

今回の記事では,このインターネットがどのような技術でできているのかということを, ギリギリ一般人でも分かるレベルで,しかし普通の一般人向けの記事ではあまり紹介されないところまで, 紹介してみたいと思います。

インターネットの構成

インターネットは基本的にはコンピュータ (現代のスマホやゲーム機もコンピュータの一種です) どうしを つなぐネットワークです。

このネットワークとして一番単純なものを考えます。それは2台のコンピュータをつなげただけのものです。PCが2台あって, それをLANケーブルでつないだと思ってください。

+------+       +------+
| PC 1 +-------+ PC 2 |
+------+       +------+

このとき,PC 1 と PC 2 のあいだはひとつのネットワークを構成しています。

ここでは IP アドレスの設定とかそういう難しいことは済んでいるものと考えます。(初期状態で使えるリンクローカルアドレスを使ってもいいですしね)

PC 1 と PC 2 は同じネットワークにいるので,通信は簡単にできます。

「プロトコル」の重層構造

ところで,このように普通に PC を LAN ケーブルでつないだとき,一番基本的なところで動いているのはイーサネット という技術です。身の周りのネットワークはだいたい (Wi-Fi も) 基本はイーサネットになっています。

では,イーサネットがインターネットの基本なのでしょうか。実際に身の回りのインターネットにつながっているネットワークはだいたいイーサネットですし, 通信事業者も技術の発展とともにイーサネットをより多くの場面で利用するようになってきています。

しかし,イーサネットはネットワークを物理的につなげるためのひとつの方法で,他のどのような方法を利用しても,インターネットにはつながるようにできています。 なぜならインターネットは,Internet Protocol (IP) という,イーサネットのさらに上に構築したしくみ (プロトコル) で動いているからです。

IP! あの「IPアドレス」のIPです。やっとでてきました。

プロトコルとは,コンピュータがやりとりするための一連の手続きを定めたもので,自分も相手もそれに従って通信するので, どのように通信するのかが分かるようになっているものです。あるプロトコルを使うと一定のしくみで通信できるようになるので, そのプロトコルの上でさらに別なプロトコルを動かしてさらにもっと複雑な通信を行う,のように,プロトコルというのは (対応している限り) 重層的に使えるようになっています。

身の回りのネットワークでは,一番下にあるプロトコルがイーサネットで,その上でIPをやっているのです。

この重層構造のことをレイヤと呼び,物理的なハードウェアである物理層をレイヤ1 (L1),イーサネットをレイヤ2 (L2),その上で動く IP のことを レイヤ3 (L3) と呼ぶので覚えておくといいことがあります。

通信さえできれば,その上でいろいろなプロトコルを動かすことができるので,例えば,実用的ではありませんが, 信号旗のやりとりであったりとか,伝書鳩にSDカードを運ばせるプロトコルを使ってインターネットを使うことができます。 もっと速く通信したいから新幹線で本社まで大容量ハードディスクを持っていくプロトコルとか。(これは,笑い話ですが実際に使われています。)

IP ができるところではどこでもインターネットができます。Internet Protocol (インターネット・プロトコル) というゆえんです。

(もちろん,IP でできているけれども物理的にインターネットから切り離されたネットワークというのは,セキュリティ目的とかで存在します。)

2つより多い機器をネットワークにつなげる

イーサネットでは,ハブ (スイッチングハブ, hub) を使うと,1つのネットワーク (LAN, サブネットなどいろいろな言い方があります) に複数の機器をつなげることができます。その上でIPも正常に動作します。

+------+      +-----+      +------+
| PC 1 +------+ hub +------+ PC 2 |
+------+      +--+--+      +------+
                 |
                 |
              +--+---+
              | PC 3 |
              +------+

Wi-Fi ルータのLAN側も,通常は複数の機器を差せるようにハブになっています。

一般によく見るハブのポート(差すところ)の数は5とか8ですが,業務用のハブ (L2スイッチといいます) の中には48個とかもっと差せるものもありますし,複数のハブをつなげることもできます。(実際にやってみる人に注意: ハブを複数つないでループ(輪っか)ができると,通信が無限に回りつづけて通信がおかしくなって通信できなくなることがあるので注意! これは,STP (Spanning-Tree Protocol) というループになっていても無限通信を防ぐプロトコルもあるのですが,対応していないことがあるので,実際のネットワークの現場でもよく通信障害の原因になっているやっかいなヤツです。)

離れたところにある複数のハブをつないで,ってこともできますし,数千個のPCをこれでつなぐことはできます。しかし,LANにはブロードキャストといってLANの全員に流す通信が存在するので,こんなに広大なネットワークで全員がこれをやるというのは大変なことです。

何よりもクソデカLANは管理が大変です。いずれにしても,インターネットはひとつのLANにするには大きすぎるので,何か考えなければいけません。

分割されたネットワークをつなぐ——ルータの役割

ネットワークがデカすぎる? じゃあ分割すればいいじゃない。

まず,簡単のため,ネットワークを2つに分割することを考えます。 そもそも,イーサネットの上にIPを動かすという面倒な仕組みを使っているのも,イーサネットの限界を超えたネットワークでも通信ができるようにするためです。

ひとつのLANの中では,イーサネットが直接通じるので,IPを使うのも簡単です。

しかし,今 LAN1 と LAN2 があります。LAN1にあるPC11とPC12は通信できますし,LAN2にあるPC21とPC22も通信できます。

+------+       +------+
| LAN1 |       | LAN2 |
+------+       +------+
PC11, PC12     PC21, PC22

しかし,LAN1とLAN2の間は通信できません。これはイーサネットでは解決が困難(イーサネットをくっつけたら結局1つのLANになってしまうので分割の意味がない)です。

実際には,私たちはイーサネットを直接ではなく,IPを使っているので,IPを使った解決法があります。

イーサネットはレイヤ2で,IPはレイヤ3であったことを思いだしてください。

イーサネットでできなくても,IPのレベルで隣りのLANに転送すればよいのです。この転送 (forwarding) を行う機器をルータ (router) といいます。

そう,あのルータです。

ルータはIPのレベルで転送を行うので,ルータはレイヤ3の機器です。

ルータでLAN1とLAN2をつなぐと次の図のようになります。

+------+    +--------+    +------+
| LAN1 +----+ Router +----+ LAN2 |
+------+    +--------+    +------+
PC11, PC12                PC21, PC22

ルータを使うときの注意としては,LAN1にある機器はLAN2のことを知らないし,LAN2にある機器はLAN1のことを知らないので,これをルータを経由するように教える必要があることです。これには次のような行き方 (経路,ルート) を設定します。

LAN1の機器 (PC11, PC12) に設定する経路「LAN2に行くには,Router に行きなさい」

LAN2の機器 (PC21, PC22) に設定する経路「LAN1に行くには,Router に行きなさい」

いったんルータに着いてしまえば,ルータはLAN1とLAN2の両方につながっていて,どちらも知っているので転送は正常にできます。

ルータを使えばいくらでもネットワークをつないでいくことができるので,基本的にはこれでインターネットができています。

これだけで終わってしまう説明も多いですが,網の目のようにつながったインターネットが実際に機能するには,どのルータを通ったら目的地のネットワークに行けるのかという,各ネットワークへの経路が分かっていなければいけません。一番簡単なのが,各ルータで静的に設定しておいて,変更するときは管理者が変更する方式です。(これを静的(スタティック)ルーティングという)

一般家庭のルータは自分の家のLANとプロバイダ(ISP)をつないでいるだけです。インターネットに行くには,どうやってもプロバイダに行かなくてはいけないので,とりあえずLANじゃなかったらプロバイダに行け! と設定するだけで済みます。このように他に行く宛がなかったらとりあえず行くことになっている経路をデフォルトルートといいます。

インターネットの根幹部分はもっとたくさんのルータがあるので,複雑で,どこかひとつのプロバイダをデフォルトルートと決めるわけにもいかないので,結局すべての経路情報を知っていなければなりません。これをすべて設定するのでしょうか。

経路情報を交換する——ルーティングプロトコル

インターネットは有機的に変化していますし,いちいち何か小さな変更するたびにインターネットに関わる全員と相談するわけにはいかないので,これを自動的に処理する仕組みが存在します。

経路情報を交換するプロトコルをルーティングプロトコルといいます。あまり日常では使わない言葉ですね。

実際,ルーティングプロトコルは一般家庭では普通使いませんからね。それは,「インターネットに行くにはプロバイダに行きなさい」というデフォルトルートを静的に設定すれば済むからです。

ルーティングプロトコルは,次のように使われます。基本的に,ルーティングプロトコルはルータが複数ある場合に役に立つものです。

+------+    +---------+    +------+    +---------+    +------+
| LAN1 +----+ Router1 +----+ LAN2 +----+ Router2 +----+ LAN3 |
+------+    +---------+    +------+    +---------+    +------+

それぞれのルータは,自分が直接つながっているLANのことは知っています。Router1はLAN1とLAN2を,Router2はLAN2とLAN3を知っています。

このままだと,LAN1からLAN3に行きたい場合,あるいはLAN3からLAN1に行きたい場合に先に進む経路をルータが知らないので行けません。実際には,このくらいの小さなネットワークなら静的に設定してもいいのですが,ここではルーティングプロトコルを使ってみます。

ルーティングプロトコルを動かすと,(実際には設定が必要なのですが)Router1はRouter2に「自分はLAN1とLAN2を知ってるよ」と言い,Router2はRouter1に「自分はLAN2とLAN3を知ってるよ」と言います。Router1はこれを聞き,LAN3に行くにはLAN2にいるRouter2に行けばいいのだと知り,経路に以下を追加します。

Router1の経路「LAN3に行くには,Router2に行きなさい」

Router2は,同様に,次のような経路を追加します。

Router2の経路「LAN1に行くには,Router1に行きなさい」

これで,Router1とRouter2が共にLAN1, LAN2, LAN3を知っている状態になったので,LAN1はRouter1に行けば,LAN3はRouter2に行けば,お互いとやりとりできます。

この場合の行き方が複数ある場合のどこを通るかの決め方など,実際に使うルーティングプロトコルによって差異がいろいろあるのですが,この場合はひと通りしか行き方はないので何を使っても同じことです。

ルーティングプロトコルには大きく分けて,管理している組織がひとつのネットワーク内で主に使われるもの (OSPF, EIGRP など) と,複数の組織をまたぐネットワークで使うことが多いもの (BGP) があります。次の節からはこれについて説明していきます。

インターネットはたくさんの組織をつなぐネットワーク

インターネットは,たくさんの組織のネットワークがつながっているという意味で特別なネットワークです。

ひとつの組織だけのネットワークなら,そこで勝手にいろいろ決めればよいので,運用もラクですが,インターネットはたくさんの組織がそれぞれ独自のポリシーを持ってネットワークを運用していてそれらをつなげないといけないので,ガバナンス的にも大変 (インターネットガバナンスで検索するといろいろでてきます) ですし, 実際の技術的な運用でもそれらを考慮する必要が出てきます。

そのような運用をすこしでも楽に可能にするために,経路情報を「組織」単位で管理するプロトコルができました。それが組織をまたぐインターネットで使われているルーティングプロトコルである BGP です。

このしくみにおいて,運営元とポリシーが同一のインターネット構成単位のことを自律システム (AS; Autonomous System) と呼び,このASが数万個あつまってインターネットができています。

AS には有限の範囲から固有の番号が振られていて,これをAS番号 (ASN) といいます。ASどうしは BGP を使ってお互いが持つ経路 (IPアドレスの集まりの形で表わされます) を広報しあいます。AS番号もIPアドレスも有限のインターネット資源で,番号資源と呼ばれます。この番号類はインターネットの番号の管理組織 (アジア太平洋の APNIC,その下にある日本の JPNIC など) が重複しないように割りあてています。

独立した組織であっても,このAS番号を持っているところは多くありません。なぜなら,どこかのプロバイダにインターネット接続を任せるなら,そのプロバイダのASの一部としてインターネットを使うことができるからです。(零細でない) プロバイダや,大きい会社のネットワークのように,独立して複数の接続先につなぎたい場合にこれらの番号の割り当てを受けて AS になります。また,プライベートに BGP を使うだけなら,割り当てを受けなくても,プライベートAS番号などを使って接続することができます。

AS には大きいところとそうでないところがあります。私が代表をやっている Menhera.org は超零細 AS です。一方で,他の組織に金を払ってインターネット接続を提供してもらわなくても自力でインターネット接続をできるくらい全世界のインターネットとつながっている超巨大 AS のことを Tier 1 ネットワークといいます。

インターネットの実際の動作

ここまでインターネットのおおまかな構造について話してきました。ここからは軽くインターネットの実際の動作について説明したいと思います。

IPとIPアドレス

前章で「経路」という言葉を使いましたが,経路はどのように表わされるのでしょうか。少しだけ「IPアドレス」という言葉が出てきましたが,実は,インターネットにおいて,データの差出人や宛先にはこのIPアドレスを使います。そして,経路はこのIPアドレスの集まりとそれらへの行き先の情報のことです。

IPアドレスは,IP (Internet Protocol) での住所として使われるものなので,このような名前がついています。

IPの説明

インターネットを通信可能にしている中心となるプロトコル (通信のやりかたを定めた手続き)。パケットと呼ばれる単位に分割されたデータをルータ同士でやり取りすることで,全世界のネットワークをひとつにつなぎ,インターネットを構成している。

IPには,主にそのIPアドレスの長さによって,IPv4とIPv6というふたつのバージョンがあります。

IPv4では約4億個のアドレスが利用可能なのですが,あまりにもみんながインターネットを使うようになってしまって,これでは足りなくなってしまったので,IPv6が次世代のインターネットのプロトコルとして注目されるようになりました。IPv6 では,2の128乗個というとんでもない数のアドレスが利用可能です。

IPv4 と IPv6 は基本的には互換性のない別なプロトコルです。IP はインターネットの根幹であり,すべてがこれに依存しているため,ただちにすべてを移行するということができなくて,IPv4 にしか対応していない Web サービスや,IPv4 でしか接続できないインターネット接続のようなものが,IPv6 の普及がかなり進んだ2023年現在でもたくさん残っています。将来的には IPv6 にすべてを対応させることを目指さないといけないのですが,現状としては両方を併用する形になっているわけです。

LANは,ふつうその中で使うIPアドレスの範囲をあらかじめ決めたうえで設定されています。それぞれのLANがIPアドレスの範囲を持っているわけです。そのLANにつながっている機器は,その範囲内のアドレスであれば,自分のLANにあるものとしてLAN内を (ARPやNDPというプロトコルを使って) 検索します。自分のLAN以外のアドレスへの通信は,あらかじめ設定されている通りにしかるべきルータにパケットを送ります。

IPアドレスの範囲のことをプレフィックスと呼び,インターネットにあるASはそれぞれ自分が持つプレフィックスを広告しています。

TCPやUDPとそのポート番号

実際には,IPを直接使って通信することはあまりありません。IPは機器(ホスト)単位でしか動きませんし,普通ひとつの機器にはたくさんのアプリケーションが動いているからです。

そこで,それぞれの機器のIPアドレスに1から65535のポート番号を割り振って使えるようにするプロトコルができました。これだけあれば通常は十分です。そのようなプロトコルには主によく使われるものとしてTCPとUDPがあります。どちらもポート番号を使い,そこをマンションのポスト(郵便受け)のように使って通信します。各建物(機器,ホスト)にポストがいっぱいあって,そのどこかをアプリケーションが使うイメージです。

TCP——信頼性のある連続した通信を行う

IPでは,バラバラのパケット単位でしか通信できませんし,ネットが混雑したらパケットは捨てられて宛先に届かないこともあります。TCPはポート番号を割り振る機能に加えて,実際にはIPのパケットで通信するのですが,それをあたかもちゃんと届く連続した通信であるかのように見せる仕組みがあります。

TCPは,最初に接続を確立するための通信 (3-way handshake) を行って,相手のポートと自分のポートの間に仮想的な接続をつくります。

また,パケットが届いたかどうかを相手に確認します。IPがパケットを捨てて届かなかったときには,もう一度送る仕組みが決められています。

UDP——最小限のコストで通信を行う

TCPは,安定した通信を実現する代わりに無駄も多く,リアルタイムの通信などには向いていません。そこで,IPの利点をなるべく活かし,最小限のムダで通信を行いつつ,ポート番号を利用するためのUDPがあります。UDPは,ポート番号はありますが,接続の確立などは行わないで,パケット単位でデータを送信します。信頼性もUDP自体にはなく,IP以下のレイヤがパケットを捨てたら,UDPは届きません。

TCPやUDPの上で動くプロトコル

TCPやUDPには,その上で動くプロトコルがたくさんあり,Webの閲覧 (HTTP) やメールの送信 (SMTP),音声通話 (SIP) など,目的別にいろいろなプロトコルが定められています。前章で紹介した BGP は TCP の ポート179番で動くプロトコルです。多くのプロトコルにはデフォルトで動くポート番号が決められていますが,これを変更することもできます。

Webを閲覧するのに使われる有名なHTTPはもともとはTCPのポート80番で動くプロトコルでしたが,通信の秘匿や改ざんの防止などの機能がなかったため,これを暗号化により仮想的に提供するTLSというプロトコルの上で使われるようになり,ポート443番でそれを行うこととしました。これがHTTPSです。TLS自体はTCPの上で動き,さらにその上でHTTPを動かしているわけです。

しかし,インターネットに流れるデータの量が増え,あらゆるものがHTTP(S)を使うようになった現代では,このように何重にもプロトコルを積み重ねるのが非効率な場面が出てきました。TCPは暗号化のことを考えていませんし,暗号化はHTTPのことを考えていませんからね。

そこで,効率の良いUDPの上で暗号化と(HTTPなどで使う)通信の多重化を同時に行うプロトコルとして,QUICが考えだされました。これは,通信が詰まりにくいなどのストレスの少ない通信ができるように工夫されています。QUICを使い,UDPのポート443番で行うHTTPをHTTP/3と言います。

DNSとドメイン名

さて,IPアドレスとポート番号,HTTPが揃ったので,HTTP通信をしてみましょう。IPアドレスを使うと,もちろん HTTP 通信はできます。この HTTP での URL (URI) も広義のアドレスの一種です。次のようになります。

https://1.1.1.1/

これは,暗号化されたHTTPSを使い,1.1.1.1 というIPv4アドレスを持つ Cloudflare 社のサーバに,ポート番号が書かれていないのでデフォルトのポート443番(TCP+TLSまたはUDP+QUIC)で通信するという意味です。

IPアドレスは,IPv4の場合たとえば「43.228.174.64」,IPv6の場合たとえば「2001:df3:14c0:4000::1」のような見た目をしています。

こんなアドレスを使って普段みなさんは HTTP を使って Web ブラウジングしていますか? していませんね。

Webサイトは通常,ドメイン名というもっと分かりやすい文字列を使ってアクセスします。Webサーバには通常,このドメイン名が設定されています。これを使うとURLは次のようになります。

https://ubiquity.menhera.org/

このように,通常のインターネットの利用ではIPアドレスを直接使う代わりにドメイン名を使うことが多いですが,実際にはIPアドレスが分からないとアクセスはできません。そこで,ドメイン名からIPアドレスを検索する仕組みが用意されています。これがDNS (Domain Name System) です。これもプロトコルとついていませんがプロトコルの一種です。このDNSを利用したHTTP(S)の動作はおおまかに次のようになります。

  1. WebブラウザにURL(アドレス)を入れる (検索した場合は,Webブラウザが検索エンジンのURLに自動的に変換してくれます)。
  2. WebブラウザやOSが,あらかじめ設定されているDNSサーバにこのアドレスに含まれるドメイン名に対応するIPアドレスが何であるか問い合わせる。
  3. IPアドレスを受け取ったWebブラウザは,このIPアドレスのポート443番宛てに,TCP(+TLS)またはUDP(+QUIC)接続を行う。
  4. 接続ができたら,WebブラウザはHTTP通信を行い,受けとったWebページを表示する。

ドメイン名も,また全世界で重複しないように割り当てられているインターネットの番号資源ですが,これはどのようなルールで割り当てているのでしょうか。

簡単に説明すると,原則としては「先に取った人勝ち」の仕組みで登録されています。なので,どうしても使いたい (Webサイトやメールアドレスに使いたい) ドメイン名があって今日利用可能であった場合は,あしたに誰かが取得する前にあなたが登録しましょう!

おまけ:インターネットの上で動く仮想的なネットワーク——VPNとオーバーレイネットワーク

インターネットはひとつの大きなネットワークですが,この上に別なネットワークを構築することができます。有名なのが会社とかで安全でプライベートな接続をしたいときなどに利用するVPNです。

VPNでは,高価な専用の光ケーブルなどを引くことなく,安いインターネット接続を使って仮想的なプライベートな接続を行うことができます。(参照: フレッツ光上にトンネル技術を使って構築する仮想ネットワークとその注意点 (フレッツ光の解説つき))

また,あるネットワーク上に何らかの機能を付加したネットワークを構築するものをオーバーレイネットワークといい(VPNとの境界はあいまいです),有名なものに匿名でインターネットを利用できる Tor などがあります。通常の消費者向けVPNでは,VPNの提供事業者を信用しないといけませんが,Torは玉ねぎ状に多重に暗号化して複数の国を経由させることで,どこかひとつの事業者に頼ることなく,匿名で安全な通信を実現しています。


いかがでしたでしょうか? (笑)

分からない点,修正したほうがいい点など見つけましたら,X (旧Twitter) @vericava まで聞いてください!

では良い休日を!