naoki86star

インターネットの片隅でなにかしら書いてみる

IPv6/udpでのフラグメント

 IPv6で1500byte overのudpを投げてみると、例えば3000byteで投げてみると、ちゃんと届きます。このときやっぱりパケットはMTUサイズに起因したした分割が発生しています。

import socket
UDP = somewhere, someport
MESSAGE = "*"*3000
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.sendto(MESSAGE.encode(), (UDP)

 パケット解析において、 ipv4/udpの場合でフラグメントすると面倒だったのは、フラグメントパケットサンプルにはL4情報が格納されていないことで、要はそのサンプルだけでは元先トランスポート・ポート番号が分からない、ってこと。全パケットを通して解析できるわけでない荒いサンプリングでは、2番目以降のパケットサンプルからほかの1番目パケットサンプルとあわせてプロトコルとパケット全体サイズを類推するみたいなことになります。*1

 フラグメントパケットかどうかを示すフィールドが、IPv4だとIPv4ヘッダにレギュラーメンバーとして入ってますけども、IPv6だと、その情報が必要なときに添付される形の、拡張情報になってます。これ以外の拡張情報も含めてこうすることで、IPv6ヘッダのサイズそのものは固定になり、読み手からすると読みやすい、ってことかなって思います。

 結局、UDPのフラグメントに関しては、解析時の扱いはIPv4/IPv6ともに同じようにできると思います。offset/継続有無の参照処理は、IPv4/IPv6で若干違うので、中間ツールを使ってる場合とかはその仕様について要チェックになります。例えば、IPv6パケットの場合に、拡張ヘッダは認識はするけど読み飛ばしている、とかあるかもしれません。

調査時に読んだ記事:
Learn IPv6: Understanding the IPv6 transition

*1:最初と最後のパケットサンプルが重要かな。。