ネットワークに関する世界観です。
インターネットとは、世界中のたくさんのマシンをネットワークで繋げる通信網(ネット)を作ろうというものです。
そもそも、コンピュータはIBMのメインフレームの時代は、ひとつのマシンで動くのが普通でした。
ですが、メインフレームは巨大かつ高価であり、また拡張性が悪かったです。
マシンをひとつのマシンだけではなく、二つ以上の複数のマシンで繋げることをネットワークと言います。ネットとは網、ワークとは仕事をするという意味です。ネットワークと呼ばれるのは、複数のマシンが単に1対1で繋がるだけではなく、網のように無数に繋がるからです。
ネットワークで繋がった、マシンひとつひとつの単位を「ホスト」と言います。
UNIXは昔から、ネットワークに強いOSであると言われます。その理由は、コマンド操作であるため、telnetなどを用いたリモート操作(遠隔地からリモートログインしてコマンドを実行する)を行いやすいことや、マルチタスクであるため、ひとつのサーバーに複数のクライアントが接続するサーバー・クライアントなどのシステムが構築しやすいからです。
また、このようなネットワークを用いて、クラスタと呼ばれるたくさんのマシンを繋げて、みんなで一緒に動くことでメインフレーム並みの仕事をさせようとするのを「クラスタシステム」と呼びます。
クラスタには、単に速度を増やす(HPC)だけではなく、ある一部に障害が発生しても別のマシンが代わりを務めたり(フェイルオーバ)、データが壊れても複製から復旧したり(冗長化)、あるいは負荷を分散させたり(ロードバランサ)などといった可用性クラスタも存在します。このようなクラスタは、メインフレームの技術よりも開かれた標準技術を使うため「オープン系」と呼ばれます。
大学などでは、今でも、UNIXワークステーションをネットワークに用いたり、Linuxを使ってクラスタシステムを構築したりしています。理由は、メインフレームが高いからです。メインフレームは、巨大かつ高価であり、以前から研究室で使われるのはより小規模なミニコンやUNIXワークステーションでした。UNIXはコマンド操作の古いOSですが、シミュレーションなどの大規模計算にはUNIXを用いたクラスタシステムを用いることがあります。理由は、安いからだけではなく、教育や研究をする上で、ソースコードが公開されているオープンソースなLinuxを用いることが理に適っていることも言えます。
さて、企業の内部であれば、このように、速度や可用性を高めるのが大きなクラスタの役割でした。
ですが、ネットワークは、社会網として、自分の企業や家庭だけではなく、ほかの企業や家庭と繋げて、見知らぬ他人とやり取りをしたり、サービスを提供あるいは利用したりするものとしても利用できます。
このために、全世界を繋げたネットワークのことを「インターネット」と呼びます。インターとは、外部へと越える(垣根を越える)という意味です。
インターネットにおいては、まず、パケット通信が基本となります。すなわち、ルーターによってネットワークとネットワークを繋げ、パケットと呼ばれるデータの一部を送信し、ルーターはそのパケットに付加された宛先を示すIPアドレスから、さまざまなルーターを介して目的地へと辿り着きます。どのルーターに送れば目的地に近づけるのかという情報を、ルーターが隣同士の経路表(ルーティングテーブル)を集約することで知っており(正確には芋づる式に全ルータの経路情報を代表ルータに送る)、もしそのIPアドレスが自分宛のものであれば取り込むという、バケツリレーのような方式で世界中のネットワークをパケットが旅します。
IPアドレスは機械にとっては分かりやすいですが、人間にとっては識別しにくいため、名前(ホスト名)がついています。この仕組みを名前解決、DNSと呼びます。名前解決のための情報はDNSサーバーに問い合わせれば取得できます。また、名前解決をするシステムをリゾルバ(解決するものという意味)と呼びます。
通信を行うためには、すべてのコンピュータで通信を行う決まり事が共通していなければなりません。この決まり事をプロトコルと呼びます。そして、OSI参照モデルでは、プロトコルは数階層に分かれており、下の階層のプロトコルを物理的に変更しなくても、上の階層だけを変更することができるようになっています。これにより、物理的な回線はそのままで、ネットワーク機器も変えずに、アプリケーションのレベルでだけ、さまざまなプロトコルを用いることが可能です。OSI参照モデルでは、上層でプロトコル固有のデータをヘッダとして付け足し、下層へとそれを順々に渡していって、送信し、受信した側はヘッダをひとつひとつ取り除いて解析し、上層へと渡していきます。
インターネットで使われるのは、主にTCPとUDPというプロトコルです。TCPには、再送制御など、多くの信頼性を高める機能があります。多くの通信では、誤った情報が送受信されないようになっている信頼性のあるTCPを使います。ですが、動画や音声などの送信では、多少のエラーや誤りがあっても、スピードと効率が求められます。そのため、一部の通信では、そのような機能のないUDPを用いることもあります。
インターネットでは、IPアドレスのほかに、ポート番号が重要となります。ポート番号は、クライアントとサーバーが通信する際に、クライアント側のアプリケーションとサーバー側のサービスを対応付ける番号となります。たとえば、HTTPであれば、WebブラウザとWebサーバは同じ80番ポートで通信します。HTTP以外にも、多くの通信アプリケーションが、独自のポート番号を定めています。
しかしながら、このようなネットワークは、外部からのリクエストに応じてプログラムが働くため、セキュリティが甘いと、相手に自分のマシンを遠隔操作されたり、場合によっては乗っ取られたり、ウイルスやスパイウェアといったマルウェアを実行させられることがあります。このため、不正な通信は排除しなければなりません。このために、不正なパケットをブロックするファイアーウォールを使います。たとえば、先の80番ポートは、通常はファイアーウォールによってブロックされています。サーバーを立ててサービスを提供したいホームページ管理者は、このようなファイアーウォールの設定を変更し、80番ポートを公開しなければなりません。ポートを公開することを「開ける」、ポートをブロックすることを「閉じる」と言います。ほとんどの場合、すべてのポートはファイアーウォールによって閉じられており、必要なポートだけをサーバー管理者が開けるように設定します。
また、ネットワーク機器には、送信元と受信先の宛先を表すIPアドレスのほかに、MACアドレスというネットワーク機器固有のアドレスがあります。IPアドレスは、ひとつの経路の通信において変わることがありませんが、MACアドレスは機器ごとに変わります。このような規格はイーサネットという規格によって決められており、イーサネットはもっとも普及しているLANの規格です。LANとはそれぞれのローカルなネットワーク、たとえば企業内や家庭内のネットワークを指す言葉であり、LANとLANをルーターが繋げます。ルーターは家庭内のブロードバンドルータだけではなく、自分が契約しているISPのルータや、インターネット上の経由地となるさまざまなルータが存在します。この回線網の中をパケットが一瞬で旅することで、インターネットは実現しています。
このようなネットワーク通信を行うために、UNIXなど多くのOSはソケット通信と呼ばれるインターフェースを提供しています。ソケット通信では、二つの端点(ソケット)が結合された時に有効になり、片方からデータを書き込むと、もう片方から読み込むことができます。ファイルの読み書きと同じAPIが使えるため、簡単です。しかしながら、通常はソケット通信のような低レベルのインターフェースを使うことは稀です。その理由は、インターネット通信を自分で行うのではなく、HTMLファイルを表示するWebブラウザと、HTMLファイルをインターネット上に公開するWebサーバーを用いて、その中でHTMLファイルを自動生成するCGIやPHPなどの技術を用いて、バックエンドとなるデータベースサーバーにデータを記録することでソフトウェアを構築することが現在一般的だからです。ただし、ソケット通信が不要なわけではなく、WebブラウザとWebサーバーの内部でソケット通信が用いられています。
クラスタも参照のこと。
このようなインターネットの基本的な通信技術は、あくまで「通信」を実現する技術であり、その中で「コンテンツを配信する」ということまでは考えられていません。それはアプリケーションソフトウェアが行います。そうしたアプリケーションの例として言えるのは、WebブラウザとWebサーバーを用いたHTTP、ファイルを転送するFTP、メールの送信と受信、あるいはファイルサーバーのNFSなどが言えます。
特に、最近はWebサービスを構築して、自らの制作したコンテンツを読者に読まれるように公開したり、あるいはサービスの利用料を取ったりサービスで行われる売買の手数料を取ることや広告を載せることでお金を稼いだりなどといった活用事例があります。
このようなシステムでは、Webブラウザをクライアントとし、サーバーはフロントエンドとバックエンドで構築し、Webサーバー、APサーバー、DBサーバーとします。これを三階層型システムと呼びます。
頻繁に更新されないコンテンツであれば、Webサーバーだけで構築することが可能ですが、たくさんのデータを不特定多数がやり取りしてみんなで投稿・編集・管理するWebサービスではWebコンテンツを動的に生成するためのAPサーバーと、データベースとしてデータを保管するためのDBサーバーが必要となります。APサーバーはJavaやPHPやRuby、DBサーバーはMySQLやOracleなどの技術を使うことが一般的です。
また、最近はMVCフレームワークを用いたWebフレームワークを用いることで、生産的に(すなわち簡単に)Webサービスを開発するためのエンジン(土台)となるフレームワークを使って開発することが増えています。MVCとはモデル・ビュー・コントローラのことで、Ruby on RailsというWebフレームワークがこのモデルを採用しました。同じ技術にPythonによるDjangoやPHPによるLaravelなどがります。Ruby on Railsはバックエンドと呼ばれることもありますが、その理由はサーバー・クライアントで言えば、サーバー側で処理を行うからです。
クライアント側はHTML/CSSのほか、JavaScriptを使うことで、Webサーバー側ではなくWebクライアント側の処理を行うこともできます。このWebクライアント側の処理のことをフロントエンドと言います。基本的に、バックエンドはデータベースとのやり取り(モデル)とアプリケーションのロジックの処理(コントローラ)、フロントエンドはWebブラウザに表示される操作画面のデザイン(ビュー)を担当します。
Ruby on Railsなどでは、MVCの中のビューもバックエンドで行っていましたが、最近ではビューの処理はJavaScriptでも行えるということが分かってきました。そのため、クライアント側でビューを担当するJavaScriptフレームワークと呼ばれるものがあり、Vue.jsやReactなどがこれに当たります。また、サーバー側でもJavaScriptを使うNode.jsを使えば、フロントエンドもバックエンドもどちらも同一言語のJavaScriptで記述することができます。
Webサービスを開発する際、クライアント側は単にサーバーにアップロードするだけで構わないので、HTML/CSS/JavaScriptファイルを公開できるだけでいいのですが、バックエンドはデータベースサーバーが必要となり、またWebプログラミングを行うためにApacheなどにCGIやモジュールを追加しなければならないので、より多くのお金(レンタルサーバー代)がかかります。また、きちんとした運用を行うためには、常にサービスの動向をチェックし、犯罪予告などの非合法的な内容が匿名で投稿されないかなどをチェックしなければなりません。Webの開発は、このレンタルサーバー代と運営コストが初心者が学習する壁となりますが、VPSやクラウドサーバーを使えば小規模なサービスから少しずつ大規模なサービスへとスケールアップしていくことが可能です。
Webの世界やWebサーバやWebフレームワークも参照のこと
ネットワーク通信においては、すべてのネットワークに参加するパソコン(ホストと呼ばれる)に、ネットワークインターフェース(NIC)が存在します。
NICは、たとえばゲームボーイにおけるポケモンを交換する通信ケーブルのようなもので、すべてのNICにIPアドレスが割り振られ、NICを通じてネットワーク通信をすることができます。
NICによって、ホストをネットワーク(LAN)に繋ぐことができます。そして、ルータという機器がネットワーク(LAN)とネットワーク(インターネット)を繋ぐゲートウェイとなり、広大なインターネットの海をルータが道標となって、さまざまな経路(ルーティング)で経由して、目的のIPアドレスを持ったNICにデータが転送されます。
インターネットにおいては、「あなたはこの番号」といったように、番号でそれぞれのNICの住所(データの宛先)が決まっています。これをIPアドレスと言います。IPアドレスは、LANの中であれば、それぞれに静的に割り振ることもできますし、DHCPを使って自動的に割り振ることもできます。このIPアドレスを基に、世界中のすべてのホストを特定し、目的の場所(サーバあるいはクライアント)へとデータを転送します。
NICには名前(インターフェース名)があり、たとえばLinuxではeth0などとなることが多い。このインターフェース名ごとに、静的あるいは動的にIPアドレスを設定する。この名前はシンボルとしては存在するが、キャラクタ型デバイスドライバやブロック型デバイスドライバと違い、ネットワークインターフェースのデバイスドライバはデバイスファイルを持たない。なので、/dev/eth0のようなスペシャルファイルは存在しない。eth0などの設定は主にテキストの設定ファイルで行うが、GUIでも設定できる。
Linux ネットワークやLinuxカーネル(デバイス)も参照のこと。
インターネットの歴史として言えるのは、インターネットは軍事技術から生まれたということです。
冷戦時代、アメリカとソ連はたくさんの分野で、科学技術の競争をしていました。
原爆や水爆など、核兵器を作る技術では、アメリカはいつもソ連の前を行っていました。
ですが、人工衛星について言えば、ソ連はアメリカよりも早い段階で、世界初の人工衛星「スプートニク」を打ち上げます。
これに、アメリカは危機感を抱きます。アメリカには、まだ人工衛星の打ち上げ技術がなく、人工衛星から核ミサイルを使って、アメリカの大切なコンピュータを破壊されてしまえば、一瞬でアメリカは終わりだったからです。
なので、アメリカは、コンピュータが破壊されても構わないように、ひとつのコンピュータの情報をネットワークでほかのコンピュータに伝達し、予備を保管して維持することを考えました。
ネットワークの形態として、次の3つのモデルが考えられます。
ひとつのコンピュータにほかのすべてのコンピュータが繋がる「スター型」のネットワークでは、ひとつの中央コンピュータが破壊されて終わりになってしまいます。
これに対して、すべてのコンピュータにすべてのコンピュータが結合される「強い結合」のネットワークでは、回線を接続する無駄が多くなってしまいます。
なので、それぞれのコンピュータがさまざまな経路で緩やかに繋がるような、「弱い結合」のネットワークが考えられました。
そしてこれを基に、1969年に、軍や大学や政府組織などの一部の機関や組織を繋ぐARPANETが誕生します。
このARPANETが1983年にNSFの管轄となってNSFnetという名前になり、ソ連が崩壊した1991年にNSFnetが一般市民に開放されてインターネットになったのです。
詳しくは、TRON開発者の坂村健さんによる「痛快! コンピュータ学」に書かれています。参考になさってください。
2023.02.06
僕は、ネットワークには本当に広大な可能性があると思います。
ネットワークは、機械と機械を人間の手を使わず、インターネットのように世界中で繋げる、という「大きな野心」があります。
世界中でインターネットが繋がるということは、システム開発の意味においても、本当にたくさんの広大な可能性があります。
たとえば、自動車などの交通機関をネットワークで繋げたり、運輸のような輸送機関をネットワークで繋げることで、世界中の機械から送受信される情報をコントロールし、「世界そのものを支配する」ということができるようになります。
ネットワークには、本当に広大な可能性があるということが、この例だけを見てもよく分かります。
可能性が大きなものは、その分だけリスクや危険性も多くあります。インターネットはWebやSNSだけではありません。これから、インターネットによる「世界そのものの在り方や形態の変貌」が、この世界で見られていくでしょう。
2023.08.23
ネットワークでさまざまなことができるとは言いますが、基本はメッセージの送り合いと、ファイルの転送(ダウンロード・アップロード)です。
これは、遠く離れた人でも仕事やコミュニケーションができる、というネットワークの特性に合致しています。
他には、システムとして、UNIXでできる仕事、たとえばPerl/CGIによるゲームなど、をサーバー側で計算し、ネットワークの不特定多数の人々にサービスを提供することができます。
未来を考えると、運輸・配達会社がやっているように、ネットワークですぐに今の配達状況を確認したり、あるいはメールで質問を問い合わせる、といったことができます。
また、商用システムを含めると、工場を無人化したり、工場のライン処理を担当することもできます。
要するに、ネットワークを使ってできることはそれくらいです。大したことはありません。
また、僕が考えるに、ネットワークは新しい交通網だと思います。
船が鉄道になり自動車になったのと同じように、ネットワークは新しいトラフィックシステムになろうとしているのです。
日々、多くの通信とパケットが、ネットワーク通信網をかけめぐっています。そこではさまざまなやり取りがされています。
今のところ、その多くはコミュニケーションや通信としての利用と、ファイルや情報の転送としての利用ですが、「もっと巨大な利用手段の可能性」が、必ずどこかにあると思います。
ネットワークで全てが繋がった今のICT社会で、何ができるのか、みなさんも考えてください。そこから、世界を変える新しいアイディアがきっと生まれると思います。
空いている通信回線にIPアドレスを付加してパケットを送信し、パケットが自分宛のものであれば受信する。
どの経路にパケットを送り出せば目的の場所にたどり着けるか(近づけるか)はルータが知っている。
ネットワークにつながった各ルータは代表ルータにルータが隣接するネットワークの接続状況を集め、代表ルータはルーティングテーブル(経路表)を集約し、全てのルータに経路表を伝達する。
このように、ルータは芋づる式にルーティングテーブルを集約する。
ルーティングテーブルはrouteコマンドで確認できる。
IPアドレスの示すネットワークが外部である場合は、ISPへと送られる。ISPは自分の会社の傘下にあるネットワークの経路表を知っている。自分の会社外のIPアドレスであった場合は、上部のISPへと送られる。インターネットエクスチェンジなどを使うこともある。この時お金を払う必要があった場合は、ISPがお金を払って通信回線を利用させてもらう。
「データを送ります、よろしいでしょうか」「よろしいですよ」「では送ります」といった手順や通信を行う際の決まりが決まっている。
プロトコルは階層に分かれていて、上部の階層から下部に下がっていき、その後に下部の階層から上部へと上がっていく。
コネクション管理や再送制御など多くの機能がある。
機能がなく、動画や音声など多少正しく転送できなくても構わない用途に使う。
下の階層に降りる時にヘッダを付加する。
もとの階層まで上がった時にヘッダを取得し、たとえばHTTP固有のヘッダを理解する。
接続を受け取るアプリケーションの種類(HTTPサーバなど)の識別に使う。
パケットに付加される送信先と送信元のアドレス。
エンドツーエンドで変わることがない。
それぞれのネットワーク機器の識別番号。
それぞれの機器によって変わる。
IPアドレスとMACアドレスの対応表をARPテーブルと言う。
ARPテーブルはarpコマンドで確認できる。
Linuxカーネル(ソケット)やLinuxネットワークを参照のこと。
P2Pを参照のこと。
セキュリティを参照のこと。
以下のリンク先で、詳しい図とともに、LANとインターネットのネットワーク技術を解説されています。
ネットワークを構築するための入門サイト。
ネットワークは色んなサイトで解説されていますが、僕は何も分からずWindowsに頼り切っているだけです。
書籍