Bluetooth Mesh 仕様 – 3. Mesh networking(その2)

Bluetooth Mesh

はじめに

Bluetooth Meshの仕様について、Bluetooth SIGで公開されている「Mesh Profile Specification 1.0.1」に基づき、学習を兼ねて記載して行こうと思っています。本文章では、3章の「メッシュ ネットワーキング」の次の節について記載いたします。

  • 3.5 下位トランスポートレイヤー

記載内容に誤り等がありましたら、ご連絡いただければ幸いです。

3.5 下位トランスポートレイヤー

下位トランスポートレイヤーは、上位トランスポートレイヤーから上位トランスポート PDU を取得し、それらのメッセージをピアの下位トランスポートレイヤーに送信します。 これらの上位トランスポート PDU は、単一の下位トランスポート PDU に収まる場合もあれば、複数の下位トランスポート PDU にセグメント化される場合もあります。 メッセージを受信すると、下位トランスポートレイヤーは下位トランスポート PDU を処理し、場合によっては複数の PDU から上位トランスポート PDU を再アセンブルし、再構築が完了すると、これらを上位トランスポートレイヤーに送信します。

3.5.1 エンディアン

セクション 3.1.1.1 で説明されているように、このレイヤーのすべてのマルチオクテット数値は「ビッグエンディアン」で送信されるものとします。

3.5.2 下位トランスポート PDU

下位トランスポート PDU は、上位トランスポート PDU を別のノードに送信するために使用されます。

下位トランスポート PDU の最初のオクテットの最上位ビットは SEG フィールドです。これは、下位トランスポート PDU がセグメント化されたメッセージとしてフォーマットされているかセグメント化されていないメッセージとしてフォーマットされているかを判別するために使用されます。

以下の表3.9で定義されているように、ネットワーク PDU の CTL フィールドと下位トランスポート PDU の SEG フィールドの値に応じて、4つの形式が使用されます。

CTL フィールドSEG フィールド下位トランスポート PDU
フォーマット
00非セグメント化アクセスメッセージ
01セグメント化アクセスメッセージ
10非セグメント化制御メッセージ
11セグメント化制御メッセージ
表3.9:下位トランスポートPDUフォーマットタイプ
3.5.2.1 非セグメント化アクセスメッセージ

非セグメント化アクセスメッセージは、単一のネットワーク PDU に適合する上位トランスポートアクセス PDU を転送するために使用されます。 図3.9は、セグメント化されていないアクセスメッセージの図を示し、表3.10は、このメッセージのフィールドを示しています。

図3.9:セグメント化されていないアクセスメッセージ
フィールドサイズ
(ビット)
説明
SEG10 = 非セグメント化メッセー
AKF1アプリケーションキーフラグ
AID6アプリケーションキー識別子
上位トランスポート
アクセス PDU
40 to 120上位トランスポートアクセスPDU
表3.10:セグメント化されていないアクセスメッセージの形式

SEGフィールドは0に設定されます。

AKF および AID フィールドは、アクセスペイロードの暗号化に使用されるアプリケーションキーまたはデバイスキーに従って、上位トランスポートレイヤーによって設定される必要があります(セクション3.6.4.1を参照)。

上位トランスポートアクセス PDU は、上位トランスポートレイヤーによって提供されます。

このメッセージには SZMIC フィールドがありません。 上位トランスポートレイヤーのTransMIC は、SZMIC フィールドの値が0であるかのように、32ビット値でなければなりません。

3.5.2.2 セグメント化アクセスメッセージ

セグメント化されたアクセスメッセージは、上位トランスポートアクセス PDU のセグメントを転送するために使用されます。 図3.10は、セグメント化されたアクセスメッセージの図を示し、表3.11は、このメッセージのフィールドを示しています。

図3.10:セグメント化されたアクセスメッセージ
フィールドサイズ
(ビット)
説明
SEG11 = セグメント化メッセージ
AKF1アプリケーションキーフラグ
AID6アプリケーション識別子
SZMIC1TransMIC のサイズ
SeqZero13SeqAuth の最下位ビット
SegO5セグメントオフセット番号
SegN5最後のセグメント番号
Segment m8 to 96上位トランスポートアクセスPDUの
Segment m
表3.11:セグメント化されたアクセスメッセージ形式

SEG フィールドは1に設定されます。

SZMIC フィールドは、上位トランスポートアクセス PDU の TransMIC のサイズを示します。 SZMIC フィールドが0に設定されている場合、TransMIC は32ビット値です。 SZMIC フィールドが1に設定されている場合、TransMIC は64ビット値です。

AKF および AID フィールドは、アクセスペイロードの暗号化に使用されるアプリケーションキーまたはデバイスキーに従って、上位トランスポートレイヤーによって設定される必要があります(セクション3.6.4.1を参照)。

SeqZero フィールドは、上位のトランスポートレイヤーによって設定されます。

SegO フィールドは、この上位トランスポート PDU のSegment mのセグメント番号(ゼロベース)に設定されます。

SegN フィールドは、この上位トランスポート PDU の最後のセグメント番号(ゼロベース)に設定されます。

セグメント番号 m の Segment m フィールドは、上位トランスポートアクセス PDU からのオクテットのサブセットに設定されます。 最後のセグメントを除くすべてのセグメントについて、Segment m はオクテット 12m から 12m+11 でなければなりません。 最後のセグメントでは、Segment m はメッセージの終わりまで 12*m でなければなりません。

同じ上位トランスポートアクセス PDU のすべてのセグメント化されたアクセスメッセージは、AKF、AID、SZMIC、SeqZero、および SegN に対して同じ値を持つ必要があります。

3.5.2.3 セグメント化されていない制御メッセージ

セグメント化されていない制御メッセージは、セグメント確認応答メッセージまたはトランスポート制御メッセージのいずれかを転送するために使用されます。 図3.11は、セグメント化されていない制御メッセージの図を示し、表3.12は、このメッセージのフィールドを示しています。

図3.11:セグメント化されていない制御メッセージ
フィールドサイズ
(ビット)
説明
SEG10 = セグメント化されていないメッセージ
Opcode70x00 = セグメント確認応答
0x01 to 0x7F = トランスポート制御メッセージの
オペコード
Parameters0 to 88トランスポート制御メッセージのパラメータ
表3.12:セグメント化されていない制御メッセージ形式

SEG フィールドは0に設定されます。

Opcode フィールドは、0x00(セグメント確認応答メッセージの場合)または適切なオペコード(表3.39を参照)のいずれかに設定する必要があります。

Parameters フィールドは、オペコードの要件に従って設定されます。

3.5.2.3.1 セグメント確認応答メッセージ

セグメント確認応答メッセージは、ピアの下位トランスポートレイヤーによって受信されたセグメントを確認するために、下位トランスポートレイヤーによって使用されます。 セグメント確認応答メッセージを図3.12に示し、表3.13で定義します。

図3.12:セグメント確認応答メッセージ
フィールドサイズ
(ビット)
説明
SEG10 = セグメント化されていないメッセージ
Opcode70x00 = セグメント確認応答メッセージ
OBO1低電力ノードを代表するフレンド
SeqZero13上位トランスポート PDU の
SeqZero
RFU2将来の使用のために予約済み
BlockAck32セグメントのブロック確認応答
表3.13:セグメント確認メッセージの形式

SEG フィールドは0に設定されます。

トランスポート制御メッセージの Opcode フィールドは0x00に設定されます。

OBO フィールドは、受信したメッセージによって直接アドレス指定されるノードによって0に設定され、低電力ノードに代わってこのメッセージを確認するフレンドノードによって1に設定されます。

SeqZero フィールドは、確認応答される上位トランスポートレイヤーメッセージのSeqZeroに設定されます。

BlockAck フィールドは、受信したセグメントを示すように設定する必要があります。 最下位ビットのビット0は、セグメント0を表します。 最上位ビットのビット31はセグメント31を表します。ビットnが1に設定されている場合、セグメントnは確認応答されています。 ビットnが0に設定されている場合、セグメントnは確認応答されていません。 SegNより大きいセグメントのビットはすべて0に設定され、受信時に無視されます。

受信したセグメントがTTLを0に設定して送信された場合、対応するセグメント確認応答メッセージをTTLを0に設定して送信することをお勧めします。

3.5.2.4 セグメント化された制御メッセージ

セグメント化された制御メッセージは、トランスポート制御メッセージが単一のネットワーク PDU に収まらない場合に、トランスポート制御メッセージの一部を転送するために使用されます。 図3.13は、セグメント化された制御メッセージの図を示し、表3.14は、このメッセージのフィールドを示しています。

図3.13:セグメント化された制御メッセージ
フィールドサイズ
(ビット)
説明
SEG11 = セグメント化されたメッセージ
Opcode70x00 = 予約済み
0x01 to 0x7F = トランスポート制御メッセージの
オペコード
RFU1将来の使用のために予約済み
SeqZero13SeqAuth の最下位ビット
SegO5セグメントオフセット番号
SegN5最後のセグメント番号
Segment m8 to 64上位トランスポート制御 PDU の
Segment m
表3.14:セグメント化された制御メッセージ形式

SEG フィールドは1に設定されます。

オペコードフィールドは、パラメータフィールドのフォーマットを示すために上位トランスポートレイヤーによって設定されます。 値0x00は予約済みであり、受信時に送信および無視されないものとします。

SeqZero フィールドは、上位トランスポートレイヤーによって設定されます。

SegO フィールドは、このメッセージに含まれる上位トランスポート PDU のセグメント番号(ゼロベース)に設定されます。

SegN フィールドは、この上位トランスポート PDU の最後のセグメント番号(ゼロベース)に設定されます。

Segment m フィールドは、上位トランスポート制御 PDU からのオクテットのサブセットに設定されます。 Segment m は、メッセージの終わりまで 8m である最後のセグメントを除いて、8m から 8*m+7 のオクテットでなければなりません。

同じ上位トランスポート制御 PDU のすべてのセグメント化された制御メッセージは、オペコード、SeqZero、およびSegNに対して同じ値を持つ必要があります。

3.5.3 セグメンテーションと再組み立て

15オクテットより大きい上位トランスポート PDU を送信するために、下位トランスポートレイヤーは上位トランスポート PDU をセグメント化して再構築します。 これらのセグメントは、ブロック確認応答スキームを使用してピアの下位トランスポートレイヤーに配信され、下位トランスポートレイヤーによって送信される必要のあるメッセージの数を最小限に抑えます。

図3.14:2セグメントPDUのセグメンテーションと再組み立ての例

図3.14は、送信される上位トランスポートアクセス PDU を示しています。このオペコードは、1オクテットのオペコード、NetKeyIndexAndAppKeyIndex フィールド用に3オクテット、AppKey 用に16オクテットです。 これは、アプリケーションキーで暗号化および認証された場合、上位トランスポート PDU が24オクテットであることを意味します。 これは、下位トランスポートレイヤーによってセグメント0とセグメント1の2つのセグメントにセグメント化されます。各セグメントには、セグメント番号を識別するヘッダーがあり、ネットワーク層に渡され、そこで完全なネットワーク PDU が計算されます。 次に、ネットワーク層は、そのネットワーク PDU のシーケンス番号を使用してネットワークPDUを暗号化し、それらのメッセージを難読化して、NID(およびIVインデックス)オクテットのみがクリアテキストで表示されるようにします。 したがって、シングルアクセスメッセージは、2つのネットワーク PDU を使用して安全に配信できます。

上位トランスポートアクセス PDU と上位トランスポートコントロール PDU のセグメンテーションのプロセスは同一であり、以下の説明では、明示的に記載されている場合を除き、これら2つの PDU タイプは同一であると見なします。
注:セグメントサイズは、上位トランスポートアクセス PDU と上位トランスポート制御 PDU で異なります。

3.5.3.1 セグメンテーション

下位トランスポートレイヤーは、上位トランスポート PDU を1つ以上の下位トランスポート PDU にセグメント化します。下位トランスポートレイヤーは、単一の上位トランスポート PDU のセグメント化されたアクセスメッセージまたはセグメント化された制御メッセージのみを一度に同じ宛先に送信する必要があります。下位トランスポートレイヤーは、確認できる最後の上位トランスポート PDU のすべてのセグメントが確認されるか、メッセージがキャンセルされた場合にのみ、同じ宛先の別の上位トランスポート PDU にセグメント化されたメッセージを送信する必要があります。

上位トランスポート PDU がセグメント化されていないメッセージフォーマットを使用して単一の下位トランスポート PDU に収まる場合、下位トランスポートレイヤーはセグメント化されていないメッセージを使用してこの上位トランスポート PDU を送信する必要があります。 上位トランスポート PDU がセグメント化されたメッセージフォーマットを使用して単一の下位トランスポート PDU に収まる場合、下位トランスポート層は単一のセグメント化されたメッセージを使用してこの上位トランスポート PDU を送信できます。 それ以外の場合は、2つ以上のセグメント化されたメッセージが使用されます。

セグメント化されたメッセージは下位トランスポートレイヤーで確認応答されますが、セグメント化されていないメッセージは確認応答されません。セグメント化されていないメッセージよりもセグメント化されたメッセージを使用して、上位トランスポート PDU の配信をより効率的に送信できる場合は、単一セグメントのセグメント化されたメッセージを使用する必要があります。

たとえば、マルチセグメントメッセージが受信され、処理されたことをアクセスレイヤで確認応答するためにメッセージが送信され、このメッセージが失われた場合、完全なマルチセグメントメッセージを再度送信する必要があります。 これに対して、アプリケーション確認応答メッセージが単一のセグメント化されたアクセスメッセージで送信される場合、アプリケーション確認応答メッセージは、おそらくセグメントの複数の送信を使用して、下位トランスポートレイヤーで配信されるため、再度、マルチセグメントを再送信する必要がなくなります。

上位トランスポートアクセス PDU の各セグメントは、最後のセグメントを除いて12オクテットの長さである必要があります。
上位トランスポート制御 PDU の各セグメントは、最後のセグメントを除いて8オクテットの長さである必要があります。

たとえば、32ビット TransMIC を使用する場合、上位トランスポートアクセス PDU の長さが42オクテットの場合、最初の12オクテット(オクテット0〜11)はセグメント0にあります。 12オクテットの2番目のセットであるオクテット12から23は、セグメント1にあります。 12オクテットの3番目のセットであるオクテット24から35は、セグメント2にあります。 残りの6オクテット、オクテット36から41は、セグメント3にあります。

たとえば、上位トランスポート制御 PDU の長さが42オクテットの場合、最初の8オクテット(オクテット0〜7)はセグメント0にあります。 8オクテットの2番目のセットであるオクテット8〜15は、セグメント1にあります。 8オクテットの3番目のセットであるオクテット16から23は、セグメント2にあります。 8オクテットの4番目のセットであるオクテット24から31は、セグメント3にあります。 8オクテットの5番目のセットであるオクテット32から39は、セグメント4にあります。 残りの2つのオクテット、オクテット40〜41は、セグメント5にあります。

上位トランスポートアクセス PDU の各セグメントは、SegO フィールドを使用して識別されます。 セグメントは、上位トランスポートアクセス PDU の暗号化と認証に使用される SeqAuth 値を使用して相互にリンクされます。 上位トランスポートアクセス PDU の各下位トランスポートPDUは、上位トランスポートアクセスPDUの暗号化と認証に使用される SeqAuth 値と同じ IV インデックスを持つ必要があります。

上位トランスポート制御 PDU の各セグメントは、SegO フィールドを使用して識別されます。 セグメントは、上位トランスポート制御 PDU の最初のセグメントを送信するために使用される SeqAuth 値を使用して相互にリンクされます。 上位トランスポート制御 PDU の各下位トランスポート PDU は、上位トランスポート制御 PDU を識別するために使用される SeqAuth 値と同じ IV インデックスを持つ必要があります。

SeqAuth は、最初のセグメントのIVインデックスとシーケンス番号(SEQ)で構成されているため、56ビット値です。ここで、IV インデックスは最上位オクテットであり、シーケンス番号は最下位オクテットです。 値の最下位13ビット( SeqZero と呼ばれる)のみが、セグメント化されたメッセージとセグメント確認応答メッセージに含まれます。完全なセグメント化されたアクセスメッセージを再アセンブルすると、SeqZero が同じ IV インデックスを含み使用している SEQ-8191 と SEQ の間にある最大の SeqAuth 値を決定するこで、任意のセグメントの IV インデックス、SeqZero、および SEQ から SeqAuth 値を導出できます。たとえば、メッセージの受信した SEQ が0x647262、IV インデックスが0x58437AF2、受信した SeqZero 値が0x1849の場合、SeqAuth 値は0x58437AF2645849です。 メッセージの受信した SEQ が0x647262で、受信した SeqZero 値が0x1263の場合、SeqAuth 値は0x58437AF2645263です。

SeqZero のサイズには制限があるため、SEQ が SeqAuth より8192大きくなると、セグメント化されたメッセージを送信できなくなります。 SEQ が SeqAuth より8192超える時間までにセグメント化されたメッセージが確認応答されなかった場合、上位トランスポート PDU の配信はキャンセルされます。

メッセージの各セグメントには、そのセグメントオフセット番号と最後のセグメント番号の両方が含まれます。
たとえば、上記の42オクテットの上位トランスポート制御 PDU では、セグメントには0、1、2、3、4、および5の番号が付けられ、最後のセグメント番号は5です。セグメント番号(SegO)と最後のセグメント番号(SegN)の両方はメッセージに含まれているため、受信者はメッセージの任意のセグメントを受信した後、常に上位トランスポート PDU のサイズ(最も近い8オクテットまで)を決定できます。

3.5.3.2 再組み立て

再組み立ては、受信デバイスで実行されます。 低電力ノード機能が使用されている場合、メッセージの確認応答はフレンドノードによって実行され、低電力ノードはセグメント確認応答メッセージを送信しません。

セグメント化されたメッセージを受信すると、SeqAuth をチェックして、上位トランスポート PDU が受信されているか、あるいは以前に受信されたかを判断します。セグメント化されたメッセージがまだ受信されていない場合、最後のセグメント番号(SegN)によって決定されるように受信デバイスは十分なメモリを割り当てます。受信時に上位トランスポート PDU のセグメントを保存し、受信したセグメントを追跡します。そして、このメッセージが受信されていると見なされます。

低電力ノード機能が使用されていない場合、およびメッセージがユニキャストアドレス宛てである場合、この時点でノードがこの上位トランスポート PDU を受信できない場合、例えば、ノードがビジーである、あるいは、再アセンブルするのに十分なリソースが不足しているなどの理由で、ノードは、BlockAck 値を0x00000000に設定することにより、この上位トランスポート PDU を受信できないことを送信元ノードに通知します。

セグメント化されたメッセージが受信中の場合、セグメント番号(SegO)を使用して、このセグメント化されたメッセージの上位トランスポート PDU オクテットをメッセージ用に以前に割り当てられたメモリのどこに配置するかを決定します。 受信者は、BlockAck 値を更新して、セグメントの正常な配信を記録する必要があります。

特定の SeqZero の上位トランスポート PDU のすべてのセグメントが受信されると、上位トランスポートレイヤーは上位トランスポート PDU をチェックする必要があります(セクション3.6.4.2を参照)。

3.5.3.3 セグメンテーション動作

上位トランスポート PDU がセグメント化されると、下位トランスポートレイヤーはそのメッセージの各セグメントの最初の下位トランスポート PDU を送信します。 メッセージがユニキャストアドレス宛てである場合、下位トランスポートレイヤーは、そのノードから、またはそのノードに代わってフレンドノードからのセグメント確認応答メッセージを期待します。 メッセージが仮想アドレスまたはグループアドレスにアドレス指定されている場合、セグメント確認応答メッセージはそれらのデバイスによって送信されません。

セグメント化された上位トランスポート PDU の下位トランスポート PDU がグループアドレスまたは仮想アドレスに送信されている場合、下位トランスポートレイヤーはセグメント化された上位トランスポート PDU のすべての下位トランスポート PDU を送信する必要があります。すべての下位トランスポート PDU を複数回送信して、繰り返しの間に小さなランダムな遅延を導入することをお勧めします。

注:グループまたは仮想アドレスに送信された上位トランスポート PDU は受信者によって確認応答されないため、メッセージ配信ステータスは不明であり、確認応答されていないと見なす必要があります。上記で推奨されている動作は、セグメント化された上位トランスポート PDU の配信が成功する確率を大幅に高めるように設計されています。

下位トランスポート PDU がユニキャストアドレスに送信される場合、次の要件が適用されます。下位トランスポート PDU が送信されると、セグメント送信タイマーが開始され、その時間内にセグメント確認メッセージが受信されると予想されます。 このタイマーは、最低 200+50*TTL ミリ秒に設定する必要があります。

セグメント確認応答メッセージの OBO フィールドが0に設定され、DST フィールドがこの要素のユニキャストアドレスに設定され、SeqZero フィールドがセグメント化されたメッセージの SeqZero に設定され、SRC フィールドが宛先に設定されている場合、セグメント化されたメッセージであるセグメント確認応答メッセージは、セグメント化されたメッセージの有効な確認応答です。

セグメント確認応答メッセージの OBO フィールドが1に設定され、DST フィールドがこの要素のユニキャストアドレスに設定され、SeqZero フィールドがセグメント化されたメッセージの SeqZero に設定されている場合、セグメント確認応答メッセージはセグメント化されたメッセージの有効な確認応答です。特定の SeqAuth について、最初に受信した SRC アドレスからのセグメント確認応答メッセージのみが有効と見なされます。

注:OBO フィールドが1に設定されたセグメント確認応答メッセージの受信は、セグメント化されたメッセージが最終宛先に配信されたことを意味するのではなく、その低電力ノードのフレンドに配信されたことを意味します。メッセージはフレンドキューに保存されますが、その低電力ノードで他のメッセージを受信した場合、またはフレンドシップが終了した場合は、メッセージを破棄できます。

セグメント化されたメッセージの有効な確認応答であるセグメント確認応答メッセージが受信された場合、下位トランスポートレイヤーはセグメント送信タイマーをリセットし、未確認の下位トランスポート PDU をすべて再送信する必要があります。 上位トランスポート PDU のすべての下位トランスポート PDU を確認するセグメント確認メッセージを受信すると、上位トランスポート PDU が完了します。 BlockAck フィールドが0x00000000に設定されたセグメント確認応答メッセージが受信された場合、上位トランスポート PDU はただちにキャンセルされ、上位レイヤーには上位トランスポート PDU がキャンセルされたことが通知されます。

セグメント送信タイマーが期限切れになり、セグメント化されたメッセージの有効な確認応答が受信されない場合、下位トランスポートレイヤーはすべての未確認の下位トランスポート PDU を再送信します。
注:各下位トランスポート PDU を再送信すると、セグメント送信タイマーがリセットされ、再開されます。

上位トランスポート PDU の各下位トランスポート PDU は、事前に確認されない限り、少なくとも2回送信される必要があります。 すべての下位トランスポート PDU が確認応答される前に、下位トランスポートレイヤーが下位トランスポート PDU の再送信を停止すると、上位トランスポート PDU はキャンセルされます。

3.5.3.4 再組み立ての動作

このセクションは、低電力機能が使用されていない場合にのみ適用されます。
下位トランスポートレイヤーには、一意の送信元アドレスからの完結していないセグメント化されたメッセージごとに、シーケンス認証値、ブロック確認応答値、および完了していないタイマーがあります。 完結していないセグメント化されたメッセージは、一部のセグメントが欠落していて、完了していないタイマーが期限切れになっていないマルチセグメントメッセージです。完了していないタイマーは、同じトランザクションの一意のセグメント間で下位のトランスポート層が待機する最大時間を定義します。

シーケンス認証値より大きい SeqAuth 値のマルチセグメントメッセージのセグメントを受信する下位トランスポートレイヤーは、その完結していないセグメント化されたメッセージの完了していないタイマーを開始するものとします。 完了していないタイマーは最低10秒に設定する必要があります。

下位トランスポートレイヤーは、シーケンス認証値よりも小さい SeqAuth 値を持つメッセージのセグメントを受信した場合、そのセグメントを無視します。下位トランスポートレイヤーが新しいメッセージのセグメントを受信すると、そのセグメントの SeqAuth 値を新しいシーケンス認証値として保存します。

注:シーケンス認証値には論理的に IV インデックスが含まれるため、以前の IV インデックスを使用して下位トランスポート PDU を受信した場合、これはシーケンス認証値よりも小さい SeqAuth 値になります。

下位トランスポートレイヤーがマルチセグメントメッセージのセグメントを受信したが、このメッセージを受け入れるために現在ビジーであるかリソースが不足しているため、現時点でこのマルチセグメントメッセージを受け入れることができない場合、およびメッセージがユニキャストアドレス宛てである場合、下位トランスポートレイヤーは、BlockAck フィールドが0x00000000に設定されたセグメント確認応答メッセージで応答する必要があります。

宛先がユニキャストアドレスであるシーケンス認証値より大きい SeqAuth 値のマルチセグメントメッセージのセグメントを受信する下位トランスポートレイヤーは、下位トランスポートレイヤーが送信するまでの時間を定義する確認応答タイマーを開始する必要があります。 確認応答タイマーは、最低 150+50*TTL ミリ秒に設定する必要があります。

下位トランスポートレイヤーは、確認応答タイマーが非アクティブのときにシーケンス認証値の別のセグメントを受信すると、確認応答タイマーを再開します。

注:確認応答タイマーがアクティブなときに、下位トランスポートレイヤーがシーケンス認証値のセグメントを受信した場合、確認応答タイマーは再開されません。

完了していないタイマーがアクティブなときに、下位トランスポートレイヤーがシーケンス認証用のセグメントを受信した場合、完了していないタイマーが再起動されます。
下位トランスポートレイヤーは、受信した各セグメントをブロック確認応答値にマークします。この値は、後で送信元ノードに送信できます。

セグメント化されたメッセージのすべてのセグメントが受信されると、下位トランスポートレイヤーは、BlockAck フィールドがシーケンス認証値のブロック確認応答値に設定されたセグメント確認応答メッセージを送信する必要があります。完了していないタイマーと確認応答タイマーをキャンセルし、再構成されたメッセージを上位トランスポートレイヤーに送信します。 セグメントがセグメント化されたアクセスメッセージであった場合、再構成されたメッセージはセクション3.6.4.2で定義されているように処理されるものとします。

セグメントがセグメント化された制御メッセージであった場合、再構成されたメッセージはセクション3.6.5で定義されているように処理されるものとします。 下位トランスポートレイヤーは、最低10秒のタイマーが経過した後、送信者の送信元アドレスに保存されているシーケンス認証値とブロック認証値を破棄する必要があります。

確認応答タイマーが時間切れになると、下位トランスポートレイヤーは、BlockAck フィールドがシーケンス認証値のブロック確認応答値に設定されたセグメント確認応答メッセージを送信する必要があります。

完了していないタイマーが時間切れになると、下位トランスポートレイヤーは受信中のメッセージが失敗したと見なし、確認タイマーをキャンセルします。シーケンス認証値が下位トランスポートレイヤーによって格納されているキャンセルされたメッセージのセグメントはすべて無視されます。下位トランスポートは、最低10秒のタイマーが経過した後、その送信元アドレスに保存されているシーケンス認証値とブロック認証値を破棄する必要があります。

下位トランスポートレイヤーがシーケンス認証値の別のセグメントを受信し、メッセージがすでに完全に受信されている場合(そして、新しいシーケンス認証値を持つセグメントが受信されていない場合)、BlockAck フィールドを使用してセグメント確認応答メッセージをすぐに送信します。その SeqAuth のブロック確認応答値に設定します。

デバイスが低電力ノードのフレンドノードとして機能している場合、デバイスは低電力ノード宛てのセグメント化されたメッセージを再構築し、説明されているように機能します。ただし、セグメント確認応答メッセージで OBO フィールドを1に設定する必要があります。 それ以外の場合、OBO フィールドは0に設定されます。

注:グループまたは仮想アドレスにアドレス指定されたセグメント化されたメッセージを受信する下位トランスポートレイヤーは、確認応答タイマーを開始せず、セグメント確認応答メッセージを送信しません。

3.5.3.5 低電力機能の再組み立て動作

このセクションは、低電力機能が使用されている場合にのみ適用されます。

下位トランスポートレイヤーには、各ソースデバイスのその SeqAuth のシーケンス認証値とブロック確認応答値があります。
下位トランスポートレイヤーは、シーケンス認証値よりも小さい SeqAuth 値を持つメッセージのセグメントを受信した場合、そのセグメントを無視します。下位トランスポートレイヤーが新しいメッセージのセグメントを受信すると、そのセグメントの SeqAuth 値を新しいシーケンス認証値として保存します。

フレンドシップが終了した場合(セクション3.6.6.4.2を参照)、以前に部分的に受信したマルチセグメントメッセージはキャンセルされます。
注:シーケンス認証値には論理的に IV インデックスが含まれるため、以前のIVインデックスを使用して下位トランスポート PDU を受信した場合、これはシーケンス認証値よりも小さい SeqAuth 値になります。

シーケンス認証値より大きい SeqAuth 値のマルチセグメントメッセージのセグメントを受信する下位トランスポートレイヤーは、新しいメッセージの再アセンブルを開始し、以前に部分的に受信したメッセージをキャンセルします。

下位トランスポートレイヤーは、受信した各セグメントをブロック確認応答値にマークします。セグメント化されたメッセージのすべてのセグメントが受信されると、下位トランスポートレイヤーは再構成されたメッセージを上位トランスポートレイヤーに送信します。 セグメントがセグメント化されたアクセスメッセージであった場合、再構成されたメッセージはセクション3.6.4.2で定義されているように処理されるものとします。 セグメントがセグメント化された制御メッセージであった場合、再構成されたメッセージはセクション3.6.5で定義されているように処理されるものとします。

3.5.4 下位トランスポートレイヤーの動作

3.5.4.1 下位トランスポートPDUの送信

下位トランスポート PDU はネットワーク層に配信されます。

3.5.4.2 下位トランスポートPDUの受信

下位トランスポート PDU がセグメント化されたメッセージまたはセグメント確認応答メッセージである場合、セクション3.5.3.4で定義されているように処理されるものとします。
下位トランスポート PDU がセグメント化されていないメッセージタイプである場合、セクション3.6.4.2で定義されているように処理されるものとします。
下位トランスポート PDU がトランスポート制御 PDU である場合、3.6.5で定義されているオペコードフィールドの値に従って処理されるものとします。

3.5.5 フレンドキュー

フレンドノードには、フレンドの低電力ノードごとにフレンドキューがあります。 フレンドキューは、低電力ノードの下位トランスポート PDU を格納します。 メッセージがフレンドキューにあるため、下位トランスポート PDU のフィールドは変更されません。 CTL、TTL、SEQ、SRC、および DST フィールドは、関連する下位トランスポート PDU とともに保存されます。

フレンドノードがフレンドの低電力ノード宛てのメッセージ(つまり、メッセージの宛先が低電力ノードの要素のユニキャストアドレスあるいはフレンドサブスクリプションリストに存在する)を受信し、TTL フィールドが2以上の値場合、TTL フィールド値は1ずつデクリメントされ、メッセージはフレンドキューに保存されます。

メッセージがセグメント化アクセスメッセージまたはセグメント化制御メッセージである場合、メッセージは、完全な上位トランスポート PDU が正常に再構築され、フレンドノードがすべてのセグメントの受信を確認した後にのみフレンドキューに格納されます。

フレンドキューがいっぱいで、フレンド更新メッセージではない新しいメッセージを保存する必要がある場合、フレンド更新メッセージ以外の最も古いエントリを破棄して、新しいメッセージ用のスペースを確保します。

注:実装では、新しいメッセージをフレンドキューに収めるために、複数のメッセージを破棄しなければならない場合があります。

保存されているメッセージがセグメント確認応答メッセージであり、フレンドキューに、送信元アドレスと宛先アドレスが同じで、SeqAuth 値が同じで、IV インデックスまたはシーケンス番号が小さい別のセグメント確認応答メッセージが含まれている場合、古いセグメント確認応答 メッセージは破棄されます。

フレンドノードは、有効なセキュアネットワークビーコンを受信したり、キー更新フェーズの状態を変更したりするなどして、セキュリティ更新を認識すると、フレンド更新メッセージをフレンドキューに追加します。

低電力ノードがフレンドキューからのメッセージを要求すると、最も古いエントリが送信されます。 そのメッセージが低電力ノードによって確認されると、そのエントリは破棄されます。

フレンドポーリングを使用して低電力ノードからのメッセージについてフレンドノードがポーリングされ、そのノードのフレンドキューが空の場合、
フレンドノードは新しいフレンド更新メッセージを生成し、応答を送信する前にフレンドキューに追加する必要がある。
これにより、このフレンド更新メッセージをフレンドポーリングメッセージの応答して送信することができる。

タイトルとURLをコピーしました