サーバの基本　サーバとIPアドレス

今までいまいちわかってなかった、知識について復習しようと思います。

# サーバーとは
サービスを提供するコンピュータのことやそのコンピュータにある様々な機能(処理)の事を指します。

基本機能は二つ

* データベースサーバー・・・様々なデータを管理・保存をする。
* WEBサーバー・・・パソコン同士の通信を行う。

わかりやすい例でいうなら。

1,学校のサーバーに宿題ファイルを送って提出。
　(データベースサーバーの役割)

2,計算サーバーに数値とやりたい数式データを送って、計算結果データを返してもらう。
 (WEBサーバーの役割)

## WEBサーバー
ここをもう少し詳しく書くと
WEBサーバーとは、スマートフォンやパソコンから送られきたリクエストに対して
リクエストに合ったレスポンスを返す仕組みを持ったコンピュータ（ハード）やソフトウェアのことを指します。

リンク先を押してそのページを返してもらうなど。

# IPアドレス
コンピュータやサーバーに設定された住所。

例
123.45.678.999

それぞれの数字は0-255までの値を取るので、全パターンは約42億通りになります。（256の4乗）

## 現状
IPv4と呼ばれるバージョンの仕様です。しかし将来的い足りなくなるので
IPv6という新しいバージョンへの移行が進んでいます。

## 問題点
IPアドレスを利用するためにはISPから毎回利用許可を貰わないといけません。
しかし手間がかかりすぎるので
グローバルIPアドレスとプライベートIPアドレスという仕組みが生まれました。

## グローバルIPアドレス　WAN（Wide Area Network）
インターネットに接続する際に利用されるIPアドレスです。
インターネットに接続している機器のそれぞれに割り振られる番号です。
この世に一つしかありません。
光回線の契約などで自動的にグローバルIPアドレスが1つ付与されます。

## プライベートIPアドレス　LAN(Local Area Network)
ISPから自動的に割り振られたグローバルIPアドレスをさらに小分けにしたIPアドレスです。

# ルーター
ルーターとは、インターネットと「家庭や会社にある複数のパソコン」間で通信を行うときに必要となる機器です。
グローバルIPアドレスが住所ならこちらはドアにあたります。

# ドメイン DNS（Domain Name System）
IPアドレスを文字列に変換したものです。
いちいちIPアドレスを覚えるのは大変なので
名前を割り振る機能です。

例
123.45.678.999

DNSによって

学校のIPアドレス

となります。

## ドメイン URLから見る場合
https://school-camp.in/

ドメインに当たるのはschool-camp.inです。
ドメインは、.（ドット）の前後で「school-camp」と「in」に分けられます。

### トップレベルドメイン
「in」をトップレベルドメインと呼びます。
トップレベルドメインは、他にも「.com」や「.jp」などがあります。
ドメインを取得するにはトップレベルドメインがなければいけません。

### セカンドレベルドメイン
「school-camp」をセカンドレベルドメインと呼びます。
セカンドレベルドメインに関しては早いもの順です。
同じセカンドレベルドメインが先に使われていた場合は、使うことができません。

# IPアドレスを調べる
dig というコマンドでIPアドレスを調べることができます。

## digコマンド

digコマンドは、ドメインを管理しているサーバー（DNSサーバー）に問い合わせをして
ドメインからIPアドレスを取得し表示するコマンドです。
digは、「domain information groper」の略です。

使用例はこちら

```bash:ターミナル
$ dig master.school-camp.in
```

## DNSサーバー
IPアドレスとドメインのそれぞれの組み合わせを管理・保存しているサーバーです。

基本的な場所は
ルーターの中に存在する可能性があり
IPアドレスを配布しているISP（インターネット・サービス・プロバイダ）内にもあります。

# ポート
ポートとは、1つのサーバと複数のサーバをつなぐものです。

それぞれのサーバが番号ごとに管理されていて
リクエストに応じてそれぞれの番号（つまりサーバ）へつなぐ橋渡しをする役割を持っています。

ポートが割り振る番号には、0から65535まで使うことができます。しかし
0から1023までの番号はよく使われるもので予約されていて自由に使うことはできません。

データベースサーバやメールサーバなど様々あり同時起動の必要があるので
1つのサーバで複数のサーバを起動するためにポートという仕組みがあります。

要はサーバの入り口番号で、同じポートは同時には複数使えないと認識すればいいです。

## ポートの必要性
一般的なサーバは1つのIPアドレスしか持っていないことがほとんどで
IPアドレスをWEBサーバで使ってしまうと、他のサーバとして動作することができません。
例えば、WEBサーバなら「80」、SSHなら「22」、メールサーバなら「3306」などはすでに決まっています。
既に利用されているポートは利用することができずにエラーになります。

## Ruby on Railsの例
Ruby on Railsでサーバーを起動するときは「3000」ポートを使うことが多いです。
既に3000ポートが使われている場合や複数のサーバを起動したい場合は

rails server -p 3001

のようにすることで別のポートでサーバを起動することができます。

このように、コンピュータが通信する場合はどのIPアドレスのどのポートに接続するか
IPアドレスとポートのセットで考えます。

# HTTP
WEBページやページ内で必要なCSS, JavaScript、画像などのファイルを
WEBサーバにリクエストするためのフォーマットのことです。

具体的には、「http://～」あるいは「https://～」で始まる
URL（Uniform Resource Locator）/URI（Uniform Resource Identifier）
という形式で送られます。

# コマンドでホストに接続

## telnetコマンド
離れたところにあるホスト（サーバやネットワーク機器）を手元の端末から遠隔操作するために
ネットワーク接続するコマンドです。

```bash:ターミナル
$telnet <IPアドレス> ポート番号
```

## 実際の作用手順

ここで

```bash:ターミナル
$ dig school-camp.in +noedns
```
上記のように打ち込み

```bash:ターミナル
;; ANSWER SECTION:
school-camp.in.       8   IN  A 3.111.222.33
school-camp.in.       8   IN  A 54.66.6.666
```

「ANSWER SECTION」だけに注目して

```bash:ターミナル
$telnet <IPアドレス> ポート番号
```

と打ち込みます。


telnetはインストールされてなかったらこちらを打ちます

```bash:ターミナル 
$ brew install telnet
```

## <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

telnetでこのような文面が出ますが
上の部分がhtmlの「レスポンスヘッド（headタグ）」の部分で
それ以降が「メッセージボディ（bodyタグ）」の部分に当たります。

# レスポンスヘッド

htmlで学習していただいた「headタグ」と同じです。
「メッセージボディ（bodyタグ）」で足りない情報をメタ情報として記述しています。
ここでいうメタ情報とは、「データに関する補足情報」と思ってください。

## HTTP/1.1 200 OK
これはレスポンスが成功した際に表示されるものです。

## Content-Type
HTMLファイルに使用している文字コードを示しておき、文字化けや誤動作を回避するために書いてあります。

## P3P
P3Pはサイト運営者が個人情報を保護しながら、
ユーザーが自分の情報をどの程度Webサイトに提供するかをコントロールできるようにする技術仕様です。

## 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:
こちらはキャッシュを残すためのものです。
キャッシュとは、使用頻度が高いデータを複製し記憶装置に蓄えられるものです。
キャッシュを利用することによってより早いページの更新を行うことができます。