泳げないたいやきの日記

メモとして残していきます。誤字脱字や、誤った記事などがあればご教授いただますと幸いです。

パケットキャプチャをしよう ② (IPv4)

前回

 前回の記事では、データリンク層を解析したので、今回はネットワーク層IPv4を解析していこうと思います。

 

ネットワーク層

 

f:id:OyogenaiTaiyak1:20201001174427p:plain

図 IPv4

  ネットワーク層IPv4のフレームは、「バージョン」、「ヘッダー長」、「ToS(Type of Service)」、「パケット長」、「識別子」、「フラグ」、「フラグメントオフセット」、「TTL (Time To Live)」、「プロトコル番号」、「ヘッダーチェックサム」、「送信元IPアドレス」、「宛先IPアドレス」から構成されている。

 

 

バージョンについて

 バージョンは4ビットで構成されており、IPのバージョンを表している。

バージョンは現時点で、

  • 4 : IPv4 (2進数表記で0100)
  • 5 : ST Datagram Mode
  • 6 : IPv6 (2進数表記で0110)
  • 7 : TP/IX
  • 8 : PIP (The P Internet Protocol)
  • 9 : TUBA

の6種類となっている。

 図では、「0100 = Version 4」となっているので、IPv4を使用していることがわかる。

※バージョンがIPv6になるとパケットのフォーマットもIPv6仕様になる。

 

ヘッダー長について

  ヘッダー長(Internet Header Length)は4ビットで構成されており、IPヘッダの長さを32ビット単位に変換した値を表している。

 ヘッダー長を見ることにより、IPヘッダの終了する位置やIPデータの開始位置を知ることが可能となる。

 図では、「Heder Length 20 Bytes (5)」と表示されており、IPヘッダーの長さが20バイトということを知らせてくれている。

 

Different Service Field (ToS)について

 ToS(Type of Service)は、8ビットで構成されており、送信しているIPの品質や、優先度を表している。

Wiresharkでは、ToS(Type of Service)ではなく、Different Service Fieldと表されている。

  • 0、1、2ビット:「優先度」
  • 3、4、5ビット:D、T、Rと呼ばれ パケットに対しての「必要な遅延」、「スループット」、「信頼性」を提供する
  • 6ビット:RFCでは設定されているがまだ使用は不可
  • 7ビット:将来の予備用のビット

 

 図では、0~7ビットまで全て「0」となっているので、優先度も低く、さらに、パケットへのサービスも通常通りに処理を行うことを表している。

 

Total Length(パケット長)について

 パケット長は、16ビットで構成されており、ヘッダとデータを含めたデータグラム全体の長さを表している。

パケット長は16ビットなので、2の16乗=65535オクテットまでIPパケットを送信することが可能。

 

Identification(識別子)について

  識別子は、16ビットで構成されており、データを分裂させて(フラグメント)送信した後に、再びデータをくっつける際に識別子として使用する。

  識別子は、送信元のPCやサーバーが割り当てるので、途中で変更されることはない。

 

 図では、「Identification :  0x3363 (13155)」と表されている。

 

Flags(フラグ)について

 フラグは、3ビットで構成されており、データグラムを分裂(フラグメント)する時に使用する。

 

  • 先頭1ビット目:未使用
  • 中間2ビット目:DFビット「Don't Fragment」とされており、データグラムを分裂させたくない時に「1」を、分裂させたい時に「0」を指定する。
  • 最終3ビット目:MFビット「More Fragment」とされており、分裂したデータグラムを送信している時に、残りのデータがまだ送られてくるなら「1」を、送らてこなければ「0」を指定する。

 

 図のFlagsでは、

  • 先頭1ビット目:未使用なので「0」
  • 中間2ビット目:データグラムを分裂させたくないので「1」
  • 最終3ビット目:このデータの後ろに送られてくるデータが無いので「0」

と表示されている。

 

Flagment offset(フラグメントオフセット)について

 フラグメントオフセットは、13ビットで構成されており、分裂されたデータが、分裂前のデータのどこの部分に存在したかを宛先のPCやサーバーに指示する役割を持つ。

 

 図のパケットでは、データを分裂させていないので「Flagment offset 0」と表されている。

 

TTL(Time to live)について

 TTLは、8ビットで構成されており、このパケットがネットワーク内に存在できる最大時間を表示する。

 TTLは、ネットワーク内のルータ等を経由した際に、「1」ずつ減算され、「0」に到達しるとネットワーク内からパケットが消去され、送信元のPCやサーバにICMPメッセージが送信される。

 図では、「Time to live : 117」と表されており、後117個のネットワーク内のルータ等を経由すると、パケットが消去され、ICMPメッセージが送信元に送られる。

 

Protocol(プロトコル番号)について

 プロトコル番号は、8ビットで構成されており、パケットを運ぶ際に、上位の層のでどのプロトコルを使用しているかを表している。

 

主なプロトコル番号

  • 1:ICMP(Internet Contorol Message Protocol)
  • 4:IP
  • 6:TCP(Transmission Contorol Protocol)
  • 17:UDP(User Datagram Protocol)

 図では、「Protocol : TCP (6)」と表記されているので、このパケットの上位層ではTCPが使用されていることがわかる。

 

 Header checksum(ヘッダチェックサム)について

  ヘッダチェックサムは16ビットで構成されており、IPヘッダのチェックサムを表し、IPヘッダが壊れていないかを教えてくれる。

 

 図では、「Header checksum : 0x75xx [validation disabled] 」と表示されていた。

※他にも、「 [Header checksum status : Unverified] 」と表示されているので、この図のパケットではチェックサムを検証していないのかもしれません。

 

Source(送信元のIPアドレス)について

 送信元のIPアドレスは、32ビットで構成されている。

 

 Destination(宛先IPアドレス)について

  宛先のIPアドレスは、32ビットで構成されている。

 

まとめ

 ネットワーク層でのIPv4は、約12個の要素で構成されており、その1つ1つがとても奥深くまで考えられながら開発されてきたのだなと解析しながら思いました。

 個人的に、ToSの7ビット目の将来の予備としてのビットが、今後どのように使用されていくのかがとても楽しみです。

 

参考文献

  • マスタリングTCP/IP 入門編 第5版 竹下隆史・村山公保・荒井 透・苅田幸雄共著
  • マスタリングTCP/IP 応用編 Philip Miller著 苅田幸雄監訳
  • パケットキャプチャの教科書 みやたひろし著