いわりょのBlog

IT関連で学んだことを書いていきます。

ネットワーク基礎学習⑤ IPアドレス その2 「IP アドレスクラス」

前回は、「IPアドレス」とは何かを学び、「ネットワークアドレス」と「ホストアドレス」について解説しました。

ryo10leo.hatenablog.com

今回は、IPアドレスクラスについて書いていきます。

IPアドレスクラスとは?

IPアドレスクラス」とは、IPアドレスの値によって、IPアドレスを幾つかのカテゴリに分類したものである

分類されることでなにが違うのかと言うと、例えばクラスごとでそれぞれのIPアドレスの「ネットワーク部の範囲」や「ホストアドレス部の範囲」が異なります。

以下の図を見ながら説明します。↓

代表的なクラス

f:id:Ryo10Leo:20200424234727p:plain

f:id:Ryo10Leo:20200424235557p:plain

クラスA

クラスAは、ネットワーク部が8ビットホスト部24ビットIPアドレスです。
上の図の通り、ネットワーク部の先頭が0で始まります。使用できるネットワークは126個で、ネットワークに約1600万台のホストを接続することができます。
これはおそらく一般の方が使うことはないでしょう。このクラスは、大きな組織ISP(インターネットサービスプロバイダ)の利用を想定しています。

クラスB

クラスBは、ネットワーク部が16ビットホスト部16ビットIPアドレスです。ネットワーク部の先頭が10で始まります。使用できるネットワークは16,384個で、ネットワークに接続できるホストは65,534台となります。

クラスC

クラスCは、ネットワーク部が24ビットホスト部8ビットIPアドレスです。ネットワーク部の先頭が110で始まります。使用できるネットワークは約209万個で、ネットワークには254台のホストを接続できます。小規模の組織やネットワークでの利用を想定しています。

その他のクラス

クラスE

クラスDは、IPマルチキャスト用のIPアドレスです。最初の4ビットが1110ではじまり、残りの28ビットマルチキャストグループアドレスを表しています。
マルチキャスト通信を使ったマルチメディア・アプリケーションなどで使わレます。例えば、同じ内容の音声や映像データなどをいっせいに「放送」するような用途で使われる。

クラスD

クラスEは、最初の4ビット1111で始まるIPアドレスです。クラスEのIPアドレス実験的な目的のために予約されていて、実際に使われることはないそうです。

IPアドレスクラスの問題

今回の記事の概念だけで考えますと、大きな問題に気付きますでしょうか?

例えば、自分がクラスCの192.168.1.0IPアドレスを割り当てられたとします。そうなると、192.168.1.1 ~ 192.168.1.254の範囲でホストが254台も割り当てられることになります。
普段、そんなにコンピューターやルータをつなぐことってほぼありませんよね(笑)
家にパソコンとルータの2台のみだったとしたら、残りの252台分のIPアドレスが無駄になってしまいます。

それを解決するのが「サブネット」です。

これは次回の記事で解説します。

ネットワーク基礎学習④ IPアドレス その1「概要 」「ネットワークアドレス」「ホストアドレス」

今回はIPアドレスについて説明します。
記事を何回かに分けて書きます。

1. IPアドレスとは

f:id:Ryo10Leo:20200422211037p:plain

みなさんがお住まいのお家にはもちろん「住所」があると思います。

上のイメージのように、、、


f:id:Ryo10Leo:20200422211822p:plain

ネットワークの世界にも、あるネットワークとそのネットワーク内で接続されている機器などの位置を「 IPアドレス」と呼ばれるもので表現します。

よって 「IPアドレス(Internet Protocol Address)」とは、インターネット上での住所のような役割を担っており、パソコンやスマートフォンなどネットワーク上の機器を識別するために割り当てられているのです。

2. IPアドレスの表記形式(IPv4)

ドット・デシマル・ノーテーション

IPアドレスは「32ビット」からなる一つの値です。

表記形式ですが、、、↓

f:id:Ryo10Leo:20200422214150p:plain

こちらです。(完)






嘘です。見やすくしていきます↓

f:id:Ryo10Leo:20200422214540p:plain

32ビットある2進数を、8ビットずつ4組に分けて、、、

f:id:Ryo10Leo:20200422215525p:plain

10進数に変換します。

f:id:Ryo10Leo:20200422215656p:plain

この表記方法を「ドット・デシマル・ノーテーション」と呼ぶそうです。

ネットワークアドレス・ホストアドレス

先ほどの表記法は

グループ(LAN全体)を表す番号」と、

LANに接続されたノード(ホスト)を表す番号

の2つからなります。

前者を「ネットワークアドレス」とよび、

後者を「ホストアドレス」といいます。

住所でざっくり例えると「◯◯市にある(グループ)、△△マンション(ノード)」のような表現です。

先ほどの図に戻ります。↓

f:id:Ryo10Leo:20200422211822p:plain

この図を最小のネットワーク(LAN全体)ごとに分割すると、、、

f:id:Ryo10Leo:20200422221011p:plain

赤文字のようになります。(紫◯とオレンジ◯)

ということは、この図の中で「それぞれ分割したネットワークを示したアドレス」を表しているのはどれでしょう?(ヒント: 赤文字の上)

192.168.0.0」と「172.16.0.0」ですね。

これらが「ネットワークアドレス」です。

それに続いて「ホストアドレス」ですが、先ほどの分割したネットワークごとのホストを表します。

またネットワークに分割した図に戻ります。↓

f:id:Ryo10Leo:20200422221011p:plain

では、ネットワークアドレス「192.168.0.0」の中にある「ホストアドレス」はどれでしょう?(ヒント: 192.168.0.1 ~ 192.168.0.254)



正解は、、、、




f:id:Ryo10Leo:20200422223251p:plain

こちらの4箇所。

ここではあまり気にしなくていいですが、デフォルトゲートウェイルーターIPアドレス(192.168.0.254)も当てはまることに注意。

ホストアドレスの範囲

上記のヒントでも書きましたが、ホストアドレスの範囲は、、、

今回の記事の例ですと、

ネットワークアドレス」が「192.168.0.0」の場合、、、

紫◯内の「ホストアドレス」の範囲は、「192.168.0.1 ~ 192.168.0.254」で254個あります。


ネットワークアドレスの「192.168.0.0」は使えないの?と思うかもしれませんが、、、使えません。。。

なぜなら上記の解説の通り、、、192.168.0.0はネットワークアドレスだからです。

それを表現する値が必要なので、ホストアドレスとして扱うと重複しますし。

あと2進数に詳しい方は、気づいていると思いますが「192.168.0.255」も使われておりません。

これは「ブロードキャスト」通信のために使われるため、ホストアドレスとしては使えません。

ネットワーク内の全ホストに通信を行うためと覚えてください。


今回は以上。

次回は、「IPアドレスクラス」について解説していきます。

ryo10leo.hatenablog.com

ネットワーク基礎学習③ ARP

ARPとは

概要

ARP(Address Resolution Protocol)とは、IPアドレス」を元に「MACアドレス」が得られるプロトコルのこと。

なぜ ARPが必要か。

そもそもデータ通信を行うためには、以下の4つのアドレスが必要です。

  1. 送信元MACアドレス
  2. 宛先MACアドレス
  3. 送信元IPアドレス
  4. 宛先IPアドレス

f:id:Ryo10Leo:20200420220253p:plain

ネットワーク内のIPアドレス可変(住所で言うと引越可)なもので、 MACアドレス不変(住所で言うとそこに住む人)であるため、データ送信先の場所と、その場所にいるものがデータを受け取って欲しい機器であることが保証されている必要があります。

よって、「IPアドレス」は最終的なデータの送り先を「MACアドレス」はどの機器に伝送するかを識別するために必要だということです。

ARPリクエスト・ARPリプライ・アドレス解決

f:id:Ryo10Leo:20200420222338p:plain

宛先のMACアドレスを知るためには、まず「ブロードキャスト通信」でネットワーク内の全てのホストに「ARPリクエス」を投げます。例えるなら、館内放送で「どこどこにお住まいの○○さんいますかー?」と全体に聞かれてる感じですね。

あまり詳しく説明しませんが、ARPリクエストのフレームの中身はこんな感じ↓
f:id:Ryo10Leo:20200420225423p:plain

次に「ARPリプライ」ですが、、、、

f:id:Ryo10Leo:20200420224354p:plain

もしネットワーク内に、 IPアドレスに対応したホストがあれば、そのホストは自分のMACアドレスを格納した「ARPリプライ」を「ユニキャスト」で返します。
ホストCのように無関係の場合は、ARPリクエストをそのまま破棄します。

フレームの中身は、こんな感じ↓↓

f:id:Ryo10Leo:20200420230003p:plain

ブロードキャスト、ユニキャストの説明は以下の記事で解説してます。↓

ryo10leo.hatenablog.com


上記のようにARPの一連の動作によってMACアドレスを認識することを「アドレス解決」といいます。


ちなみに、先ほど紹介した動作は、同じセグメント内での動作になります。

インターネットを個々のネットワークに分割していった時の、一つ一つの「部分=ネットワーク」のことをセグメントと呼びます。

別セグメントのMACアドレスを知る

先に説明すると、ARPはセグメントごとに発生します。

例えば、ルーター(デフォルトゲートウェイ)を経由して、別のネットワーク(セグメント)にあるホストの MACアドレスを知りたい場合は以下のような動作になります。

f:id:Ryo10Leo:20200420233850p:plain

まずセグメントAの中で、ARPリクエストを投げます。

f:id:Ryo10Leo:20200420234204p:plain

セグメントAにない場合は、ルーター(デフォルトゲートウェイ)がルーター自身のMACアドレスARPリプライで返します。
これによってホストAは、セグメントBにあるホストに送信したい場合は、ルーターにデータを送信すればよくなります。(通常はセグメント内に目的のホストがなければ、デフォルトゲートウェイにデータがいくようにルーティングされています。)

f:id:Ryo10Leo:20200420234949p:plain

その後そのルーターが、「セグメントB」にARPリクエストを流し、宛先APアドレスから宛先のMACアドレスを調べます。

f:id:Ryo10Leo:20200420235618p:plain

宛先のホストが見つかれば、セグメントAの時と同様に、ARPリプライをルーターに返します
これによってルーターから目的のホストへデータを送信することができるようになりました。

このようにデータを送信する際に、経由するセグメントが増えれば増えるほど、セグメントごとにARPをすることになります。

ネットワーク基礎学習② MACアドレス

MACアドレスとは

コンピューターの「NIC」やネットワーク機器(ハブ、リピータ、ルータなど)の各ポートに対し、それぞれの製造時に重複なしに付与された番号 (アドレス)。「物理アドレス」「ハードウェアアドレス」とも呼ばれる。

f:id:Ryo10Leo:20200419230311p:plain


フレームの送信元や宛先を識別するためにデータリンク層(レイヤ2)で利用されます。

f:id:Ryo10Leo:20200419224808p:plain

ryo10leo.hatenablog.com

フレームでMACアドレスを使うことにより、データ転送時に「この機器は、この機器に接続したいんだな」と理解することができます。

表記法

MACアドレスは、「48ビット」(6バイト)からなり、「16進数(1〜F)12桁」で「-」「:」「.」のいずれかで区切って表記される。

-」「:」の場合は、2桁区切りで、
○○-○○-○○-○○-○○-○○」「○○:○○:○○:○○:○○:○○

.」の場合は、4桁区切りです。
○○○○.○○○○.○○○○

MACアドレスの構成

f:id:Ryo10Leo:20200419233052p:plain

MACアドレス前半の24ビットは「OUI 」(Organizationally Unique Identifier)と呼ばれるIEEEが各製造会社に割り当てた番号を表す。
OUIは「ベンダーコード」とも呼ばれる。

 
00000E 富士通
000087 日立
000143 IEEE 802


後半の24ビットは各製造業者が製品に割り当てた番号を表す。「シリアル番号」とも呼ばれる。

特別なMACアドレス

通常のMACアドレス(ユニキャスト)

f:id:Ryo10Leo:20200419235434p:plain

通常は通信相手のMACアドレスを指定して、データを送信します。

ブロードキャスト

f:id:Ryo10Leo:20200419235806p:plain

ブロードキャストとは、送信元が所属しているネットワークの全てのノードにデータを渡すこと

ブロードキャストで送信したい場合は、宛先に「ブロードキャストMACアドレス」(FFFF.FFFF.FFFF)を指定する。
この際送信されるフレームは、「ブロードキャストフレーム」と呼ばれる。

マルチキャスト

f:id:Ryo10Leo:20200420000522p:plain

いくつかのノードを指定した「マルチキャストグループ」に「マルチキャストMACアドレス」を設定し、データを送信します。

ネットワーク基礎学習① 「パケット」「フレーム」

1. PDU

PDU(プロトコルデータユニット)とは、データ通信において、あるプロトコル(通信規約)が扱うひとまとまりのデータの送受信単位のこと。

「パケット」「フレーム」など、具体的な呼び名はプロトコルによって異なる。

2. フレーム

フレームとは、「データリンク層を流れるパケット」である。

f:id:Ryo10Leo:20200419204152p:plain

現状、データリンク層と言えば「イーサネット」が主流なので、「イーサネットでやりとりされるデータの最小単位」となる。

フレームフォーマット(DIX仕様)

f:id:Ryo10Leo:20200419211105p:plain

イーサネットで扱われるフレームは、TCP/IPで使用されているという理由から「DIX仕様が一般的」となっている。
l2ヘッダ + ペイロード + トレーラからなる。

フィールド

フレームを構成する一つ一つの要素を「フィールド」という。

l2ヘッダ

宛先MACアドレス」「送信元MACアドレス」とそれぞれフィールドがあり、送信先&送信元のノードを識別するための番号」を割り当てられている。

MACアドレスに関しては以下の記事で解説↓↓
ryo10leo.hatenablog.com


タイプ」とは、上位層のプロトコルがなんであるかを識別するための番号

ペイロード

フレームからヘッダーやトレーラーを除いたデータの差分(データ)である。

データ」とは、イーサネットフレームによって運ばれる送信データである。

トレーラ

FCS(Frame Check Sequence)のフィールドからなり、エラーチェック用の値(CRC値)が格納される。

プリアンブル

フレームの開始をノードに認識させるための特殊な信号。受信時に廃棄されるため、厳密にはフレームに含まない。

3.パケット


下記図の①②③のようにレイヤー3以上のPDUをパケットと呼ぶ。ヘッダーとデータを合わせた固まりである

f:id:Ryo10Leo:20200419214712p:plain

セグメント

図②のTCPパケットは、セグメントと呼ばれることもある。
トランスポート層において通信されるデータの単位で、TCPヘッダが頭に付けられたもの。

Chrome + ELB(ALB)の通信が遅すぎたので改善しました。

僕が作成したポートフォリオサイトについてなんですが、、、


https://salon-ratio.com/


最近までページ表示までの時間が遅すぎて困っていました。


画像を圧縮」しても、「CSS」や「Javascript」を改修してもダメ。。。


一体どういうことなのでしょうか???(怒)


以下のツールを使ってサイトの「ページ表示速度」を測ってみます。

【これは便利】あなたのWebサイト表示のどこが遅いかを一発で調べるブックマークレット | 初代編集長ブログ―安田英久 | Web担当者Forum

f:id:Ryo10Leo:20200318182218p:plain

ですよね...笑


原因は、「Webサーバーの接続受付SSL)」らしい。


それを知って、ふと「HTTPS通信」を行うために「AWS(ELB,ALB)」を利用していたことを思い出しました。


おそらくAWSの「ロードバランサー」を改善することで、速度が改善されるだろうと考えました。


ということで、解決策を調べてみるとこんな記事が↓↓↓

qiita.com

参考にさせていただくと、ロードバランサーを設置する際に、利用している2つのサブネットに「インターネットゲートウェイ」(以下 IGW)を設定すれば解決できるとのこと。


実際にAWSダッシュボードから対象のサブネットを確認すると、、、


2つのサブネット中、1つだけIGWが設定されておりませんでした。

サブネット1↓
f:id:Ryo10Leo:20200318184338p:plain

サブネット2↓
f:id:Ryo10Leo:20200318184343p:plain

今回はサブネット2の方に、IGWを含めたルートテーブルを関連づけします。


関連付けの方法は今回割愛させていただきます。


設定後、再度Webサイトを表示して、読み込み速度を測ります。↓

f:id:Ryo10Leo:20200318185022p:plain


読み込み速度は改善されたようです!


すごく褒められました!ありがとうございます!

EC2で構築したPostgreSQLデータベースを定期的にバックアップ。ローカルにもバックアップファイルをコピーする

今回やることを図で理解する

f:id:Ryo10Leo:20200207005205p:plain

図のようなバックアップ作業を定期的に自動で行われるようにします。

自動バックアップの設定

1. EC2側の設定

EC2にログインして作業します。

バックアップファイルの保存用ディレクトリ作成
$ sudo mkdir -p /var/backup/
$ sudo chmod 777 /var/backup/

バックアップ用のディレクトリが作成されました。

バックアップ用シェルスクリプトの作成

PostgreSQLのDBをバックアップする「シェルスクリプト」を作成します。

#シェルスクリプトを保存するディレクトリの作成
$ sudo mkdir -p /var/backup_sh

#実行する命令などを各種設定
$ sudo vi /var/backup_sh/pg_backup.sh
#!/bin/bash

# バックアップファイルを残しておく日数
PERIOD='+10'

# 日付
DATE=`date '+%Y%m%d-%H%M%S'`

# バックアップ先ディレクトリ
SAVEPATH='/var/backup/'

# 先頭文字
PREFIX='任意の文字' 例 'sample_app_backup'

# 拡張子
EXT='.custom'

# データーベース名
DBNAME='任意のDB名' 例 'sample_db'

# バックアップ実行
pg_dump -Fc $DBNAME -f $SAVEPATH$PREFIX$DATE$EXT

# 保存期間が過ぎたファイルの削除
find $SAVEPATH -type f -daystart -mtime $PERIOD -exec rm {} \;
シェルスクリプトのテスト
 #権限付与
$ sudo chmod 755 /var/backup_sh/pg_backup.sh

#シェルスクリプト実行
$ /var/backup_sh/pg_backup.sh

バックアップファイルが作成されているか確認。

$ ls /var/backup/
postgres-20200206-173203.custom

シェルスクリプトにより、バックアップが作成されました。

cronで定期的にバックアップをおこなう

cron」コマンドを使うことで、指定した日時に任意の処理を実行できます。

cronを登録するには「crontab -e」コマンドを使います。「-u」オプションで実行するユーザーを指定します。

sudo crontab -e -u ユーザー名

一分おきにバックアップファイルが作成されているか、実行テストをしておきます。↓

*/1 * * * * /var/backup_sh/pg_backup.sh > /dev/null 2>&1

実行確認ができたら、「毎日4時11分にバックアップファイルが作成」されるように設定。↓

$ sudo crontab -e -u ユーザー名
11 4 * * * /var/backup_sh/pg_backup.sh > /dev/null 2>&1

2.ローカル側の設定

scpコマンドの説明

scp」コマンドを使ってEC2のバックアップファイルをコピーします。

$ scp コピー元 コピー先

~/.ssh/configにSSH接続の設定をしている場合↓

~/.ssh/config

Host sample_key_rsa
  Hostname xx.xxx.xx.xx
  Port 22
  User hoge
  IdentityFile ~/.ssh/sample_key_rsa

この場合のscpコマンドの使い方は以下の通り↓

$ scp sample_key_rsa:~/test.txt ~/desktop

上記のコマンドの例でいうと、「EC2のtext.txtファイルをローカルのデスクトップへコピー」しています。

バックアップをローカルに定期的にコピーする設定

バックアップが取得できるかテスト

local
#バックアップを保存するディレクトリ作成
$mkdir -p ~/myapp_backup/myapp_db
#EC2のバックアップファイルのコピー
$ scp sample_key_rsa:/var/backup/postgres-20200206-173203.custom ~/myapp_backup/myapp_db
#確認
$ls ~/myapp_backup/myapp_db

ローカルでバックアップファイルを取得するシェルスクリプトの作成。

$ mkdir -p ~/myapp_backup/myapp_backup_sh/
$sudo vi ~/myapp_backup/myapp_backup_sh/backup.sh

#!/bin/bash

# バックアップファイルを残しておく日数
PERIOD='+10'

# バックアップ先ディレクトリ
SAVEPATH='/Users/user_name/myapp_backup/myapp_db/'

# 保存期間が過ぎたローカルファイルの削除
find $SAVEPATH -type f -mtime $PERIOD -exec rm {} \;

#最新のバックファイルの位置を取得
#EC2のバックアップファイル作成日時から、2時間以内のファイルを取得します。
LATESTFILE=`ssh sample_key_rsa find /var/backup/ -type f -mmin -120`

#EC2の最新のバックアップファイルをローカルにコピー
scp sample_key_rsa:$LATESTFILE $SAVEPATH

作成したら、実行権限をつけます。

$ sudo chomod 755 ~/myapp_backup/myapp_backup_sh/backup.sh

定期実行する設定

$ sudo crontab -e -u ユーザー名

EC2でバックアップファイルが作成された1時間後に、ローカルへコピーするようにします↓

11 5 * * * Users/user_name/myapp_backup/myapp_backup_sh/backup.sh > /dev/null 2>&1


これで設定が完了しました!