ユビキタスネットワーク 其の五 20171106
IPv4
NICが管理しているアドレスで4バイトで構成されている。接続されている端末一つ一つにユニークなアドレスが割り振られている。イメージだけだと、IEEEが管理しているMACアドレスみたいな感じです。PCを買ってきたらすぐに振らなければならない。
NICが決めるところをnet-id、ユーザーが決めるところをhost-idと呼ぶ。
IPv4のクラス
net-idとhost-idの割り振り方はクラスという単位で区別されている。
- クラスA:0+(net-id : 7bit)+(host-id : 24bit)
- クラスB:10+(net-id : 14bit)+(host-id : 16bit)
- クラスC:110+(net-id : 21bit)+(host-id : 8bit)
- クラスD:1110+(マルチキャストグループID : 28bit)
- クラスE:1111から始まる(将来のためにとっておく)
基本はクラスAからクラスCで、ここには企業が割り当てられている。しかし、2011年に枯渇。
マルチキャストアドレス
クラスD。IPTV(ネットテレビ、生放送など)で用いられている。受信しているSTAに割り当てられるアドレス。
一度にどれだけのSTAが受信しているかわからないので、ルータ経由で、受信を希望しているSTAに割り当てられる。
IPアドレスの割り当て方
host-id部分に異なる値を割り当てることで、全ての通信インターフェース割り当てられる。ここでは、LANのことをサブネットと呼ぶことにする。IPv4を割り当てられた企業組織は、host-id部分を「サブネットid」と「ホストid」に分けて利用することで、自社内すべてのSTAにIPアドレスを割り当てている。というのも、IPv4は1組織に1つしか割り当てられないからだ。
- host-idの上位:サブネットid
- host-idの下位:ホストid
つまり、IPv4をもらったときは「net-id+host-id」という構造だったが、運用段階になると「net-id+サブネットid+ホストid」という構造になる。したがって、net-id+サブネットid部分を区別することが必要になり、サブネットidまでの長さをIPアドレスの後ろに「(IPアドレス)/(サブネットidまでの長さ)」のような、スラッシュで区切った形で表現している。
特殊なIPアドレス
- 0.0.0.0:IPアドレスが割り当てられていない場合の送信元
- 127.0.0.1:ループバックアドレス(自分宛)
- 255.255.255.255:リミテッドブロードキャストアドレス(LAN内のすべてのSTA宛)
- host-idが全て1:ネットワーク指定のブロードキャストアドレス
- ホストidが全て1:サブネット指定のブロードキャストアドレス(セキュリティ面でアウト。DoS攻撃される可能性あり)
プライベートアドレス
家庭、個別組織で用いられるアドレス。クラスはA~Cまで存在する。外部サーバやネットワークに接続するときは、グローバルアドレスに変換する必要がある。
オールホストグループアドレス
224.0.0.1。同じサブネットのすべてのSTAを表すアドレス。リミテッドブロードキャストアドレスと同じ機能を持つ。
IPv4ヘッダ
1行に4バイトあり、これが基本的に5行ある。したがって、基本的にIPヘッダは20byte。ここからは、各行に関して一つずつ書いていく。
1行目
- 0~3bit:バージョン
- 4~7bit:ヘッダ長
- 8~15bit:サービスタイプ
- 16~31bit:パケット長
ヘッダ長
取りうる値は0~15までの値なのだが、ヘッダ長を4byte単位で指定しているため、この値に4byteをかけた値が本当のヘッダ長になる。したがって、ヘッダ長の最大値は15×4=60byte。
パケット長
ヘッダとデータを含むIPデータグラム長をバイト単位で示している。
2行目
この行にあるのは、IPフラグメンテーションのために使われるもの。IPフラグメンテーションとは、大きなデータを送るときに複数パケットに分割することなのだが、ばらばらに分けたデータグラムを復元するときにいろいろなパラメータが必要になる。この行では、そのようなパラメータを扱っている。
IPは最大で1500byteまでしか一度に転送できないため、このフラグメンテーションが必要になる。特に、UDPを使っている通信では、データが1500byte以上になるかがわからないため、必要になる(TCPを使っている場合は、データ長が最大1500byteであることがわかっているので問題ない)。
識別子
ただデータを分割するのではなく、どのデータから分割されたものなのかがわからないと、正しく復号することができない。そこで、同じデータから分割されたものには、同じ識別子が与えられる。復元する際は、この識別子を見て行う。
モアフラグ
分割されたデータがどこで終わるのかがわからないと、いつまでたっても復元は終わらない。そこで、分割されたデータのうち、途中のものを1、最後のものを0とするモアフラグを導入している。これにより、モアフラグが0の分割データを扱ったときに、そのデータの復元は終了したと確認できる。
フラグメント・オフセット
どんな順序で分割されたデータが並んでいたのかを識別するもの。注意したいのは、フラグで3bit分取られてしまうこと。したがって、ここに出てくる値は本来の値を8で割ったものになる。真値を知りたい場合は、ここの値に8をかける。
フラグメントされない場合
分割する必要がない場合は、
- 識別子は固有の値
- モアフラグは0
- フラグメント・オフセットは0
になる。