コンテンツにスキップ

SBI Communication Model A〜D / SCP — DiscoveryとRoutingは別の仕事

難易度: 上級(マニアック) / 想定学習時間: 40分 / 前提: NF Set / Binding Indication / PCF冗長, N7 SBI解析, SCP, NRF / 主役: SMF, SCP, NRF, PCF / 主Interface: SBI(N7, Nnrf)

学習目標

この章を読み終えると、次のことができるようになります。

  • SBIでNFを呼ぶときの仕事を Discovery(候補を探す)/ Selection(1つに決める)/ Routing(届ける経路) に分けて説明できる
  • 4つの Communication Model(A / B / C / D) を「Direct / Indirect」と「Discoveryを誰が行うか」の2軸で説明できる(TS 23.501 Annex E)
  • Model C と Model D を HTTP/2 ヘッダ(3gpp-sbi-target-apiroot、3gpp-sbi-discovery-*、3gpp-sbi-producer-id)と NRFへの通信経路 の組み合わせで見分けられる
  • SMF → PCF の SM Policy Association 作成 を Model D で行うときの Call Flow を、ヘッダ単位で追える
  • SCP経由の失敗を 「SCPが返したエラー」か「Producerが返したエラー」か に切り分けられる

前提知識

この章の焦点(Level ∞ マニアック)

SCP のページでは、Model A〜D を「経路(Direct / Indirect)」×「発見の主体」の2軸で紹介しています。この章では、その分類を パケット上でどう判定するか、SCPが入ると失敗の見え方がどう変わるか を、HTTP/2ヘッダと Call Flow のレベルで掘り下げます。


Why — なぜ「Discovery」と「Routing」を分けて考えるのか

SMFがPCFへ SM Policy Association を作りたいとき、少なくとも次の判断が必要です。

[Discovery]  「Npcf_SMPolicyControl を提供できる PCF はどれ?」 → 候補リスト
      ↓
[Selection]  「今回は PCF-B を使おう」                            → 1つに決定
      ↓
[Routing]    「SMF → PCF-B へ直接? それとも SCP 経由?」          → 届ける経路

SBAの初期(Rel-15)は、Consumer(SMF)自身が NRF に問い合わせ(Discovery)、自分で選び(Selection)、直接送る(Routing)形が基本でした。Rel-16 で SCP(Service Communication Proxy) が導入され、Routing を SCP に任せる Indirect Communication と、さらに Discovery / Selection まで SCP に任せる Delegated Discovery が加わりました(TS 23.501 §6.2.19 / Annex E)。

その結果、「SCPを経由している」という事実だけでは、誰が候補を探し、誰が宛先を決めたのか が分からなくなりました。障害解析で「SCPが悪いのか、NRFのProfileが悪いのか、SMFの設定が悪いのか、PCFが拒否したのか」を切り分けるには、この3つの仕事を分けて見る必要があります。

例え話: 社外の専門家に仕事を頼む場面を考えます。Model A は「名刺ファイルに書いてある番号へ直接電話」、Model B は「電話帳(NRF)で調べて直接電話」、Model C は「電話帳で相手を決めてから、代表交換(SCP)に『○○さんにつないで』と頼む」、Model D は「代表交換に『こういう条件の専門家につないで』とだけ頼み、探すのも選ぶのも交換手に任せる」です。交換手経由(C と D)でも、相手を決めたのが自分か交換手か で、トラブル時に確認すべき場所が変わります。


What — 4つの Communication Model

全体像(TS 23.501 Annex E)

TS 23.501 の informative Annex E「Communication models for NF/NF services interaction」 は、NF/NF Service 間の相互作用を4つのモデルに整理しています(比較表は Table E.1-1。表番号は要確認)。Direct / Indirect Communication そのものの規定は TS 23.501 §6.3.1.0 と §7.1.1 にあります(要確認)。

Model 経路 Discovery の主体 Selection の主体 SCP
A Direct なし(ローカル設定で宛先既知) Consumer(設定から) なし
B Direct Consumer が NRF に照会 Consumer なし
C Indirect Consumer が NRF に照会 Consumer が NF Instance または NF Set を選択。Set を選んだ場合は SCP が Instance を選択 あり(Routing、条件により Instance 選択)
D Indirect SCP に委譲(Delegated Discovery) SCP あり(Discovery + Selection + Routing)
flowchart LR
    subgraph DIRECT["Direct Communication"]
        A["Model A
ローカル設定
NRFなし"] B["Model B
Consumer が
NRF Discovery"] end subgraph INDIRECT["Indirect Communication(SCP経由)"] C["Model C
Consumer が NRF Discovery
SCP は Routing"] D["Model D
Discovery と Selection を
SCP に委譲"] end A -->|"Discovery を足す"| B B -->|"Routing を SCP へ"| C C -->|"Discovery も SCP へ"| D

「Model C では SCP は何も選ばない」は誤り

Model C で Consumer が NF Set(またはNF Service Set) までしか選ばなかった場合、Set 内の Instance を選ぶのは SCP です(TS 23.501 Annex E、要確認)。また Model C でも、SCP が選択用パラメータ(負荷・Locality 等)を得るために NRF とやり取りし得る、とされています(同 Annex、要確認)。それでも Model C の Discovery の主体は Consumer であり、SCP のページで「Model C では SCP は Discovery をしない」と整理しているのはこの意味です。Discovery(候補探し)と Selection(Set内の1台選び)は別の仕事 です。

Model A — Direct、NRFなし

SMF ──────────────────────────► PCF-A
      宛先 apiRoot はローカル設定
  • SMF は PCF-A の FQDN / IP をローカル設定で持っています。NRF も SCP も登場しません。
  • 小規模構成やラボで多い形です。PCF-A が落ちたときの代替先も設定で持つ必要があります。

Model B — Direct、Consumer が NRF Discovery

SMF ── Nnrf_NFDiscovery ──► NRF
SMF ◄─ NF Profile 候補 ──── NRF
SMF ── SBI Request ───────────────► PCF-B
  • SMF が GET /nnrf-disc/v1/nf-instances?target-nf-type=PCF... で候補を得て(TS 29.510、節番号は要確認)、自分で選び、直接送ります。
  • Rel-15 の基本形です。

Model C — Indirect、Consumer が NRF Discovery、SCP は Routing

SMF ── Nnrf_NFDiscovery ──► NRF
SMF ◄─ NF Profile 候補 ──── NRF
SMF ── SBI Request ──► SCP ──► PCF-B
       (宛先を指定)
  • SMF は Discovery と Selection を自分で行い、選んだ宛先を Request に明示して SCP へ送ります。
  • 宛先の明示に使うのが 3gpp-Sbi-Target-apiRoot ヘッダです(後述)。

Model D — Indirect、Delegated Discovery

SMF ── SBI Request ───────► SCP ── Nnrf_NFDiscovery ──► NRF
       + Discovery 条件          ◄── NF Profile 候補 ──
                                 SCP が PCF-B を選択
                            SCP ── SBI Request ───────► PCF-B
  • SMF は NRF を見ません。「こういう条件の Producer に届けて」という Discovery 条件 を 3gpp-Sbi-Discovery-* ヘッダで Request に載せて SCP へ送ります(TS 29.500 §6.10.3、要確認)。
  • SCP が Discovery と Selection を行い、選んだ Producer へ転送します。

Model D でも SCP が毎回 NRF に問い合わせるとは限らない

SCP は過去の Discovery 結果をキャッシュしたり(NRF が返す有効期間の範囲内)、設定や他の情報で選択できる場合があります。SCP→NRF の通信が Trace に無いだけでは異常と断定できません。キャッシュの有無・期間・更新方法は 実装依存 です。

SCP の機能(TS 23.501 §6.2.19)

SCP の機能定義は TS 23.501 §6.2.19 にあります。主な項目は次のとおりです(列挙は要約。原文の網羅性・表現は要確認)。

機能 内容
Indirect Communication Consumer と Producer の間で SBI メッセージを中継する
Delegated Discovery Consumer に代わって NRF で Discovery し、Producer を選択する(Model D)
メッセージの転送・Routing 宛先 NF / NF Service へ、または 次段の SCP へ転送する(SCP は多段にできる)
通信セキュリティ 例: Consumer が Producer の API にアクセスすることの認可に関わる処理(詳細は TS 33.501 §13、要確認)
負荷分散・監視・過負荷制御 機能として列挙(網羅性・表現は要確認)
Group ID の解決 UE識別子(SUPI 等)から UDM / UDR / AUSF / PCF / CHF 等の Group ID を UDR に照会して解決する(オプション、要確認)
  • SCP 自身は PCF や UDM のような NF Service を提供するわけではありません。あくまで他の NF の Service への通信を仲介する要素です。
  • SCP 自体の発見・選択(Consumer がどの SCP を使うか)は TS 23.501 §6.3.16(要確認)で扱われ、ローカル設定や NRF を用いた方法があります。

例え話: SCP は「代表交換+配車センター」です。電話をつなぐ(Routing)だけでなく、頼まれれば条件に合う担当者を探して(Discovery)割り当てる(Selection)ところまでやりますが、自分で料理を作る(Policy を決める)わけではありません。


How — Model C と Model D を HTTP/2 で見分ける

SCP の前後は別の HTTP/2 接続

SMF ══ TLS/HTTP2 接続① ══ SCP ══ TLS/HTTP2 接続② ══ PCF
      :authority = SCP           :authority = PCF-B

SCP は HTTP のアプリケーション層で中継するので、SMF→SCP と SCP→PCF は別の TCP / TLS / HTTP/2 接続 です。接続①のパケットだけを見ても、接続②が成功したかは分かりません。

Model C の Request(Consumer が PCF-B を選択済み)

:method: POST
:scheme: https
:authority: scp.5gc.example
:path: /npcf-smpolicycontrol/v1/sm-policies
3gpp-sbi-target-apiroot: https://pcf-b.5gc.example
content-type: application/json
  • :authority は このホップの宛先(SCP)です。
  • 3gpp-sbi-target-apiroot は 最終宛先の apiRoot({scheme}://{authority}[/{apiPrefix}] 形式。apiPrefix は任意。apiRoot の定義は TS 29.501 §4.4.1、要確認)です。ヘッダ定義は TS 29.500 §5.2.3.2(枝番は要確認)、SCP への Request の宛先指定方法は TS 29.500 §6.10.2(要確認)。
  • SCP は、このヘッダの apiRoot を使って Request URI を組み立て直し、PCF-B へ転送します(ヘッダの削除・書き換えの細部は TS 29.500 §6.10.2、要確認)。
  • SCP 側の URI に apiPrefix が付く構成もあります(例: /scp-prefix/npcf-smpolicycontrol/...。付けるかどうかは構成依存)。

Model D の Request(Discovery を SCP に委譲)

:method: POST
:scheme: https
:authority: scp.5gc.example
:path: /npcf-smpolicycontrol/v1/sm-policies
3gpp-sbi-discovery-target-nf-type: PCF
3gpp-sbi-discovery-requester-nf-type: SMF
3gpp-sbi-discovery-service-names: npcf-smpolicycontrol
3gpp-sbi-discovery-snssais: [{"sst":1,"sd":"010203"}]
3gpp-sbi-discovery-dnn: internet
content-type: application/json
  • 3gpp-sbi-target-apiroot が無い のが最初の手掛かりです。Consumer はまだ宛先を知りません。
  • 3gpp-Sbi-Discovery-<パラメータ名> 形式のヘッダは、Nnrf_NFDiscovery の検索条件(query parameter)と対応 します(ヘッダ定義は TS 29.500 §5.2.3.2 内の Discovery 系ヘッダの節。§5.2.3.2.7 とされるが枝番は要確認。各パラメータの意味は TS 29.510)。
  • Nnrf_NFDiscovery では target-nf-type と requester-nf-type が必須の query parameter です(TS 29.510、節番号は要確認)。Delegated Discovery で Consumer が必ず付けるべき 3gpp-Sbi-Discovery-* ヘッダ、および SCP が requester の NF Type をどこから得るかは TS 29.500 §6.10.3 を参照してください(要確認)。
  • 値のエンコード(配列や JSON オブジェクトの書き方)は 要確認。上の例は説明用の概念表現で、そのまま送れる完全な Request ではありません。

HTTP/2 のヘッダ名は小文字

仕様書では 3gpp-Sbi-Target-apiRoot のように大文字混じりで書かれますが、HTTP/2 ではフィールド名を 小文字で送らなければなりません(RFC 9113 §8.2 / §8.2.1)。Wireshark で検索するときは 3gpp-sbi-target-apiroot のように小文字で探します。

Response 側の手掛かり — 3gpp-Sbi-Producer-Id

Model D では、SMF は「どの PCF が選ばれたか」を知りません。そのため Response には、選ばれた Producer を示す 3gpp-sbi-producer-id(NF Instance ID。NF Service Instance ID 等を含み得る)が付いて SMF に届きます。Producer 自身が付けるのか SCP が付けるのか、付与条件はどうかは TS 29.500 §5.2.3.2 / §6.10.3 を参照してください(いずれも枝番を含め要確認)。

:status: 201
location: https://pcf-b.5gc.example/npcf-smpolicycontrol/v1/sm-policies/abc123
3gpp-sbi-producer-id: nfinst=54804518-4191-46b3-955c-ac631f953ed8
content-type: application/json

(値は架空例。ヘッダ値の書式は要確認)

  • location には PCF-B の apiRoot が入っており、SMF は以後このリソースを PCF-B 上のものとして扱えます。
  • 以後の Update / Delete では、SMF は 3gpp-sbi-target-apiroot(Location 由来) を付けて SCP へ送ります(TS 29.500 §6.10、要確認)。再選択に備えて 3gpp-sbi-discovery-* や 3gpp-sbi-routing-binding を併せて付けることもあります。つまり Model D の運用でも、2通目以降の Request は Model C と同じ見た目 になり得ます(TS 29.500 §6.10、要確認)。
  • PCF が Binding Indication(3gpp-sbi-binding)を返した場合、SMF は後続 Request に 3gpp-sbi-routing-binding を付け、PCF-B が使えないときに SCP が同じ NF Set 内の代替 PCF へ再選択できるようにします(詳細は NF Set / Binding Indication / PCF冗長)。

判定の早見表

見えるもの Model C の初回 Request Model D の初回 Request 備考
Consumer → NRF の Nnrf_NFDiscovery ある(キャッシュ時は直前に無いことも) 無い Consumer 側の Trace で確認
:authority SCP SCP どちらも同じ。区別に使えない
3gpp-sbi-target-apiroot ある 無い 最重要の手掛かり(https で apiRoot を差し替える方式の場合。他の宛先指定方式の有無は TS 29.500 §6.10.2、要確認)
3gpp-sbi-discovery-* 無いこともある / 再選択用に付くこともある ある(委譲の条件) 単独では断定できない
SCP → NRF の Discovery 基本的に無い(選択パラメータ取得はあり得る) ある(キャッシュ時は無いことも) SCP 側の Trace / ログで確認
Response の 3gpp-sbi-producer-id 付くことがある 付くのが基本 条件の細部は要確認

単一ヘッダの有無で Model を断定しない

Model C でも、SCP による再選択(Reselection)に備えて Consumer が 3gpp-sbi-discovery-* を付けることがあります(TS 29.500 §6.10、要確認)。逆に Model D 運用でも、リソース作成後の Request は 3gpp-sbi-target-apiroot 付きです。「リソースを作る初回 Request」かどうか と Consumer→NRF の通信の有無 を合わせて判定します。

Call Flow — SMF → PCF の SM Policy Association を Model D で作る

PDU Session Establishment の中で、SMF は SM Policy Association を確立します(TS 23.502 §4.16.4、Npcf_SMPolicyControl_Create は TS 29.512 §4.2.2、いずれも要確認)。この Create を Model D で行う場合の流れです。

sequenceDiagram
    participant SMF
    participant SCP
    participant NRF
    participant PCF as PCF-B
    SMF->>SCP: (1) POST /npcf-smpolicycontrol/v1/sm-policies
authority=SCP, discovery-target-nf-type=PCF
discovery-service-names, snssais, dnn alt SCP に有効なキャッシュが無い SCP->>NRF: (2) GET /nnrf-disc/v1/nf-instances
target-nf-type=PCF ほか NRF-->>SCP: (3) 200 OK SearchResult
nfInstances = PCF-A, PCF-B end SCP->>SCP: (4) PCF-B を選択
Priority, Capacity, Load 等を考慮 SCP->>PCF: (5) POST /npcf-smpolicycontrol/v1/sm-policies
authority=PCF-B PCF-->>SCP: (6) 201 Created
Location, SmPolicyDecision SCP-->>SMF: (7) 201 Created
3gpp-sbi-producer-id=PCF-B Note over SCP,SMF: producer-id の付与主体と条件は要確認 Note over SMF: SM Policy Association 成立
以後は Location の apiRoot を
target-apiroot として使う SMF->>SCP: (8) POST .../sm-policies/abc123/update
target-apiroot=PCF-B, routing-binding SCP->>PCF: (9) POST .../sm-policies/abc123/update

Signal Flow 表

# 区間 メッセージ 見るべきヘッダ / IE 確認ポイント
1 SMF → SCP POST /npcf-smpolicycontrol/v1/sm-policies(SmPolicyContextData) :authority、3gpp-sbi-discovery-*、body の supi / pduSessionId / dnn / sliceInfo Discovery 条件が意図どおりか。target-apiroot が無いか
2 SCP → NRF GET /nnrf-disc/v1/nf-instances(Nnrf_NFDiscovery_Request) query: target-nf-type、requester-nf-type、service-names、snssais、dnn ①の条件が正しく引き継がれているか
3 NRF → SCP 200 OK(SearchResult) nfInstances[] の nfStatus、nfServices、sNssais、priority、capacity、load 対象 PCF が候補に入っているか。空配列でないか
4 SCP 内部 Producer 選択 — 選択アルゴリズムは 実装依存(NF Profile の priority / capacity 等を使うのが一般的)
5 SCP → PCF POST /npcf-smpolicycontrol/v1/sm-policies :authority = PCF-B 接続②の TLS / HTTP/2 が張れているか
6 PCF → SCP 201 Created(SmPolicyDecision) location、(任意で)3gpp-sbi-binding PCF がリソースを作ったか
7 SCP → SMF 201 Created 3gpp-sbi-producer-id(付与主体は要確認)、location SMF が Producer と Location を保持したか
8–9 SMF → SCP → PCF Update / Delete 3gpp-sbi-target-apiroot、3gpp-sbi-routing-binding 後続が同じ PCF(または同じ NF Set)へ届いているか

見るべき対応関係は SMF の Discovery 条件 → NRF が返した NF Profile → SCP が選んだ PCF → PCF の Response → SMF に残った Association(Location) の一本の線です。


SCP経由の失敗 — SCP が返したのか、Producer が返したのか

SCP が入ると、SMF が受け取るエラーには 2つの出どころ があります。

flowchart TD
    E["SMF がエラー Response を受信"] --> S{"Server ヘッダは?"}
    S -- "SCP を示す値" --> SCPERR["SCP が生成したエラー
Discovery 失敗 / 宛先到達不可 /
タイムアウト / 過負荷 等"] S -- "PCF を示す値" --> PCFERR["Producer が生成したエラー
SCP は中継しただけ"] S -- "無い / 判別不能" --> T["ProblemDetails の cause と
SCP-PCF 区間の Trace で判定"] SCPERR --> N1["SCP-NRF / SCP-PCF 区間を調べる"] PCFERR --> N2["PCF のログと Request 内容を調べる"]
手掛かり SCP が生成したエラー Producer(PCF)が生成したエラー 規定
server ヘッダ SCP を示す値(例: SCP-<SCPのFQDN> 形式) NF Type と NF Instance ID を示す値(例: PCF-<NF Instance ID> 形式) TS 29.500 §5.2.2(書式・必須性は要確認)
via ヘッダ 中継した SCP が付与し得る 同左(中継経路の記録) TS 29.500 §5.2.2(要確認)
ProblemDetails の cause 転送系の cause(例: TARGET_NF_NOT_REACHABLE、HTTP 504) API 固有の application error(Npcf_SMPolicyControl の cause は TS 29.512 §5.7、例は要確認) 共通 cause は TS 29.500 §5.2.7.2(要確認)
SCP → PCF 区間の Trace Request 自体が出ていない、または応答が無い Request が届き、PCF がエラーを返している —
3gpp-sbi-producer-id 付与条件は要確認 付くことがある TS 29.500 §6.10.3(要確認)

ヘッダだけで決めず、2地点の Trace で確定する

server / via ヘッダの付与は実装により差があり得ます(要確認)。確実なのは、SMF⇔SCP と SCP⇔PCF の両区間を同じトランザクションで照合 することです。SBI は通常 TLS で暗号化されているため、復号済み Trace(鍵ログ)か、SMF / SCP / PCF のログを使います。

例え話: 宅配の不在票が「配送センター(SCP)発行」か「届け先(PCF)が受け取り拒否」かで、次に電話する相手が変わります。不在票の発行元欄(server ヘッダ)と、配送記録(SCP⇔PCF区間の Trace)の両方を見て判断します。


Packet Analysis (Wireshark)

Display Filter

フィルタ 用途
http2 SBI 全体(TLS 復号済みが前提)
http2.headers.path contains "npcf-smpolicycontrol" Npcf_SMPolicyControl(N7)に絞る
http2.headers.path contains "nnrf-disc" Nnrf_NFDiscovery(Consumer→NRF または SCP→NRF)
http2.header.name == "3gpp-sbi-target-apiroot" 宛先指定付きの Indirect Request(Model C 型)
http2.header.name contains "3gpp-sbi-discovery" Discovery 条件付き Request(Model D 型、または再選択用)
http2.header.name == "3gpp-sbi-producer-id" 選ばれた/処理した Producer を示す Response(付与主体は要確認)
http2.headers.status >= 400 / http2.headers.status matches "^[45]" エラー Response(フィールドが文字列型の版では後者を使う)

フィールド名(http2.headers.path 等)は Wireshark の版で異なり得るため 要確認 です。GUI でヘッダを右クリックして「フィルタとして適用」すると確実です。

Decode例(概念表現)

以下は表示構造の概念表現で、値は架空例です(要キャプチャ)。

HyperText Transfer Protocol 2
 └─ Stream: HEADERS, Stream ID: 1, Length ...
     ├─ Header: :method: POST
     ├─ Header: :scheme: https
     ├─ Header: :authority: scp.5gc.example
     ├─ Header: :path: /npcf-smpolicycontrol/v1/sm-policies
     ├─ Header: 3gpp-sbi-discovery-target-nf-type: PCF
     ├─ Header: 3gpp-sbi-discovery-requester-nf-type: SMF
     ├─ Header: 3gpp-sbi-discovery-service-names: npcf-smpolicycontrol
     └─ Header: content-type: application/json

HyperText Transfer Protocol 2
 └─ Stream: HEADERS, Stream ID: 1, Length ...
     ├─ Header: :status: 504
     ├─ Header: server: SCP-scp.5gc.example
     └─ Header: content-type: application/problem+json
 └─ Stream: DATA
     └─ JSON: {"status":504, "cause":"TARGET_NF_NOT_REACHABLE", ...}

ProblemDetails の Content-Type は application/problem+json です(RFC 9457、旧 RFC 7807。TS 29.500 §5.2.7、要確認)。

見る順番

flowchart LR
    A["① SMF-SCP
authority, path
target-apiroot か
discovery-* か"] --> B["② SCP-NRF
Discovery の
query と SearchResult"] B --> C["③ SCP-PCF
接続と Request
authority=PCF"] C --> D["④ PCF の Response
201 / 4xx / 5xx
Location"] D --> E["⑤ SCP-SMF
producer-id
server ヘッダ"]
SMF → SCP:HTTP/2 接続 OK
       ≠
SCP → PCF:HTTP/2 接続 OK
       ≠
PCF:SM Policy Association 作成 OK

Trouble Shooting

症状 想定原因 確認ポイント ログ Packet 解決方法
SMF→SCP は接続できるが SM Policy Association が作られない どこかの区間で失敗 上の「見る順番」①〜⑤ SMF / SCP / PCF http2 失敗区間を特定してから原因に進む
SCP がエラーを返す(Discovery で候補が見つからない旨) NRF の PCF Profile 不整合(S-NSSAI / DNN 不一致、nfStatus が REGISTERED でない、nfServices に npcf-smpolicycontrol が無い) ①の Discovery 条件と③の SearchResult を左右に並べる SCP / NRF nnrf-disc PCF の NF Profile か SMF の Discovery 条件を修正。cause 値は要確認
504(cause: TARGET_NF_NOT_REACHABLE、server が SCP) SCP→PCF の経路・TLS・PCF 停止 SCP→PCF の TCP / TLS ハンドシェイク SCP SCP⇔PCF 区間 経路・証明書・PCF 状態を確認
4xx(server が PCF) PCF が Request を拒否(加入者不明、パラメータ不正等) ProblemDetails の cause、Request body PCF npcf-smpolicycontrol SCP ではなく SMF の Request 内容・PCF 設定を見る
Model C なのに古い PCF へ送られる SMF の Discovery キャッシュが古い、target-apiroot が停止済み PCF を指す Consumer 側キャッシュの有効期間、NRF の状態通知 SMF target-apiroot の値 実装依存。キャッシュ更新・NF Status Notify 購読を確認
Update / Delete だけ失敗(404 等) 後続 Request が作成時と別の PCF へ届いた(target-apiroot / routing-binding 欠落) 初回 location と後続の target-apiroot の一致 SMF / SCP routing-binding NF Set / Binding の設計を確認
401 / 403 アクセストークン(OAuth 2.0)や認可の問題 トークン取得経路(Consumer 自身か SCP か)と scope SMF / SCP / NRF authorization ヘッダ TS 33.501 §13.4.1(要確認)と構成を確認
SM Policy Association が重複して作られる SMF や SCP が POST を機械的に再送した 同一 PDU Session に対する複数の 201 SMF / SCP / PCF 同一 supi + pduSessionId の POST Retry / Reselection の条件を見直す(実装依存)

POST の再送は「冪等」ではない

リソースを作る POST は、タイムアウト後に再送すると、実は前の Request が処理済みで リソースが二重に作られる ことがあります(POST は冪等なメソッドではない。RFC 9110 §9.2.2)。SCP の Retry / Reselection の条件(どのエラーで、何回、別 Producer へ送るか)は 実装依存 です。API ごとの仕様と製品の挙動を確認して設計します。


よくある誤解

誤解 正しい理解
SCP を経由していれば Model D Model C も SCP 経由。違いは 誰が Discovery / Selection したか
Model C では SCP は選択をしない NF Set まで指定された場合、Set 内の Instance を選ぶのは SCP(TS 23.501 Annex E、要確認)
Model D では SCP が毎回 NRF に問い合わせる キャッシュ等で省略され得る(実装依存)
SMF→SCP の接続が成功すれば PCF にも届いている SCP の前後は別の HTTP/2 接続
SMF が受けた 5xx は PCF の故障 SCP が生成したエラーかもしれない。server ヘッダと SCP⇔PCF 区間で確認
3gpp-sbi-discovery-* があれば必ず Model D Model C でも再選択用に付くことがある
SCP は SBI 用の Service Mesh そのもの SCP は 3GPP の 機能定義。Service Mesh(サイドカー型プロキシ等)は 実装手段の1つ にすぎない
SCP があれば NRF は不要 Model D でも SCP が NRF を使う。NRF は登録・発見のリポジトリとして残る

3GPP仕様とVendor実装の境界

3GPPが定義するもの Vendor / 運用が決めるもの
Communication Model A〜D の整理(TS 23.501 Annex E) どの NF ペアにどの Model を採用するか
SCP の機能(TS 23.501 §6.2.19) SCP 製品の routing policy、ルールの書き方、優先度・重みの設定
Nnrf_NFDiscovery の API と検索条件(TS 29.510) NRF / SCP / Consumer の Discovery キャッシュの有効期間・更新方法
3gpp-Sbi-* カスタムヘッダの意味(TS 29.500 §5.2.3.2) SCP を Service Mesh(サイドカー / Ingress Gateway 等)で実装するか、専用プロキシで実装するか
Indirect Communication / Delegated Discovery の手順(TS 29.500 §6.10) Retry 回数・タイムアウト値・Reselection の発動条件
ProblemDetails と共通 cause(TS 29.500 §5.2.7) ログ・CLI・メトリクス・トレース(分散トレーシング)の形式
NF Set / Binding による再選択の枠組み SCP の冗長構成、Pod 配置、SCP の多段構成

Service Mesh と SCP

Kubernetes 上の 5GC では、SCP の Routing 機能をサービスメッシュのプロキシで実現する製品もあります。ただし、3GPP の SCP は 3gpp-Sbi-* ヘッダを理解し、NRF と連携して Discovery / Selection を行う 点で、汎用の L7 プロキシとは役割が異なります。どこまでを汎用メッシュに任せ、どこからを 3GPP 固有ロジックで処理するかは 実装依存 です(TS 23.501 には SCP の配備例を扱う informative Annex がある。Annex G「SCP Deployment Examples」と考えられるが要確認)。


EPC(4G)との比較

EPC の Diameter 系インタフェースにも、メッセージを中継するエージェント(Relay / Proxy / Redirect Agent、RFC 6733 §2.8)や、PCRF 選択のための DRA(Diameter Routing Agent)(TS 29.213 §7、要確認)がありました。考え方は似ていますが、同じものではありません。

項目 4G EPC(Diameter) 5GC(SBI)
中継要素 Diameter Agent / DRA SCP
宛先の指定 Destination-Realm / Destination-Host AVP :authority + 3gpp-Sbi-Target-apiRoot
「条件だけ渡して選んでもらう」 Destination-Realm だけ指定し、Host 選択を Agent に任せる運用(類推) Delegated Discovery(3gpp-Sbi-Discovery-*)
発見のリポジトリ 静的設定 / DNS が中心 NRF(NF Profile)
セッションの担当サーバの記憶 DRA の binding(PCRF 選択) BSF / Binding Indication / NF Set

右列と左列は 類推による対応 であり、仕様上の対応関係を定義したものではありません。


3GPP Specification

仕様 節 内容
TS 23.501 Annex E(Table E.1-1) Communication Model A〜D の整理(informative。表番号は要確認)
TS 23.501 §6.2.19 SCP の機能定義
TS 23.501 §6.3.1.0 / §7.1.1 NF / NF Service の Discovery と Direct / Indirect Communication(要確認)
TS 23.501 §6.3.16 SCP の Discovery / Selection(要確認)
TS 23.501 §6.2.6 NRF の機能定義
TS 23.502 §4.16.4 SM Policy Association Establishment(要確認)
TS 23.502 §4.17 NF Service Framework 関連手続き(Discovery 等。枝番は要確認)
TS 29.500 §5.2.2 標準 HTTP ヘッダ(server、via 等。要確認)
TS 29.500 §5.2.3.2 3GPP 固有カスタムヘッダ(3gpp-Sbi-Target-apiRoot、3gpp-Sbi-Discovery-*、3gpp-Sbi-Routing-Binding、3gpp-Sbi-Producer-Id 等。枝番は要確認)
TS 29.500 §5.2.7 エラー処理(ProblemDetails、共通 cause。枝番は要確認)
TS 29.500 §6.10 Indirect Communication(§6.10.2 SCP への宛先指定、§6.10.3 Delegated Discovery。枝番は要確認)
TS 29.501 §4.4.1 apiRoot を含むリソース URI の構造(要確認)
TS 29.510 — Nnrf_NFManagement / Nnrf_NFDiscovery(節番号は要確認)
TS 29.571 §5.2.4.1 ProblemDetails データ型(要確認)
TS 29.512 §4.2.2 / §5.7 Npcf_SMPolicyControl_Create / application error(要確認)
TS 33.501 §13.4.1 SBI の認可(OAuth 2.0。Indirect Communication 時の扱いを含む。要確認)
RFC 9113 §8.2 / §8.2.1 HTTP/2 のフィールド名は小文字(大文字を含むと malformed)
RFC 9110 §9.2.2 冪等なメソッド(POST は冪等ではない)
RFC 9457 — Problem Details for HTTP APIs(RFC 7807 を置き換え)

Summary

  • SBI で NF を呼ぶ仕事は Discovery / Selection / Routing の3つに分かれる
  • Model A: Direct・NRFなし / B: Direct・Consumer が NRF Discovery / C: SCP 経由・Consumer が NRF Discovery / D: SCP 経由・Discovery と Selection を SCP に委譲
  • Model C でも、NF Set まで指定された場合は SCP が Instance を選ぶ。Discovery と Selection は別物
  • 初回 Request に 3gpp-sbi-target-apiroot があれば Consumer が宛先を決めた(C 型)、無くて 3gpp-sbi-discovery-* があれば委譲(D 型)。ただし単一ヘッダで断定せず、Consumer→NRF の通信の有無も見る
  • Model D では Response の 3gpp-sbi-producer-id(付与主体は要確認)で選ばれた Producer が分かり、以後は Location 由来の target-apiroot で送る
  • SCP の前後は 別の HTTP/2 接続。エラーは server ヘッダ・cause・SCP⇔PCF 区間の Trace で SCP 起因か Producer 起因かを切り分ける
  • SCP の routing policy、キャッシュ、Retry、Service Mesh での実装は Vendor 実装依存

理解度チェック

Q1. SMF→SCP の Request に :authority: scp.5gc.example、3gpp-sbi-discovery-target-nf-type: PCF、3gpp-sbi-discovery-service-names: npcf-smpolicycontrol があり、3gpp-sbi-target-apiroot はありません。SMF は NRF Discovery を実行していません。最も適切な Model はどれか。A. Model A / B. Model B / C. Model C / D. Model D

正解: D。SCP 経由(Indirect)で、Consumer(SMF)は NRF を照会せず、Discovery 条件をヘッダで SCP に渡しています。これは Delegated Discovery = Model D です(TS 23.501 Annex E、TS 29.500 §6.10.3、要確認)。A / B は SCP を経由しない Direct Communication、C は Consumer 自身が NRF で Discovery して宛先を指定する形です。

Q2. 別の Trace では、SMF→NRF の Nnrf_NFDiscovery の直後に、SMF→SCP の POST に 3gpp-sbi-target-apiroot: https://pcf-b.5gc.example が付いていました。さらに 3gpp-sbi-discovery-* も付いています。これは Model D と言えますか。

言えません。Consumer が NRF で Discovery し、宛先(PCF-B)を指定している ので Model C と考えるのが自然です。3gpp-sbi-discovery-* は、PCF-B が使えないときに SCP が再選択できるよう Model C でも付けることがあります(TS 29.500 §6.10、要確認)。単一ヘッダの有無で判定しないことが重要です。

Q3. SMF が :status: 504、server: SCP-scp.5gc.example、ProblemDetails の cause TARGET_NF_NOT_REACHABLE を受け取りました。まずどこを調べますか。

server ヘッダと cause から、SCP が生成したエラー である可能性が高いと判断し、SCP⇔PCF 区間(TCP / TLS 接続、PCF の稼働状態、SCP が選んだ宛先)を調べます。PCF のアプリケーションログより先に、そもそも Request が PCF に届いたかを確認します。server ヘッダの書式・付与条件は TS 29.500 §5.2.2(要確認)で、実装差があり得るため、最終的には2地点の Trace で確定します。

Q4. Model C で SMF が特定の PCF Instance ではなく PCF の NF Set を指定して SCP に送りました。PCF Instance を選ぶのは誰ですか。また、これは「SCP が Discovery した」ことになりますか。

Instance を選ぶのは SCP です(TS 23.501 Annex E、要確認)。ただし候補を NRF から探した(Discovery した)のは Consumer なので、Model C のままです。Selection(Set内の1台を選ぶ)と Discovery(候補を探す)は別の仕事 であり、「Model C では SCP は Discovery をしないが、Selection はし得る」と整理します。


Next Step