IPアドレス
サーバーとは
サーバーとは、サービスを提供するコンピュータのことやそのコンピュータにある様々な機能(処理)の事を指す。
もっと簡単に言うと、ある特化した機能を使うためだけのパソコン、または何かに特化した機能自体の事だと認識できる。
サーバーが必要な理由
前提として、自身のパソコンだけでもサーバーが行うことを全て行うことが可能である。
それを踏まえた上で、サーバーが必要である理由が以下の3点となる。
- サーバーをバックアップとしてデータを保存しておけば、自身のパソコンが壊れた際にデータを復旧することができる。
- 外部のクライアントと接続する機能をサーバーに任せることによって、自身のパソコンの負担を減らすことができる。
- 上述の接続機能の例のように、サーバーと自身のパソコンで役割分担をすることによって、自身のパソコンでアプリケーションの開発に集中することができる。
サーバーの役割
サーバーの役割は様々ですが、主に以下のような役割がある。
- 様々なデータを管理・保存をする(データベースサーバー)
- パソコン同士の通信を行う(WEBサーバー)
様々なデータを管理・保存する役割はデータベースサーバーが担う。Webアプリケーションとは違うサーバーでデータベースの管理を行うことによってサーバーへの負担を減らす。
パソコン同士の通信を行う役割はWEBサーバーが担う。
WEBサーバー
WEBサーバーとは、スマートフォンやパソコンから送られきたリクエストに対して、リクエストに合ったレスポンスを返す仕組みを持ったコンピュータ(ハード)やソフトウェアのことを指す。
例えば、利用者(クライアント)がブラウザ上の「投稿するためのリンク」をクリックし、その情報をWEBサーバーに送ったとする。
そして「投稿するためのリンクをクリックした」という情報をWEBサーバーで「投稿するための画面に遷移する」という情報に置き換えてブラウザに送り返す(レスポンス)。
このように WEBサーバーは、利用者の送ったリクエストに対して、情報を処理し、レスポンスをする役割を持つ。
IPアドレス
IPアドレスとは、コンピュータやサーバーに設定された住所のようなもの。コンピュータが他のコンピュータやサーバーにファイルやメールを送受信するときに宛先として利用する。
IPアドレス例
具体的にどのようにコンピュータに住所を設定するのか、例を見ながら確認。
IPアドレスは「183.79.139.228」のように表現される。この数字の集まりが住所になる。それぞれの数字は0-255までの値を取るので、全パターンは約42億通りになる。(256の4乗)
IPアドレスの現状
現在このIPアドレスはIPv4
と呼ばれるバージョンの仕様である。しかし、近い将来IPアドレスが足りなくなると言われている。
現在世界の人口が70億人を超えているため、1人1つのIPアドレスを取得しようとするとIPアドレスが不足するためである。
対策として、IPv6
という新しいバージョンへの移行が進んでいる。IPv6では、IPアドレスを16進法で表し、例えば「2001.0db8.1234.5678.90ab.cdef.0000.0000」となる。こちらは3.4×10の38乗であるのでほぼ無限に使える。しかし、IPv6が世界全体で対応するためにはあと何年もかかるようである。
IPアドレス(IPv4)の問題点
IPアドレスの個数は限られており、利用者が好き勝手に利用することはできない。そのため一般家庭で「△△光回線」などのインターネット契約をするとISP(インターネット・サービス・プロバイダ)から自動的にIPアドレスが付与される。これは接続していないと自動的に変化していき、限りあるIPアドレスを回線利用者で使いまわしている状態になる。IPアドレスを利用するためにはISPから毎回利用許可を貰わないといけない。これでは企業や学校での利用などコンピュータの個数が変動する場合に手間がかかる。
このようなことを解決するために、グローバルIPアドレスとプライベートIPアドレスという仕組みが生まれた。
グローバルIPアドレスとプライベートIPアドレス
数が限られ制限が多いIPアドレスだが、グローバルIPアドレスとプライベートIPアドレスによってその問題を解消した。グローバルIPアドレスとプライベートIPアドレスとは何か。
グローバルIPアドレスとは
グローバルIPアドレスとは、インターネットに接続する際に利用されるIPアドレス。インターネットに接続している機器のそれぞれに割り振られる番号(現在は上記したように「183.79.139.228」のような3桁の数字×4)になる。
家の住所や電話番号のようなイメージである。例えば「東京都渋谷区○○町××~×,△△マンション」はこの世に一つしかないようにグローバルIPアドレスもこの世に一つしかない。
グローバルIPアドレスは、「△△光回線」などのインターネット契約をするとISP(インターネット・サービス・プロバイダ)から自動的にグローバルIPアドレスが1つ付与される。また、グローバルIPアドレスのことをWAN(Wide Area Network)とも呼ぶ。
プライベートIPアドレスとは
プライベートIPアドレスとは、ISPから自動的に割り振られたグローバルIPアドレスをさらに小分けにしたIPアドレス。グローバルIPアドレスの「東京都渋谷区○○町××~×,△△マンション@@号室」の住所例で言うと「@@号室」がプライベートIPアドレス。プライベートIPアドレスはLAN(Local Area Network)とも呼ぶ。
気をつけてたいのが「東京都渋谷区○○町××~×,△△マンション」までで既に「183.79.139.228」を使用しているので「@@号室」に対しても新しく「数字.数字.数字.数字」の組み合わせが必要ということ。
プライベートIPアドレスは、以下のような3つに分けられる。
- クラスA:10.0.0.0~10.255.255.255
- クラスB:172.16.0.0~172.31.255.255
- クラスC:192.168.0.0~192.168.255.255
クラスAは大規模ネットワーク、クラスBは中規模ネットワーク、クラスCは小規模ネットワークで使うプライベートIPアドレス。ルーターはクラスCを使うため「192.168.0.0~192.168.255.255」の65536通りある。ルーターとプライベートIPアドレスとグローバルIPアドレスを併用すると65536×42億個のプライベートIPアドレスが存在できるということになる。
ルーターとは
ルーターとは、インターネットと「家庭や会社にある複数のパソコン」間で通信を行うときに必要となる機器。グローバルIPアドレスの「東京都渋谷区○○町××~×,△△マンション」の住所例で言うと、ルーターは個人の部屋に入るためのドア(入り口)のイメージである。マンションの中に入ると住民それぞれの部屋があるように、グローバルIPアドレスからルーターを通すと、グローバルIPアドレスではなくプライベートIPアドレスの領域になる。ルーターは、グローバルIPアドレスからプライベートIPアドレスへスイッチする役割を持っている。ルーターは、グローバルIPアドレスと後述するプライベートIPアドレスの両方を持っている。
グローバルIPアドレスとプライベートIPアドレス、ルータとの関係図
次には以下の図でグローバルIPアドレスとプライベートIPアドレス、ルーターを確認する。
プライベートIPアドレスについて補足
「192.168,x,y」となっているが、「x」はルーターのメーカーを表し、「y」はそれぞれのパソコンによって違う。そのため一つのルーターが割り振れる番号は256通り(「y」の分だけ)である。また、ルーターはパソコンの再起動や回線が切れるごとに「y」を切り替える機能もある。
ルータがyを切り替えることにより、ルーターが割り振る番号の消費を抑えている。
例えば、教室にいない人のパソコンに対して固定のプライベートIPアドレスを設定してしまうと256人しかwi-fiを繋ぐことができない。そのため、ルーターが必要に応じてプライベートIPアドレスの数を減らしたり増やしたりする。
ドメインとDNS
グローバルIPアドレスとプライベートIPアドレスの使い分けによってIPアドレスの利用可能数は節約できたが、まだ問題がある。
例えば、「52.196.209.128」といわれてもそれがその該当サイトであるとは分からない。
そのためにドメインとDNSが誕生した。
ドメインとは
ドメインとは、IPアドレスを文字列に変換したもの。
あるページのIPアドレスは、IPアドレスで検索することで該当ページを表示することができるが、そのページを見ようとする度にIPアドレスを覚えておくのは大変である。そこで、数字よりも覚えやすい文字列をIPアドレスに割り当てることにしたのがドメインの誕生である。
またこのように「IPアドレスを文字列化する仕組み」のことをDNS(Domain Name System)と呼ぶ。
IPアドレスに比べドメインは無尽蔵に組み合わせられるので、IPアドレスを取得するよりも簡単で個人でも購入することができる。
URLから見るドメイン
例えば、 https://aaa-bbb.in/の内、ドメインに当たるのはaaa-bbb.inである。ドメインは、.(ドット)
の前後で「aaa-bbb」と「in」に分けられる。
「in」をトップレベルドメインと呼ぶ。トップレベルドメインは、他にも「.com」や「.jp」などがある。ドメインを取得するにはトップレベルドメインがなければいけない。
「aaa-bbb」をセカンドレベルドメインと呼ぶ。セカンドレベルドメインに関しては早いもの勝ちである。同じセカンドレベルドメインが先に使われていた場合は、使うことができない。
IPアドレスを調べる
実際にドメインに紐付いたIPアドレスを確認してみる。ドメインからIPアドレスを調べるには dig
というコマンドを使う。
digコマンド
digコマンドは、ドメインを管理しているサーバー(DNSサーバー)に問い合わせをしてドメインからIPアドレスを取得し表示するコマンド。digは、「domain information groper」の略。
DNSサーバーとは
IPアドレスとドメインのそれぞれの組み合わせを管理・保存しているサーバー。
DNSサーバーの場所
DNSサーバーは様々な場所に存在する。身近なところでいうとルーターの中に存在する可能性がある(機種によってない場合もある)。
またはIPアドレスを配布しているISP(インターネット・サービス・プロバイダ)内にもある。
digコマンドを使ってIPアドレスを調べる
digコマンドを使ってIPアドレスを調べる。
digコマンドは以下のように、digコマンドの後ろにIPアドレスを調べたいドメインを続けて実行する。
1 |
$ dig master.tech-camp.in
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ dig master.tech-camp.in
; <<>> DiG 9.8.3-P1 <<>> master.tech-camp.in
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64426
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;master.tech-camp.in. IN A
;; ANSWER SECTION:
master.tech-camp.in. 3265 IN A 52.196.209.128
;; Query time: 66 msec
;; SERVER: 192.168.179.1#53(192.168.179.1)
;; WHEN: Tue Oct 4 23:49:29 2016
;; MSG SIZE rcvd: 53
|
このような実行結果が返ってくる。IPアドレスは、ANSWER SECTION
という部分に記載されている。
IPアドレスは、52.196.209.128
ということがわかる。
サーバメンテナンスの影響などにより、必ずしも上記のIPアドレスでない可能性もある
ネットワーク環境によっては、上記コマンドではエラーとなる場合があります。エラー表示にしたがってオプションを付加して実行する。(+noedns
のオプションで解決することがある)
ポートについて
ポートとは
ポートとは、1つのサーバと複数のサーバをつなぐもの。
それぞれのサーバが番号ごとに管理されていて、リクエストに応じてそれぞれの番号(つまりサーバ)へつなぐ橋渡しをする役割を持っている。ポートが割り振る番号には、0から65535まで使うことができる。しかし、0から1023までの番号はよく使われるもので予約されていて自由に使うことはできない。
WEBサーバはリクエストを受け付けたり、データを送信したりするのが主な仕事だが、これ以外にもデータベースサーバや、SSHコマンド受け付けるためのSSHサーバ、メールを送受信するためのメールサーバなどいろいろなサーバがある。
そこで1つのサーバで複数のサーバを起動するためにポートという仕組みがある。
なぜポートが必要なのか
一般的なサーバは1つのIPアドレスしか持っていないことがほとんどで、このIPアドレスをWEBサーバで使ってしまうと、他のサーバとして動作することができない。
例えば、WEBサーバなら「80」、SSHなら「22」、メールサーバなら「3306」などはすでに決まっている。既に利用されているポートは利用することができずにエラーになる。
Ruby on Railsでサーバーを起動するときは「3000」ポートを使うことが多い。既に3000ポートが使われている場合や複数のサーバを起動したい場合は、rails server -p 3001
のようにすることで別のポートでサーバを起動することができる。
このように、コンピュータが通信する場合はどのIPアドレスのどのポートに接続するか、というようにIPアドレスとポートのセットで考える。
WEBサーバの動作をポートを使っておさらいする
ポートを踏まえて、WEBサーバの動作について。
WEBサーバでは一般的には以下の様な動作を1秒間に数千回行なっている。
1.「80ポート」でHTTPリクエストを受け付ける
2. リクエストに応じた処理や、要求されたファイルを探す
3. リクエストしてきたコンピュータに返送する
ここでいう「HTTP」はWEBサーバに情報を送るための通信規約、つまり約束事。
HTTPとは
HTTPとはWEBページやページ内で必要なCSS, JavaScript、画像などのファイルをWEBサーバにリクエストするためのフォーマット
のこと。
具体的には、「http://~」あるいは「https://~」で始まるURL(Uniform Resource Locator)/URI(Uniform Resource Identifier)という形式で送られる。
ブラウザにURLを入れたり、リンクをクリックしているときに、自動的にブラウザがHTTPのフォーマットに従ったリクエストを作成して、サーバにリクエストしている。
コマンドでホストに接続する
ターミナルから「ホームページ」に接続することを例としてブラウザが裏で処理しているか、コマンドを使って手動実行してみる。ホストに接続するには、telnetコマンド
を使用する。
telnetコマンド
telnetコマンドは、離れたところにあるホスト(サーバやネットワーク機器)を手元の端末から遠隔操作するために、ネットワーク接続するコマンド。
手順
1 |
$ dig tech-camp.in +noedns
|
とターミナルから打つと以下のようにIPアドレスが表示がされる。
1 2 |
;; ANSWER SECTION:
tech-camp.in. 11 IN A 13.230.191.243
|
たくさん情報が出てくるが、「ANSWER SECTION」だけに注目。
次にtelnetを使うのだが、ブラウザで Webページを開く際、ブラウザはサーバに下記のような要求メッセージを送信する。
以下の文章はターミナルに打たない。
ブラウザで Webページを開くための「80」は、ポート番号である。
telnetを使ってアクセスする
1 2 |
MacOSのバージョンによってはtelnetがインストールされていない。その場合は先にインストールを行う。
telnetを実行すると
1 2 3 |
Trying 13.230.191.243...
Connected to ec2-13-230-191-243.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'
|
上記のような結果が返ってくる。トップページが取得できた。
最後に以下のようにGET / HTTP/1.0
を追記し`ENTERを2回押す。
1 2 3 4 |
Trying 13.230.191.243...
Connected to ec2-13-230-191-243.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
GET / HTTP/1.0
|
実行すると、ターミナルにトップページのHTMLが返ってくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
HTTP/1.1 200 OK
Date: Wed, 08 Jan 2020 02:27:38 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 29951
Connection: close
Server: nginx/1.10.1
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
ETag: W/"faa286c66f8e354025a495a0fe7282a7"
Cache-Control: max-age=0, private, must-revalidate
Set-Cookie: _tech-camp%E3%80%80-d_session=S3FUMkREYkFLcXB4OTBOb01NS1pPa2pEb3duWVlUM2tCZ0U3Sys5QU45UXdTQXVnL2lhcmFCdHdSSGw3TkFxVTJRWXJZV0FpK2xTdHZlditwNHhhUk01SU12YzZwWk9Md1lqbU9YeDRKM1NvY09mSUlJVGRia3dEc0NVVjE2elVaVUxTRDdranU5MzZSdjNnY3NLUkVRPT0tLWJSS2V3empPMFowVUM0NzRNNUtiQlE9PQ%3D%3D--573b3947da1245e8d5bdba7702e497fc081fa692; path=/; HttpOnly
X-Request-Id: 58c478f2-48f5-4ab3-8443-5d4d44c8a2fa
X-Runtime: 0.012434
Vary: Origin
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
<!DOCTYPE html>
・
・
中略
・
・
|
19行目の<!DOCTYPE html>
より上の部分がhtmlの「レスポンスヘッド(headタグ)」の部分でそれ以降が「メッセージボディ(bodyタグ)」の部分に当たる。
中略の部分は「bodyタグ」になっているので、試して確認する。
今回は最後に「レスポンスヘッド(headタグ)」について確認する。
レスポンスヘッドとは
レスポンスヘッドとはhtmlにおける「headタグ」と同じ。「メッセージボディ(bodyタグ)」で足りない情報をメタ情報として記述している。
ここでいうメタ情報とは、「データに関する補足情報」と言える。
上から順に詳しく見てみる。
HTTP/1.1 200 OK
レスポンスが成功した際に表示されるもの。
Content-Type
HTMLファイルに使用している文字コードを示しておき、文字化けや誤動作を回避するために書いてある。
P3P
P3Pはサイト運営者が個人情報を保護しながら、ユーザーが自分の情報をどの程度Webサイトに提供するかをコントロールできるようにする技術仕様。
例えば、cookie(WEBサーバーがユーザーを認識する仕組み)を使うとユーザーのアクセス情報を収集することができる。(それを通じて無駄なく広告を打つことが可能。)
しかし、プライバシーの観点からそれを保護する動きが高まった。
それをP3Pを導入することによってユーザーの必要ない情報を受け取れないようにしている。
X-Content-Type-Options: nosniff,X-XSS-Protection: 1; mode=block,X-Frame-Options: SAMEORIGIN,X-XRDS-Location: ,
XXS(クロスサイトスクリプティング)等によってcookieなどが盗まれることを防ぐためのもの。
Vary: Accept-Encoding,Expires: -1,Pragma: no-cache,Cache-Control:
キャッシュを残すためのもの。
キャッシュとは、使用頻度が高いデータを複製し記憶装置に蓄えられるもの。キャッシュを利用することによってより早いページの更新を行うことができる。
詳しくは