ネットワークについての忘却録

##はじめに
この記事ではネットワークについて学んだ内容についてのアウトプットとしてお話ししていきたいと思います


##サーバって何？
サーバーとは様々な用途に合わせた処理を行うプログラムやコンピューターのことを指します。
例えば
IPアドレス⇄ドメイン名の変換を行うDNSサーバー
ファイル(データや情報、コマンドを実行するための情報など)の管理を行うファイルサーバー
IPアドレスの情報をもとにwebのデータをブラウザに反映させるWEBサーバー
メールの送受信を行うメールサーバーなど
様々な用途に合わせたサーバーが存在している

ちなみに今掲げた例は用途に応じてさまざまな機能の提供をしたいるソフトウエアとしてのサーバーです。

##localhost
コンピューターにおけるlocalhostでは現在使用しているシステムや自分のパソコンを指す。
それに対し、通信相手のことをリモートホストという。
つまりこれは自分視点か相手視点か、視点を変えることでリモートかローカルかは変わってくる。

例えばLinuxでログインする際

```
lobalhost login:
```

やプロンプト(今コマンド待ち構えてるからコマンド打ってーってやつ)の表示で

```
hoge@localhost:
```

などと表示されているとわかる通り、これは今使ってるあなた自身のパソコンですよ！
とまさに示しているのである。

###TCP/IPにおけるlocalhost
TCP/IPにおけるlocalhostは
ネットワークで提供するサーバー機能とかに自分でアクセスする際に使われる
→TCP/IPが必要に応じて自身と通信するためのループバックデバイスとして
localhostが使用される！

####ループバックとは
ある機能から送信されたデータや信号をオウム返しに送信しなおす機能や仕組みのこと。
意図的な処理や変更なしに送信元に戻って来る。
→例えばRubyのコードを記載している際、自分の入力したコードがしっかり反映されているのかをブラウザに反映させたいときにlocalhostを入力してループバックする
→ちゃんと接続できるのかを確認することができる

####IPの場合
localhostはループバックデバイスとして
IPv4では127,0,0,1に、IPv6では::1 に割り当てられている。

###IPv4アドレスとは
IPv4アドレス:IPアドレスを32ビットのデータとして表現
約42億(２の３２乗)のCPがインターネットに接続可

####local hostとループバックアドレス
IPv4アドレスでは127,0,0,1がループバックアドレスとして割り当てられている。
正確には127.0.0.0 ~127.0.0.255の範囲をlocalhostを含むループバック用として使用されている
→ここにアクセスするとループバックして自身にアクセスすることができる

IPv6アドレス:IPアドレスを128ビットのデータとして表現
3.4×10の38乗のCPgaインターネットに接続することができる

またIPv6アドレスでは::1がループバックアドレスとして割り当てられている
IPv6の場合::1の１つしかアドレスが存在しないところに注意が必要である。



##IPとIPアドレスとは
IP:インターネットプロトコルの略
ネットに接続されたCP同士がデータのやりとりをするためのデータの通信方法を定めた規則

IPアドレス
コンピューターが情報を識別するために利用する番号のこと
コンピューターはこの番号を見てこれはgoogleのサイトだ！と判断している

##hostsファイルとhost名
ホスト名がこれならIPアドレスはこれ！と言った感じでホスト名とIPアドレスの対応付けを書いておくためのファイル。ファイル名がhostsという名前なのでこのように呼ばれている。

###ホスト名
ネットワークに接続された**コンピューターやサーバーなどの機器**を人間が識別、指定しやすいようにつけられる文字列のこと。
一般的には英数字といくつかの記号を組み合わせて使用されることが多い
→この文字列は**コンピューターやサーバーを識別するために使用される**

まじでドメイン名と混同しやすくて大変
ホスト名→コンピューター(例えばhogeさんのパソコン)やサーバー(例えばamazonのwebサーバー)などを判断するために使用

ドメイン→インターネット上の住所(google.comならgoogleのサイトだ！)といった風に今自分がインターネット上のどこに存在するかを特定できるようにした名前


また先ほど説明した

```
hoge@localhost:
```

のlocalhostもホスト名であり、これは私のパソコンだ！と文字列で示しているものである。

###実際に自分のhostsファイルを見てみた
こういうのは自分の目で確認した方がわかりやすいと思い自分のhostsファイルを開いてみました
ターミナルで

```
$ vim /private/etc/hosts
```
を入力すると

```
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section
~
```
と表示されました。
このファイルをvimなどのエディターを使って
IPとホスト名を

```
***.***.***.*** hello.com
```

*はIPアドレス、hello.comはホスト名
と記述し編集することでhello.comと対象のIPアドレスを繋げることができる！
hello.comとアクセスするとコンピューターは紐付けたIPアドレスへ接続するようになる！

###ホスト名を設定することの利点
例えばDBをの環境

```
ローカルマシンhosts
127.0.0.1 〇〇DBserver

本番環境マシンのhosts
***.***.***.*** 〇〇DBserver
```

このような形で
ローカル(自分のパソコン)→127.0.0.1 〇〇DBserverと
様々な環境のIPアドレスを〇〇DBserveで対応させてしまえば一つのソースで他のDBサーバに対応させることができる！
→ホスト名を共通項にすることで紐付けを行える

##ドメイン名とDNS,DNSサーバーについてについて
###ドメイン名
相手がインターネット上のどこに存在するかを特定するためにIPアドレスの数字の情報を**人間が視認できる文字列で示したもの**。
→パソコンはIPアドレスの情報をもとにサイトを探すがIPアドレスは数字なので人が認識することはできない(覚えれば話は別だが)
→人が読めるように文字列で表す必要がある
→その文字列がドメイン名である
またそのようなドメイン名をIPアドレスに変換したものがDNSという仕組みである

###DNS,DNSサーバーについてについて
インターネット接続時
DNS(ドメインネームシステム)の仕組みを利用して
ドメイン名(Google.co.jpなど)→IPアドレス(127.~など)に変更することで通信を行う
またその仕組みを行うサーバーのことをDNSサーバーという

つまり、DNSによって通信先(例えばamazonにアクセスする)などを人が視認できるようにしている
→実際に通信を行うのはIPアドレスであるので
文字列で示されたドメイン名を数字であるIPアドレスに変換し、変換したIPアドレスを使用してwebサーバにアクセス
→IPアドレスを受け取ったwebサーバーが返す情報がブラウザ(ChromeやSafariなどで私たちがのぞいている画面)に反映される
→私たちはwebサイトを見ることができる




###DNSレコードについて
そんなIPアドレスとドメイン名の紐付けを行なっているDNSサーバーですがこの対応について記載されているファイルが存在します
→それがゾーンファイルです
そしてこのファイルには一行ごとにIPアドレスとドメイン名を紐付けたりするための設定情報が記載されています


→その一行一行の情報の定義付けを行なっているものをDNSレコードと言います

###DNSレコードの種類
####Aレコード
AレコードのAはadress(住所)を指します。
ホスト名⇄IPアドレス（**IPｖ4**）の紐付けを定義するレコード

####AAAAレコード
ホスト名⇄IPアドレス(**IPｖ6**)の紐付けを定義するレコード

####MXレコード
mail exchange(メールを変換する)の略で
ドメイン名⇄メールサーバーのホスト名を紐付けを定義したもの
→ドメインに紐ついたメールを使用する際に不可欠なのもである

など様々なDNSレコードが存在する

##hostsファイルとDNSサーバーの関係性について
hostsファイル→ホスト名とIPアドレスの対応付けを書いておくためのファイル
DNSサーバー→ドメイン名とIPアドレスの対応付けを書いておくためのファイル


これらはどのようにして関連性を持っているのでしょうか？
この記事を参考にさせていただきました。


https://qiita.com/speedstar18fct/items/35a660a5f6e801142267


hostsファイルは小規模なネットワークであればファイルを編集することで対応付けを行えるので便利だが規模が大きなってしまうと管理が大変になってしまう
→DNSサーバーがあることで内部だけでなく外部からのアクセスにも対応でき、ドメイン名にあったIPアドレスを定義することができる


hostsファイルは小規模の開発に向いている
規模が大きくなった場合、
外部DNSサーバと内部DNSサーバを構築し、
外部DNSサーバ：自分の利用しているドメインはこれと伝える役割を、
内部DNS：hosts設定のような役割を持たせることで、振り分けが楽になる


##ポート番号
TCP/IPモデルの階層構造をアプリケーション層、トランスポート層、インターネット層、ネットワークインターフェース層の４層構造で示した場合、
アプリケーション層とトランスポート層の間にはアプリケーションのプロトコルごとにデータの入り口を用意する必要がある
→これを番号として示したものをポート番号という
これは病院に行ったとき自分の症状によって耳鼻科だったり内科だったりに別れているのをイメージするとわかりやすいかも

####ボート番号の判別
ボート番号は
0-1023:welknownポート
1024-65535:エフェメラルポート(短命なポート)
で分けられている

有名なものだと
80番にwwwのサービスをもつHTTP
443番にwww(セキュリティ付)のサービスをもつHTTP
22番に遠隔ログイン(セキュリティ付)のサービスをもつSSH
などがある。


###welknownポート
0-1023番台のものを指す
通信サービスごとにすでに予約されており、自分がアプリケーションなどを作った際などにこの範囲の番号を付与することはできない

###エフェメラルポート
自分でアプリケーションにポート番号を付与する際に使用される



##URL
Uniform Resource Locator(リソースを特定するための並び)の略
インターネット上のリソース（データやサービス）を特定するための形式的な表示方法のことをいう

##HTTPのエラーについて
###100番台
案内

###200番台
正常処理

###300番台
移転通知

###400番台
処理失敗

###500番台
サーバーエラー

###エラーについて
400番台
500番台
がエラーにあたる

403番：アクセス権がない
404番:リソースが見つからない