サーバサイドエンジニアなら知っておきたい基礎知識まとめ


こんにちは。現在Standard Cognition（ https://standard.ai )というSFにある会社でSoftware Engineerをやっている原健太です([Twitterアカウント](https://twitter.com/hellokenta_ja))

普段はReact&React Nativeエンジニアをやっている僕ですが、ここ数年は変わらないだろうなというサーバサイドの知識くらい知っておきたいなと思い、
[小悪魔女子大生のサーバエンジニア日記](http://www.amazon.co.jp/gp/product/477414522X/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=477414522X&linkCode=as2&tag=hellokenta102-22)という本を読んだので、まとめてみます。

## TCP/IP

- TCP/IPは通信プロトコル
- 通信プロトコルとは、ネットワーク上でデータの通信をするための手順や約束ごとの集まりの事
- TCP(Transmission Control Protocol)とIP(Internet Protocol)の組み合わせでできている

### TCP

- データは **パケット**という小さな小包に分けられて送られる
- パケットは１つずつ番号がついていて、受け取ったら順番通りに元の状態に戻す必要がある。
- TCPは送られてきた物が全部届いているか、壊れていないか、などを確認して、データの受信を完了しましたよと連絡してくれる。
- TCPはデータのやりとりを保証するためのプロトコル

### IP

IPアドレスを書くことを定めているのがIPというプロトコル

## IPアドレス

- コンピューター毎に割り振られる番号で、コンピュータの住所のようなもの
- 32bitの列で、8bit毎に4つに区切った10進数の形で表記されている（125.6.176.42など）
- 全てのIPアドレスはICANN(Internet Corporation for Assigned Names and Numbers)という非営利法人によって管理されている
- IPv6は128bitで、IPアドレスの枯渇問題解決のために生まれた

## MACアドレス

- NICごとに割り当てられた固有の番号で、個々のNICに対して48bitの番号が付けられている
- NIC(Network Interface Card)はネットワークに必要な拡張カードの事。
- NICはパケットを電気信号に変えて送ったり、電気信号をパケットに戻したりします。
- 最近のノートパソコンには複数のNIC(LABケーブル用のNICと無線LANのNICなど)があるため、NICの数だけ、MACアドレスが付けられている
- 16進数で書かれた48bitの番号（00:a8:7b:01:5d:8fなど）
- MACアドレスは決してかぶらない
- ベンダーコード（IEEEによって決められている販売会社の番号）と各販売会社が独自につけた

## IPアドレスとMACアドレスの関係

- MACアドレスだけでも通信はできる
- IPアドレスはグルーピングするために用いられる

## ARP(Adress Resolution Protocol)
- IPアドレスからMACアドレスを調べるためのプロトコル
- IPアドレスとMACアドレスの対応はARPテーブルに書かれる
- ARP要求が同じグループ内のアドレスに送られ、自分のIPだった場合に、自分のMACアドレスを書き込んでARPレスポンスを返す

## ルーティング

- 同一ネットワーク内での通信はARPを使ってIPアドレスとMACアドレスの対応を付ければ可能
- しかし、別ネットワークに対してブロードキャストを使って問い合わせを行うことはできないし、地球全体のすべてのネットワークの構造をすべての通信主体であるコンピュータが知っているという仮定には無理がある
- そこで、複数のネットワークに接続しているコンピュータ（ゲートウェイ(gateway)、ルータ(router))に中継を依頼する
- ゲートウェイは自分が接続しているネットワークに目標とするコンピュータがあればARPを使ってMACアドレスを求めデータを送りつける
- ゲートウェイは自分が接続しているネットワークに目標とするコンピュータがなければ、さらに別のゲートウェイに中継を依頼する
- 送信元から最終的な宛先までの最良の経路（中継ゲートウェイ列）を探す作業をルーティング(routing)と呼ぶ

## DNS(Dmain Name System)

- ドメイン名をIPアドレスに直してあげるシステムのこと
- そのシステムを行うサーバやコンピュータをDNSサーバという

### サーバ
ネットワークでサービスを提供するコンピュータのこと

### クライアント
サービスを提供される側のコンピュータのこと

## SMTP(Simple Mail Transfer Protocol)

- メールを送信・転送するためのプロトコル
- メールサーバは、DNSサーバに送り先のドメイン名（MXレコード）を聞き
- そこのIPアドレス（Aレコード）を聞く
- そのIPアドレスにメールを届ける
- ここまでがSMTPの役割

## POP(Post Office Protocol)とIMAP(Internet Message Access Protocol)

- メール受信のためのプロトコル
- POPはメールサーバから、メールをパソコンにダウンロードする方式。
- IMAPはメールサーバにメールを置いたまま、メールボックスの一覧だけをパソコンに表示する方式。

## WWW(World Wide Web)

- インターネットで公開されているページをみるための仕組み
- ページは、HTML(Hyper Text Markup Laguage)という言語で書かれている
- このHTMLで書かれたドキュメントを公開しているのがWebサーバという
- Webサーバで有名なのがApacheとIISとNginxなど

## HTTP(Hyper Text Transfer Protocol)

- WebブラウザとWebサーバの間でデータ通信する時に使われるプロトコル
- HTTPリクエストには
  - リクエスト行
  - メッセージヘッダー
  - メッセージボディ

がある。

- HTTPレスポンスでは、リクエスト行の部分がステータス行になっている。

### ステータスコード

- WebサーバとWebブラウザがお互いの状態をやり取りするためのコード
- 100番台：情報提供のため
- 200番台：成功を表す
- 300番台：転送に関する
- 400番台：クライアント側のエラー
- 500番台：サーバ側のエラー

例）
- 200 : リクエスト成功
- 301 : リクエストしたページが別のページに移動している
- 403 : リクエストしたページを表示する権限なし
- 404 : リクエストしたページが存在しない

などなど

### ポート番号
- TCP/IPを利用したネットワーク通信のIPアドレスの下に設けられた補助アドレスのこと
- コンピュータが通信に使用するプログラム（アプリケーション）を識別するための番号

### バーチャルホスト

- １つのサーバで複数のドメインを運用する技術

### SSL(Secure Sockets Layer)

- インターネット上で情報を暗号化し、送受信できるプロトコル
- 「https://」
- ポートは443番
- Webページを運営している人が証明書の種（Keypair）をつくる
- 運営会社の情報に証明書の片割れをそえて認証局に申請
- 認証局で申請内容と申請者の存在を確認
- 種の片割れに認証済みマークを付け申請者に返却
- 証明書をサーバにインストールする

## SSH(Secure Shell)

- 自分のパソコンから、ネットワークを介して自分以外のパソコンにログインできる
- リモートホストのコマンド実行ができる
- 通信を暗号化することで安全にしている

### 公開鍵暗号方式

- 公開鍵と秘密鍵の２つの鍵を使用した接続方式
- サーバーに公開鍵、クライアントに秘密鍵を置いて使用する
- 公開鍵で暗号化したものは、秘密鍵でのみ復号化できる