ネットワークメモ

## 概要
自分用のメモなので超絶雑、かつ間違えているかも、かつまだ途中です。


## LANとWAN
- LAN(local area network)とは
一つの企業、一つの大学内など狭い範囲でリソース(情報)を共有するための仕組み

- WAN(wide area network)とは
LAN同士を結びつけてリソースを広い範囲で共有するための仕組み

## プロトコル
情報を共有するための約束事(人の場合何語で話すかみたいな)

## 帯域幅(たいいきはば)
簡単に言うとデータ転移速度
道路の幅みたいなもの。帯域幅が広ければ広いほど多くの情報を運ぶことができる
- ブロードバンド: 帯域幅が広く通信速度が速い通信回線
- ナローバンド: 帯域幅が狭く通信速度が遅いい通信回線

## モデル
- ベンダ
サービスや機器などを提供する企業、販売会社

- ISO(アイソ)
国際標準化機構

- OSI参照モデル
あるリソースをネットワークを通じて共有する場合、通信の手段を整えていく必要がある。その段階をISOが7層の段階に分けたモデル
  - 第1層: 物理層
  - 第2層: データリンク層
  - 第3層: ネットワーク層
  - 第4層: トランスポート層
  - 第5層: セッション層
  - 第6層: プレゼンテーション層
  - 第7層: アプリケーション層

- データユニット
データを送る際に実際はデータのみ送るわけではなく、それ以外の情報も必要となる。(ipアドレス、通信制御用のデータなど)
その際にまとめて包装した物をデータユニットと呼ぶ
カプセル化したデータなどの総称

- カプセル化
送りたいデータに対して制御データを付加していくこと
  - トランスポート層: データ(ペイロード) => セグメント
  - ネットワーク層: セグメント => パケット
  - データリンク層: パケット => フレーム
  - 物理層層: フレーム => ビット

## レイヤ1
- 信号
データを送る際には最終的に何らかの信号となる
一般的には銅線を使った電気信号
  - アナログ信号: 連続的(波)
  - ディジタル信号: 非連続的(on/off)
  これらどちらの信号を使うかは通信回線に依存する

- 信号に起きる障害
  - 減衰: 銅線には抵抗が存在するため、信号が弱まる
  - ノイズ: 様々な影響によって電気信号の形が崩れる
  - 衝突(コリジョン): 同じケーブル内に二つ以上の信号が流れた場合に元の信号から形が崩れる

- ネットワーキングメディア
  - 同軸ケーブル: 中に一本の銅線が通っていて長距離まで信号が届く
  - ツイストペアケーブル: 二つのペアが4束銅線が通っている。LANケーブルの主流
  - 光ファイバーケーブル: ガラスの線が一本通っている。光信号を通す。

  - リピータ: 信号の減衰を解決する。電気信号を増幅する役割。
  - ハブ: リピータの役割を持ちながら多くの機器とつなぐことができるようにする。

## レイヤ2
- 物理アドレス(MACアドレス)と論理アドレス(IPアドレス)
  - MACアドレス: 機器固有につけたれたアドレス(どこにあるかという情報の手がかりはない)
  - IPアドレス: どのネットワークの誰に届けるかを識別するアドレス(最終的に届けるアドレス)

## レイヤ3
- レイヤ2はLAN内での通信を制御するものに対してレイヤ3はLAN(ネットワーク)同士を制御する
- TCP/IP
インターネットにおいての代表的な通信規格。この中に多くの通信規格が存在する
- カプセル化の詳細
IPアドレスをヘッダセグメントデータにつけるだけ
- IPアドレス
コンピュータの住所みたいなもので32ビットで構成されている。
通常表記するときは8ビット毎に10進数にして.(ドット)で区切る
実際レイヤ１で出てきたハブでネットワークを全て繋げることができるが、そうした場合トラフィックが起きるためレイヤ3の仕組みで細かく階層的に分けることでトラフィックを防いでいる
  - ICANN(アイキャン)
  IPアドレスは一意でなくてはいけないのでICANNという団体が管理している
  このポリシーに従って実際にIPアドレスを割り振るのは各国のNICが行う(日本だとJPNIC)
- クラスフルアドレッシング
IPアドレスはクラスA~Eが存在して商用に割り当てられているのがA~C
クラスによってネットワーク部とホスト部の境目が異なる
- 予約済みアドレス
  - ネットワークアドレス
  ホスト部が全て0のアドレス(例: 192.168.10.0)
  そのネットワーク自身を表す。ルーターの経路選択時に使用する
  - ブロードキャストアドレス
  ホスト部が全て1のアドレス(例: 192.168.10.255)
  そのネットワークの全てのホストを表す
  - 全て0(0.0.0.0)
  全てのネットワーク
  - ループバックアドレス(127.0.0.0)
  自分自身を表す
  - 255.255.255.255
  全てのホスト
  - プライベートアドレス
  インターネットに接続しないアドレス(NICはこれらのアドレスは割り振らない)
- サブネットワーク
ネットワークの規模が大きい場合サブネットワークの仕組みを使って階層型にする
ホスト部の中からサブネット部の範囲を決めて階層を深くする(何県何市何町のようなイメージ)
サブネットワークを使った時もルールは変わらないのでホスト部が全て0や1のipアドレスは割り振れない
- サブネットマスク
どこまでがサブネット部下を表すアドレス
- DHCP(レイヤー7)
  DHCP二つからなる
  - DHCPサーバー: サーバーを起動するホスト
  - DHCPクライアント: IPアドレスをもらう側もソフトを起動する
  動的IPアドレスを割り当てるための方式
  クライアントがDHCPサーバーに要求してIPアドレスを借りる
  - リース期限
  ホストが違うネットワークに移動した場合割り当てたIPアドレスはずっと使われないことになってしまわないように期限を設ける
  - DHCPリレーエージェント
  現在のネットワークではサブネットなどでネットワークがかなり細分化されている。DHCPの要求はブロードキャストするためルーターを超えられないのでネットワークごとにDHCPサーバーを置かなくてはならないことになる。
  それだと効率が悪いので、ルーターにDHCPリレーエージェント機能を持たせることによりブロードキャストをユニキャストに変換することで同じネットワークにサーバーがなくても良くなる
- ARP(Address Resolve Protcol)(アープ)(レイヤー3)
宛先MACアドレスを調べるための方式
  - ARPテーブル
  IPアドレスとMACアドレスの対応表
  このテーブルに送りたいMACアドレスが存在する場合はARP要求する必要がない
  dynamicとstaticが存在してdynamicはARP要求にて追加される。ipアドレスは変わることもあるので定期的にdynamicのエントリは削除される
  staticは自分で登録したARPエントリ。絶対に変わることがないルータのipアドレスや仮想環境のipアドレスなどを登録すると便利
  - ARP要求
  IPの代わりにARPというプロトコルを使って要求する
  ARPパケットは特殊でセグメントが中に入っていなくARPパケット自身がデータとなる
  - ARP要求・ARP応答フロー
    宛先にデータを転送しようとして、宛先IPアドレスがわかった後。
    ARPテーブルを参照し、宛先IPアドレスに対応するMACアドレスがあるかどうか調べる。
    なければARP要求をブロードキャスト送信する。
      => 宛先が自分が所属するネットワークだったら宛先ipアドレスをそのまま指定
      => 宛先が他のネットワークだった場合にはデフォルトゲートウェイに設定されているipアドレスを宛先IPアドレスに指定
    ARP要求を受け取った各ホストは、ARPパケットの中の宛先IPアドレスと自分のIPアドレスを比較する。
    一致しなければ、無視。
    一致した場合、ARP応答を送信。
    ARP応答を受け取った(ARP要求を送った)ホストは、ARPテーブルにそのMACアドレスを追加する。
    ４つのアドレスがそろい、宛先へのデータ転送が可能になる。
- ルータ
- ルートテーブル
到達地点までの最適な地図が書いてある
- ブロードキャストドメイン
ルーターはブロードキャストを他ネットワークに流さない役割を持つ
もしこれがなかったらDHCPサーバーに要求した場合全ネットワークにブロードキャストしてしまうことになる
ブロードキャストが届く範囲をブロードキャストドメインという

## レイヤ2,3まとめ
データを送信する際には送信元・宛先のIPアドレス、MACアドレスが必要となる。(本来やり取りしたいデータを送信する前準備的な)それぞれの取得方法
- 送信元MACアドレス
自分のパソコンに取り付けられたNICを見る
- 宛先MACアドレス
宛先IPアドレスがわかった時点でARPテーブルを参照しなかったらARP要求して取得
- 送信元IPアドレス
静的IPアドレスの場合自分で打ち込む。動的IPアドレスの場合DHCPで取得
- 宛先IPアドレス
IPアドレスを直接教えてもらうかドメインをDNSサーバーに送り取得

## レイヤ4
- 役割
信頼性の高い通信サービスを保証する
レイヤ3までは送りっぱなし状態で遅れなくてもデータを破棄するので信頼性はないため
  - 確認応答: 送られた方は送られたことを送信することで送られたかどうか確認ができる
  - フロー制御: 送られてきたデータは一度バッファ(メモリ)に保存される。もし処理速度を上回るデータが送られてきた場合オーバーフロー(メモリから溢れる)起こすので転送スピードを下げてもらうor転送を中断してもらう
  - エンドツーエンド(アプリケーション間): ヘッダにポート番号というものがつけられる。データをコンピュータに送った後どのアプリケーションのデータかを識別する
  - セグメント: サイズが大きい場合に対応できるように分割してデータを送る。どの単位で分割するかどうかはレイヤ2,3に依存する
    - シーケンス番号: 分割されたデータがどの順番かどうかわかるようにするために付与される番号
- コネクション
仮想的に通信路を確保し、確実・正確にデータを送信する仕組み
  - スリーウェイハンドシェイク
  コネクション確立(通信路確保)の手法
    - コネクション確立手順
    SYN: 転送許可要求
    ACK: 転送許可
    SYN => ACK+SYN => ACK
    - コネクション終了手順
    FIN => ACK => FIN => ACK
- セグメント・シーケンス
  - MSS(Maximum Segment Size)
  セグメントの最大サイズ(イーサネットだと約1460byte)
  - セグメント
  MSSのサイズに切り分けたデータにTCPヘッダをつけたもの(レイヤ3に渡すデータユニット)
  - シーケンス番号・確認応答番号
    - コネクション確立時
    1. コネクション要求側はTCPヘッダのシーケンス番号にランダムな値・オプションにMSSを入れて送信(SYN)
    2. 受け取った側は送られたMSSを超えないかつ自分が転送可能なMSSを入れ、シーケンス番号+1の値を確認応答番号に、シーケンス番号にはランダムな値を入れて送信(ACK+SYN)
    3. この時点でMSS決定。受け取った側はシーケンス番号+1の値を確認応答番号に、シーケンス番号には受け取った確認応答番号を入れて送信(ACK)
    4. コネクション確立。MSSとそれぞれのシーケンス番号が決定。
    - データの送受信
    1. 送る側はデータをMSS分に分割し、TCPヘッダを付加(セグメント)。データには1byte単位でシーケンス番号から一つずつ番号が振られる。
    2. 受け取った側はシーケンス番号+MSSのバイト数を受け取ったことになるので、次に受け取る値を確認応答番号に入れて送信する(これで確実に受け取ったことがわかる/確認応答)
    3. 送られてきた確認応答番号をシーケンス番号に入れて、またデータの先頭からシーケンス番号+MSSのバイト数を送る
    4. 繰り返し
    ※逆の場合も同様
    シーケンス番号: 送るデータの先頭バイト番号
    確認応答番号: 次に送ってほしいデータの先頭バイト番号
    - RTT(round trip time)
    送信途中でエラーが起きた場合には確認応答が返ってこないがその場合に備えて一定時間待ってまた再送を送るようになっている
    どれくらい待つかはRTTを元にする。これは確認応答が返ってくる時間から算出する。初期値は3sec。
- ウィンドウサイズ
  バッファサイズのこと。コネクション確立時にそれぞれのウィンドウサイズをTCPヘッダに入れて送信する。
- 複数のセグメント送信
上記のフローだと確認応答が返ってきてから次に送るデータを送信していたが、複数セグメントを送信する方法もある。
それぞれのウィンドウサイズを知っているということは一度に送って良いデータ量がわかるということ
相手のウィドウサイズが4000でセグメントが1000だった場合は4つのセグメントを同時に送れる
確認応答が返ってきたら(現在のウィンドウサイズもヘッダに含まれる)送信中の枠(ウィンドウ)をずらしていきまた送る(スライディングウィンドウ方式)
=> フロー制御
- 輻輳制御(ふくそう)
輻輳: データの渋滞。ルータの処理速度を超えたパケット量がきた場合などに起きる
ルータがフロー制御のようなものを持つと通信コストが高くなってしまうため端末単位で制御する
  - スロースタートアルゴリズム
  ウィンドウサイズに関わらず、最初は1つのセグメントのみを送信し、2倍ずつ送る量をウィンドウサイズまで増やしてく。
  輻輳が起こった場合には基本的にはまた1に戻す
- ポート番号
デバイスにデータを届けた後どのアプリケーションに対してデータを送るのかを識別する番号(プロセスごとに振られる)
TCP/IP通信機能の通信路(ソケット)
  - ウェルノウンポート
  送信元は相手のポート番号を知る必要があるが、知る方法はないので予めよく使われるアプリケーションには決められたポート番号が振られている。
  その0~1023番までをウェルノウンポートという
  送信側のポート番号はウェルノウンポート以外のユニークかつランダムなポート番号を使う
- UDP(User Datagram Protcol)
  - TCPの弱点
  TCPは正確かつ確実にデータを送信するシステムを作っているのでスループットの低下を引き起こす
  - UDPのメリット
  ヘッダとしてつけるのはポート番号くらいなので容量が少ない、かつハンドシェイクなども行わないのでスループットの低下が起こらない(コネクションレス)
  ブロードキャストで送る(DHCPサーバーに送る際など)
  データを届けるかはほとんど保証しないが、送信速度が早いので動画などのストリーミング配信やリアルタイム通信などに向いている
- NAT(ナット)
現在IPアドレスが枯渇している(特にクラスB)のでそれを解決する仕組み
NAT機能を持っているルーターがプライベートIPアドレスをグローバルIPアドレスに変換し外部ネットワークと通信する
こちらに送信された場合はその逆
- NAPT(IPマスカレード, cisco用語だとPAT)
一つのグローバルIPアドレスに対して複数のIPアドレスを割り当てる仕組み
一つのグローバルIPアドレスに対して、「プライベートIPアドレス+ポート番号」のユニークな組み合わせを割り当てる事で実現している
こちら側が送信しNAPT機能を持ったルーターがその組み合わせをNAPTテーブルに保存しておく。レスポンスが返ってきたらNAPTテーブルを参照して目的のアドレス宛に送信し、該当のIPアドレスはNAPTテーブルから破棄する
つまりレスポンス以外の外部からのアクセスはアクセス不可になるのでセキュリティ的にも安全
ただプライベートアドレスで外部からのアクセスを前提としたサーバーなどはこれだとアクセスできないのでその場合は静的マスカレード(ポートフォワーディングを使用する)
- 静的マスカレード(静的NAPT/ポートフォワーディング)
予めNAPTテーブルを設定しておく事でその組み合わせのIPアドレスが外部から送信されてきた場合には目的のIPアドレスに送信する事ができる
- NAPTを使用した際のFTP
FTPはデータそのものに送信先のIPアドレスとポート番号を入れる。ただNAPTはIPヘッダ、TCPヘッダのIPアドレスとポート番号しか変更しないため対応していない
FTPにNAPTを使用したい場合はFTP対応型のルーターが必要となる
※NAT、静的マスカレードはホストOS型の仮想環境構築(Virtual Boxなど)に使われる

## レイヤ5
セッションを管理するレイヤ
アプリケーション間の会話の開始、維持、終了を管理する
また、レイヤ４に引き渡す際に必要なポート番号を決定する

## レイヤ6
プレゼンテーション層
データフォーマットなどの違いを吸収する

## アプリケーション
### telnet
遠隔操作するためのプロトコル
- ローカルホスト
自分が操作する側のホスト(クライアントアプリケーション)
- リモートホスト
遠隔操作される側のホスト(サーバーアプリケーション)

### WWW(World Wide Web)
URIによって指定された場所にあるHTMLによって記述されたハイパーテキストをHTTPによって転送することによって情報共有を行うシステム
以下3つの技術からなる- URI(Uniform Resource Identifier)
    - URL: http://ユーザー名:パスワード@webサーバー:ポート番号/ファイルの場所
  - HTML(HyperText Markup Language)
  - HTTP(HyperText Transfer Protocol)
    - バージョン
    HTTP/0.9 HTTP/1.0 HTTP/1.1
UA(ユーザーエージェント)とWebサーバーからなる
- HTTPメッセージ
開始行 | メッセージヘッダー CRLF | CRLF | メッセージ本体
  - 開始行
    - リクエスト
    メソッド・リクエストURI・HTTPバージョン
    - レスポンス
    HTTPバージョン・ステータスコード・応答フレーズ
  - メッセージヘッダ
    - リクエスト
    一般ヘッダ・要求ヘッダ・エンティティヘッダ
    - レスポンス
    一般ヘッダ・応答ヘッダ・エンティティヘッダ
    - メソッド
    GET: ファイルを要求する
    HEAD: GETとほぼ同じだがレスポンスのメッセージ本体にデータが入らない
    POST: メッセージ本体にデータを入れて送る
- プロキシ
クライアントがwebサーバーとやり取りする代理となるサーバー
複数メリットが存在する
  - グローバルIPアドレス使用の抑制
  あくまで外部ネットワーク(webサーバー)とやり取りするのはプロキシサーバーのみなのでプロキシサーバーのみがグローバルIPアドレスを持っていれば良い(NAPTと同じ役割？)
  - キャッシュの利用
  通常キャッシュはブラウザでここに保存されるが、プロキシがキャッシュを持つ事で複数の端末でキャッシュを共有する事ができ、webサーバーへのトラフィックが防げるかつアクセス処理が高速になる
  しかし現在のwebサイトにおいてはクライアントが見に行くサイトがバラバラになった、かつアクセス回線が高速になったので、逆にプロキシを利用すると手間がかかって遅くなるというデメリットが出てきた
  - webアクセスの管理(学校などで使われる)
  プロキシでホワイトリスト(見ても良いファイル)/ブラックリスト(見てはいけないファイル)を設定しておく事でフィルターをかけることができる
  - セキュリティ(学校などで使われる)
  プロキシを使うと外部からのアクセスが拒否されるのでファイヤーウォールとして使える


## 参考記事
http://www5e.biglobe.ne.jp/aji/3min/index.html