comment前回は、実際に送信されるMPTCPのMP_CAPABLEのパケットを眺めてみました。FIN、MP_JOINのフォーマットと実際のパケットを見比べてみます。MPTCPのオプションは、前回の内容を参考にしてください。ADD_ADDRADD_ADDRは、使用可能なアドレスがある場合、そのアドレスの情報を対向ノードに知らせる際に使用されます。OptionIPVerは、IPv4の場合は4、IPv6の場合は6が入ります。Portはポート番号を示し、これが含まれるかどうかはLengthから推測します。6903TCPヘッダのデータオフセットが0xcなので、オプション領域を含むTCPヘッダの長さは、48バイトです。最後の16バイト目からの8バイトがADD_ADDRの領域です。6902′′で192.168.105.2です。このパケットのTCPヘッダの長さは48バイトで、あと12バイトのデータを含むことができます。今回はIPv4アドレスだったのでサイズは4バイトでしたが、IPv6アドレスの場合は16バイトです。IPv6アドレスを通知する場合、TCPヘッダの最大長である60バイトが使われます。DSSDSSは、MPTCPのデータのACKとシーケンス番号の情報を対向ノードに知らせるために使用されます。OptionFはDATA_FINで、設定されている場合は送信者からの最後のデータが含まれていることを表します。mはDSNが8オクテットかどうかを示し、設定されていない場合は4オクテットです。MはDSN、SSN、DLL、Checksumがあるかどうかを示します。ACKが8オクテットかどうかを示し、設定されていない場合は4オクテットです。ACKが存在するかどうかを示します。3435TCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。0x45バイト目からの20バイトがDSSの領域です。フラグの領域は0x05なので、2進数では00101となり、MフラグとAフラグが設定されています。ACKが存在し、またMフラグが設定されているので、DSN、SSN、DLL、Checksumが存在します。ACK、”0xbe90b4dc”がDSN、”0x00000019′′がSSN、”0x0594′′がDLL、”0xb2ba”がChecksumです。FINパケットついでにDSSでFINフラグが設定されているパケットを見てみます。2d3aTCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。先程と同様に、0x45バイト目からの20バイトがDSSの領域です。フラグの領域は0x15なので、2進数では10101となり、Fフラグが設定されています。このパケットでMPTCPレベルでのFINが送られていることが分かります。MP_JOINMP_JOINオプションは、MPTCPの2本目以降のコネクションを確立する際に送受信されるSYN、SYN+ACK、ACKに付きます。2本目以降には第4のACKが送られますが、このパケットにはMP_JOINオプションは付きません。SYN)Bフラグは、このコネクションがバックアップ回線かどうかを示します。IDはADD_ADDRで通知されたアドレスIDです。TokenはMPTCPのコネクションを特定するために使用され、ランダム値はリプレイ攻撃を防ぐために使用されます。IDは通知されないので、暗黙的に0になります。f13eTCPヘッダのデータオフセットが0xdなので、オプション領域を含むTCPヘッダの長さは、52バイトです。最後の12バイトがMP_JOINの領域です。IDが2、Tokenが”0x60804130′′、ランダム値が”0x4341f13e”であることが分かります。SYN/ACK)MP_JOINを含むSYNパケットを受け取った側は、SYN+ACK+MP_JOINパケットを返します。Tokenを知らなかったり、追加のコネクションの作成を拒否する場合はRSTパケットが飛びます。fb37TCPヘッダのデータオフセットが0xeなので、オプション領域を含むTCPヘッダの長さは、56バイトです。最後の16バイトがMP_JOINの領域です。IDが3、切り詰められたHMACが”0x2ccfecb525bed145′′、ランダム値が”0x4bb9fb37′′であることが分かります。ACK)切り詰められていないHMACが送信されます。このパケットを送ったSocketはPRE_ESTABLISHED状態となり、第4のACKを待ちます。第4のACKが届くとESTABLISHED状態になりますが、それまではこのSocketではデータは送信されません。30f1TCPヘッダのデータオフセットが0xeなので、オプション領域を含むTCPヘッダの長さは、56バイトです。最後の24バイトがMP_JOINの領域です。切り詰められていないHMACは、”0xf2e30d4fb4e4f4cc4562c61e59d9ce7a544c30f1′′であることが分かります。まとめ前回と今回で、RFCで定義されているパケットフォーマットと実際のMPTCPのオプションが付いたパケットを見比べてきました。他のTCPのオプションも含まれる状態での40バイトという長さの制約の中で、どうにかして新しい機能を実現させようとする強い意気込みが見て取れます。Switchなどの機器に変更を加えることなく、新しい機能を追加しようという試みは非常に素晴らしいと思います。対向ノードがMPTCPに対応していない場合は通常のTCPで通信できますので、ちょっとでも興味のある方は是非是非MPTCPを試してみてください。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。