SBI Communication Model A〜D / SCP — DiscoveryとRoutingは別の仕事¶
学習目標¶
この章を読み終えると、次のことができるようになります。
- 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が返したエラー」か に切り分けられる
前提知識¶
- SCP — Model A〜D の概要(この章はその深掘り)
- NRF — NF Profile と Nnrf_NFDiscovery
- NF Set / Binding Indication / PCF冗長 — NF Set、
3gpp-Sbi-Routing-Binding - N7 SBI解析 — HTTP/2・ProblemDetails の読み方
- 補助: PCF / N7 / 5GC概要とSBA / HTTP API辞典 / Protocol辞典
この章の焦点(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 の 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 接続¶
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 ヘッダ"]
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¶
- SCP の基本と Model A〜D の位置づけ → SCP
- NF Profile と Discovery の基礎 → NRF
- SCP 経由の再選択を支える NF Set / Binding → NF Set / Binding Indication / PCF冗長 / BSF / PCF Binding / BSF
- N7 上の HTTP/2 と ProblemDetails の読み方 → N7 SBI解析 / N7 / PCF
- PLMN 間の SBI 中継(SCP との対比) → SEPP / N32
- SBI の API とプロトコルを引く → HTTP API辞典 / Protocol辞典 / Spec辞典
- Trace の取り方と仕様の読み方 → Packet Analysis Tips / Spec Reading Tips