コンテンツにスキップ

N7 SBI解析 — URI / HTTP/2 / ProblemDetails を4層で切り分ける

難易度: 上級(マニアック) / 想定学習時間: 35分 / 前提: PCF / SM Policy Association / PCC Rule, N7 / 主役: SMF, PCF(NRF) / 主Interface: N7(SBI)

学習目標

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

  • N7上の Service Consumer(SMF)/ Service Producer(PCF) の関係と、HTTPのClient / Serverの向きを説明できる
  • 3GPP APIの URI構造({apiRoot}/{apiName}/{apiVersion}/{resource})から、どのNF・どのServiceへのRequestかを読み取れる
  • Npcf_SMPolicyControl の Create / Update / Delete が、どのMethod・URI・Status Codeになるかを説明できる
  • HTTP/2 Stream ID でRequestとResponseを対応付け、HPACK と TLS による「見えない」原因を区別できる
  • ProblemDetails の status / cause / invalidParams を読み、「N7 Failure」を 4層 + 前後の段階 に細分化して報告できる
  • N7 → N4 → N2 を SUPI・PDU Session ID・時刻で相関させ、Policyがどこで変わったかを特定できる

前提知識

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

N7ページでは「N7はSBIで、実体はNpcf_SMPolicyControl」と紹介しています。この章では一段下へ降りて、実際のCaptureでN7のTransactionをどう特定し、どの層で失敗しているかをどう切り分けるか を扱います。Policyの意味そのもの(PCC Rule、QoS)は 前章 を参照してください。


Why — 「N7 Failureです」では何も分からない

障害報告で「N7 Failure」とだけ書かれていても、原因の候補は大きく異なります。

  • PCFの宛先が分からない(NRF Discovery の問題)
  • TCP / TLS が張れない(Transport の問題)
  • HTTP/2 の Stream がリセットされた(HTTP/2 の問題)
  • PCFが 4xx を返した(3GPP API の問題)
  • 201 Created は返ったが、5QI が期待と違う(Policy Logic の問題)

N7は N2(NGAP over SCTP)や N4(PFCP over UDP)のような専用プロトコルではなく、Web技術(TCP / TLS / HTTP/2 / JSON)を重ねたSBI です(N7)。層が多いぶん、どの層で失敗したかを言えないと、誰が直すべきかも決まりません。

例え話: N7は「現場担当(SMF)が規約部門(PCF)へ社内Webシステムで問い合わせる」ことに似ています。返事が来ないとき、原因は「社内ネットワークにつながらない」「システムがエラー画面を返した」「申請書の書式が違った」「回答は来たが内容が想定と違った」のどれかです。「問い合わせ失敗」とだけ言われても、情報システム部門・規約部門・申請者のどこへ相談すべきか分かりません。


What — Service Consumer と Service Producer

SMFがConsumer、PCFがProducer

SBAでは、サービスを提供するNFを NF Service Producer、利用するNFを NF Service Consumer と呼びます(TS 23.501 §7.1、要確認)。Npcf_SMPolicyControl では次の関係になります(TS 23.502 §5.2.5.4、要確認)。

役割 NF HTTP上の役割 主なOperation
NF Service Consumer SMF HTTP Client Create / Update / Delete を要求
NF Service Producer PCF HTTP Server SM Policy Association を管理し、SmPolicyDecision を返す

通知(UpdateNotify)では向きが逆になる

PCFが自発的にPolicyを変える場合(例: AFからの要求、加入者データ変更)、PCFはSMFへ Npcf_SMPolicyControl_UpdateNotify を送ります。このときHTTP上は PCFがClient、SMFがServer です。宛先は、SMFがCreate時に渡した notificationUri(Callback URI)です。

flowchart LR
    SMF["SMF
Consumer"] -- "Create / Update / Delete
SMF = HTTP Client" --> PCF["PCF
Producer"] PCF -- "UpdateNotify / Terminate通知
PCF = HTTP Client" --> SMF

向きが逆なら、TCP Connection も別になるのが普通

HTTP/2 では Request を送れるのは Connection を張った Client 側です(RFC 9113 §8)。したがって PCF → SMF の通知は、SMF → PCF の Connection とは 別のTCP / TLS Connection で流れるのが一般的です。Captureで「通知が見つからない」ときは、逆向きの Connection を探してください。


What — 3GPP API の URI 構造

{apiRoot}/{apiName}/{apiVersion}/{resource}

3GPPのSBI APIは、共通のResource URI構造を持ちます(TS 29.501 §4.4.1、要確認)。

{apiRoot}/{apiName}/{apiVersion}/{apiSpecificResourceUriPart}

例(概念):
https://pcf1.example.net:443/npcf-smpolicycontrol/v1/sm-policies/abc123
└────────── apiRoot ────────┘└──── apiName ──────┘└v1┘└── resource ──────┘
部分 意味 どこで決まるか
apiRoot scheme://authority + 任意の deployment-specific prefix PCFのNF Profile(NRF登録)の FQDN / IP Endpoint / apiPrefix(TS 29.510 §6.1.6.2.3 NFService、要確認)
apiName Service名を小文字・ハイフン区切りにしたもの。N7なら npcf-smpolicycontrol TS 29.512 §5.1(要確認)
apiVersion APIのメジャーバージョン(例: v1) TS 29.512 §5.1 / TS 29.501 §4.4(要確認)
resource sm-policies(Collection)、sm-policies/{smPolicyId}(個別) TS 29.512 §5.3(要確認)

Captureでは HTTP/2 の :authority(apiRoot の authority部分)と :path(apiPrefix があればそれを含み、apiName 以降)に分かれて見えます(RFC 9113 §8.3.1)。:path に npcf-smpolicycontrol が含まれていれば、PCFのSM Policy Control Serviceへの Request だと判断できます。

Npcf_SMPolicyControl の Resource と Operation

TS 29.512 では、SM Policy Association を sm-policies Collection 配下の個別Resource として表現し、Update / Delete は個別Resource配下の custom operation(POSTで呼ぶ動詞的なURI)として定義しています(TS 29.512 §5.3、枝番は要確認)。

Service Operation Method URI(apiRoot以降) 主なRequest Body 成功Response
Create(SMF→PCF) POST /npcf-smpolicycontrol/v1/sm-policies SmPolicyContextData 201 Created + Location + SmPolicyDecision
Update(SMF→PCF) POST /.../sm-policies/{smPolicyId}/update SmPolicyUpdateContextData 200 OK + SmPolicyDecision(要確認)
Delete(SMF→PCF) POST /.../sm-policies/{smPolicyId}/delete SmPolicyDeleteData 204 No Content(要確認)
読み出し(SMF→PCF) GET /.../sm-policies/{smPolicyId} — 200 OK + SmPolicyControl(要確認)
UpdateNotify(PCF→SMF) POST {notificationUri}/update SmPolicyNotification 200 OK / 204 No Content(要確認)
終了要求の通知(PCF→SMF) POST {notificationUri}/terminate TerminationNotification 204 No Content(要確認)

Delete は HTTP DELETE ではない

Npcf_SMPolicyControl_Delete は、DELETE Method ではなく POST .../sm-policies/{smPolicyId}/delete の custom operation です(TS 29.512 §4.2.5 / §5.3.3、要確認)。SmPolicyDeleteData(使用量報告など)を Body に伴うため custom operation の形をとっている、と理解できます(設計意図は本章の解説で、仕様上の明記ではありません)。「DELETE Method で探したのに Delete が見つからない」のはこのためです。

Create は Location で smPolicyId を返す

SMF → PCF   POST /npcf-smpolicycontrol/v1/sm-policies
            Body: SmPolicyContextData(supi, pduSessionId, dnn, sliceInfo, notificationUri, ...)

PCF → SMF   201 Created
            location: https://pcf1.example.net/npcf-smpolicycontrol/v1/sm-policies/abc123
            Body: SmPolicyDecision(sessRules, pccRules, qosDecs, ...)

以後の Update / Delete の URI には smPolicyId(例: abc123)しか出てきません。SUPI や PDU Session ID は Body に毎回入るわけではないため、後続Transactionを加入者と結び付けるには、Create の Location ヘッダ を控えておくことが重要です。smPolicyId の形式はPCFが決める 実装依存 の値です。


What — Method と Status Code の意味

Method だけで Operation を決めつけない

Npcf_SMPolicyControl では Create / Update / Delete がすべて POST です。「POSTだからCreate」とは言えず、Method + :path + Body をセットで見ます。なお PATCH は他のSBI API(例: Nnrf_NFManagement の NF Profile 更新、TS 29.510 §5.2.2.3、要確認)では使われますが、Npcf_SMPolicyControl の主要Operationには現れません(要確認)。

Status Code の読み方

SBIで使うStatus Codeの一般規定は TS 29.500 §5.2.7 にあります(要確認)。

Status 意味(SBIでの典型) 最初に疑うこと
201 Created Resource(SM Policy Association)が作られた Location と SmPolicyDecision の中身
200 OK / 204 No Content 処理成功(Bodyあり / なし) Update後のPolicyが期待どおりか
307 / 308 別のPCFインスタンスへのRedirect(TS 29.500 §6.10.9、要確認) Location の宛先と再送されたか
400 Bad Request JSON不正、必須属性欠落、値の不正 ProblemDetails の cause / invalidParams
401 Unauthorized OAuth 2.0 Access Token が無効(RFC 6750 §3.1) Token取得(NRF)と有効期限
403 Forbidden 権限不足、またはPCFがPolicy上拒否 ProblemDetails の cause、Token の scope
404 Not Found URIが存在しない、smPolicyId が無い :path、apiVersion、smPolicyId、NRFから得たURI
411 / 413 / 415 Length / サイズ / Content-Type の問題 content-type(application/json か)
429 Too Many Requests 過負荷制御 PCFの負荷、Retry間隔
500 / 503 Server側の処理失敗 / 一時的に利用不可 PCF内部、cause(例: NF_CONGESTION)
504 Gateway Timeout SCP等の中継から先へ届かない(要確認) 応答したのがPCFかSCPか

HTTP 2xx = Policyが正しい、ではない

201 Created が示すのは 「API Transactionが成功した」 ことだけです。返ってきた SmPolicyDecision の 5QI や Bit Rate が期待どおりかは、別の層(Policy Logic) の問題です。逆に、PCFに正しいPolicyが設定されていても、SMFが渡した Context(DNN・S-NSSAI 等)が誤っていれば、PCFは「正しく」想定外のPolicyを返します。


What — JSON Body の主要属性

属性名は TS 29.512 §5.6(Data Model、枝番は要確認)と、3GPPが公開する OpenAPI 定義(TS29512_Npcf_SMPolicyControl.yaml)で確認します。以下は主要属性の抜粋で、網羅ではありません。必須 / 任意の区別は Release により異なり得るため、本ページでは断定しません(要確認)。

SmPolicyContextData(Create Request: SMF → PCF)

属性 意味 Troubleshootでの使い方
supi 加入者ID 他Interfaceとの相関キー
pduSessionId PDU Session ID 同一UEの複数Sessionの区別
dnn 接続先DNN Policy選択の入力。誤りはPolicy誤りに直結
sliceInfo S-NSSAI(sst / sd) 同上
pduSessionType IPv4 / IPv6 / IPv4v6 / Ethernet 等 —
accessType / ratType 3GPP access 等 / NR 等 RAT別Policyの入力
servingNetwork 在圏PLMN ローミング時のPolicy
ipv4Address / ipv6AddressPrefix UEに割り当てたアドレス N4 / N6 との相関
subsSessAmbr / subsDefQos 加入者データ上の Session-AMBR / Default QoS PCFが返す値と比較
notificationUri UpdateNotify の宛先(SMFのCallback URI) 通知が届かないときの確認先
suppFeat Supported Features(機能ネゴシエーション) 期待した属性が返らない場合

SmPolicyDecision(Create / Update Response: PCF → SMF)

属性 意味 下流での行き先
sessRules Session Rule(authSessAmbr、authDefQos) NAS の Session-AMBR / Default QoS Rule、N4 の Session単位QER
pccRules PCC Rule(flowInfos、precedence、refQosData 等) NAS の QoS Rule、N4 の PDR(SDF Filter)
qosDecs QoS Decision(5qi、maxbrUl/Dl、gbrUl/Dl、arp 等) N2 の QoS Flow Level QoS Parameters、N4 の QER
chgDecs Charging Decision CHF / URR
policyCtrlReqTriggers SMFがPCFへUpdateすべき契機(PRA変化、RAT変化 等) Update が送られる理由
revalidationTime Policy再評価の時刻 定期的な Update の理由

PCC Rule は refQosData で qosDecs 内の QoS Data を ID参照 します。Captureでは「PCC Rule に 5QI が直接書いてある」のではなく、参照先の QoS Data を引いて読む 点に注意してください。


How — Call Flow

PDU Session確立時の SM Policy Association

SMFは PDU Session Establishment の途中で、動的PCCを使う場合に SM Policy Association を確立します(TS 23.502 §4.3.2.2.1、§4.16.4)。

sequenceDiagram
    participant AMF
    participant SMF
    participant NRF
    participant PCF
    AMF->>SMF: Nsmf_PDUSession_CreateSMContext Request
    opt PCFの宛先が未知
        SMF->>NRF: Nnrf_NFDiscovery Request
target-nf-type=PCF NRF-->>SMF: 200 OK(PCFのNF Profile一覧) end Note over SMF,PCF: TCP / TLS / HTTP/2 Connection(既存なら再利用) SMF->>PCF: POST sm-policies
SmPolicyContextData PCF->>PCF: UDR等の加入者Policyと照合してPolicy決定 PCF-->>SMF: 201 Created + Location
SmPolicyDecision Note over SMF: この後 N4 Session Establishment(SMF⇔UPF)が続くが図では省略 Note over SMF: Policyを N1 QoS Rule / N2 QoS Profile / N4 QER へ展開 SMF->>AMF: Namf_Communication_N1N2MessageTransfer

Signal Flow 表

# 方向 Message / Operation Method と URI(apiRoot以降) 主な中身 規定
1 SMF→NRF NFDiscover GET /nnrf-disc/v1/nf-instances?target-nf-type=PCF&... requester-nf-type、service-names 等 TS 29.510 §5.3.2.2(要確認)
2 SMF→PCF Npcf_SMPolicyControl_Create POST /npcf-smpolicycontrol/v1/sm-policies SmPolicyContextData TS 29.512 §4.2.2
3 PCF→SMF Create Response 201 Created + Location SmPolicyDecision TS 29.512 §4.2.2
4 SMF→PCF Npcf_SMPolicyControl_Update POST .../sm-policies/{smPolicyId}/update SmPolicyUpdateContextData(発生したTrigger 等) TS 29.512 §4.2.4(要確認)
5 PCF→SMF Npcf_SMPolicyControl_UpdateNotify POST {notificationUri}/update SmPolicyNotification TS 29.512 §4.2.3(要確認)
6 SMF→PCF Npcf_SMPolicyControl_Delete POST .../sm-policies/{smPolicyId}/delete SmPolicyDeleteData TS 29.512 §4.2.5(要確認)

手続きとしての SM Policy Association の Establishment / Modification / Termination は TS 23.502 §4.16.4 / §4.16.5 / §4.16.6 で規定されています(枝番は要確認)。

PCFの選択とNRF

SMFがどのPCFを使うかは、AMFから渡されたPCF情報、NRF Discovery、ローカル設定などで決まります(TS 23.501 §6.3.7.1、要確認)。どれを優先するかは構成・実装依存です。NRF Discovery の結果に含まれる NF Profile(FQDN / IP Endpoint / apiPrefix / 対応API Version)から apiRoot が組み立てられるため、NRFに登録された情報が古い・誤っていると、PCFが正常でも404や接続失敗になります。


How — 4層で切り分ける

flowchart TD
    L0["⓪ 宛先の決定
NRF Discovery / PCF Selection"] --> L1["① IP / TCP / TLS
到達性・Handshake・証明書"] L1 --> L2["② HTTP/2
Connection Preface・SETTINGS・Stream・GOAWAY"] L2 --> L3["③ 3GPP API
Method・path・Status・ProblemDetails"] L3 --> L4["④ Policy Logic
SmPolicyContextData と SmPolicyDecision"] L4 --> L5["⑤ SMFによる展開
N1 QoS Rule・N2 QoS Profile・N4 QER"]

本章の主題は ①〜④ の4層ですが、実務では ⓪(NRF) と ⑤(SMFの展開) を前後に足すと漏れがなくなります。

Layer 1: IP / TCP / TLS

確認項目 見るもの 規定
宛先解決 DNS(FQDNの場合)、NRFから得たIP Endpoint TS 29.510 §6.1.6.2.2 / §6.1.6.2.3(NFProfile / NFService の fqdn・ipEndPoints、要確認)
TCP SYN / SYN-ACK、RST、再送 —
TLS ClientHello / ServerHello、Alert、証明書検証 TS 33.501 §13.1(要確認)、TS 33.210 §6.2(TLSプロファイル、要確認)
ALPN TLS上で h2 が合意されたか RFC 9113 §3.2

SBIのTLS利用は TS 33.501 で規定されますが、信頼できるドメイン内での運用条件(TLSを使うか、NDS/IP等で保護するか)は 運用ポリシー依存 です(要確認)。待受ポートも NRF 登録で解決され、固定値ではありません(N7)。

Layer 2: HTTP/2

HTTP/2 は1本のTCP Connection上で複数の Stream を多重化します(RFC 9113 §5)。

TCP Connection(SMF → PCF)
├─ Stream 1   POST sm-policies             (UE-A のCreate)
├─ Stream 3   POST sm-policies/aaa/update  (UE-B のUpdate)
├─ Stream 5   POST sm-policies             (UE-C のCreate)
└─ Stream 1 の Response が Stream 3 より後に来ることもある
項目 意味 規定
Stream ID Request と Response は 同じ Stream ID で運ばれる。Client発のStreamは 奇数 RFC 9113 §5.1.1
HEADERS / DATA ヘッダ(:method 等)と Body(JSON)は別フレーム RFC 9113 §6.1 / §6.2
RST_STREAM 個別Streamの中断(Error Code付き) RFC 9113 §6.4
GOAWAY Connection全体の終了通知(最後に処理したStream ID付き) RFC 9113 §6.8
SETTINGS 同時Stream数などの合意 RFC 9113 §6.5

Stream ID は Connection の中でしか一意でない

Stream ID はTCP Connectionごとに1から振り直されます。複数のSMFやConnectionが混在するCaptureでは、TCP Connection(Wiresharkの tcp.stream)+ HTTP/2 Stream ID の組で Request / Response を対応付けます。「直後のパケットがResponse」とは限りません。

HPACK — ヘッダが見えないのはネットワークのせいとは限らない

HTTP/2 のヘッダは HPACK で圧縮され、Encoder と Decoder は Connection の 方向ごとに独立した Dynamic Table を保持します(RFC 7541 §2.2 / §2.3.2)。Connection の途中からCaptureを始めると、それ以前に Dynamic Table へ登録されたヘッダを参照できず、Wireshark が :path や :status を正しく表示できないことがあります。

「ヘッダがUnknown / 復号エラー」= NFが壊れたヘッダを送った、とは限りません。 まず Capture が Connection の開始(Connection Preface と最初の SETTINGS)から取れているかを疑ってください。

TLS — 中身を見るには鍵が要る

TLSで保護されたN7は、鍵が無ければ tls の Application Data としてしか見えません。

  • Wireshark で復号するには、NFまたはTLS終端点から TLSセッション鍵(Key Log ファイル) を取得して読み込ませる必要があります。TLS 1.3 や (EC)DHE では サーバの秘密鍵だけでは復号できません。
  • 鍵を出力できるかどうか、どこでTLSを終端しているか(NF本体、Sidecar、LB 等)は 実装依存 です。
  • TLSを使わない検証環境(平文HTTP/2)では、待受ポートが Wireshark の既定と違うと HTTP/2 と認識されないため、「Decode As」で HTTP2 を指定します(Wiresharkの操作、版依存)。

Layer 3: 3GPP API

HTTP/2 が正常なら、Npcf_SMPolicyControl として正しい Request / Response か を見ます。

確認項目 典型的な誤り
:method + :path apiName / apiVersion の誤り、smPolicyId の取り違え
content-type application/json 以外(415)
Request Body JSON構文エラー、必須属性欠落、値の範囲外(400)
:status 4xx / 5xx
Error Response Body ProblemDetails(application/problem+json)
authorization ヘッダ OAuth 2.0 Access Token の欠落・期限切れ(401 / 403)

ProblemDetails

SBIのError Responseは、Bodyに ProblemDetails を入れて返すのが基本です(TS 29.500 §5.2.7.1、要確認)。データ型は TS 29.571 §5.2.4.1(要確認)で定義され、IETFの Problem Details 形式に3GPP独自の属性を加えたものです。

ProblemDetails(主要属性)
├─ type / title / instance   ← IETF Problem Details 由来
├─ status                    ← HTTP Status Code と同じ値
├─ detail                    ← 人間向けの説明(実装依存の文言)
├─ cause                     ← 3GPPのApplication Error(機械判定に使う)
├─ invalidParams             ← どの属性が不正か(param / reason)
└─ supportedFeatures 等

RFC 7807 と RFC 9457

IETFの Problem Details 仕様は RFC 7807 で定義され、2023年に RFC 9457 で置き換えられました(RFC 9457 は RFC 7807 を obsolete)。Media type application/problem+json は変わりません。3GPPの各Releaseが RFC 7807 / RFC 9457 のどちらを参照しているかは 要確認 です。

cause の値は2系統あります。

系統 例 規定
SBI共通のApplication Error MANDATORY_IE_MISSING(400)、MANDATORY_IE_INCORRECT(400)、INVALID_MSG_FORMAT(400)、RESOURCE_URI_STRUCTURE_NOT_FOUND(404)、NF_CONGESTION(503)、UNSPECIFIED_NF_FAILURE(500) TS 29.500 §5.2.7.2(要確認)
Npcf_SMPolicyControl 固有 USER_UNKNOWN、ERROR_INITIAL_PARAMETERS、POLICY_CONTEXT_DENIED 等 TS 29.512 §5.7.3(要確認。各causeとStatus Codeの対応も要確認)

detail の文言は実装依存です。判定には status と cause を、原因箇所の特定には invalidParams を使います。

403 と 404 の典型

Status 意味すること 次に見るもの
403 PCF(間接通信では SCP の可能性もある)は 生きていて、Requestを解釈して拒否した。「PCF Down」ではない cause(Policy上の拒否か、認可の問題か)、Access Token の scope(npcf-smpolicycontrol)、Request Context(SUPI・DNN・S-NSSAI)
404 宛先Resourceが無い :path(apiName・apiVersion の綴り)、apiPrefix、smPolicyId(PCF再起動や別インスタンスへの切替で消えていないか)、NRFから得たURI

OAuth 2.0 では、Token無効は 401、scope不足は 403 が典型です(RFC 6750 §3.1、SBIでの利用は TS 29.500 §6.7.3 / TS 33.501 §13.4.1、いずれも要確認)。

Responseを返したのは本当にPCFか

SCP を経由する間接通信(SBI Communication Model)では、SMFが受け取った 4xx / 5xx / 504 は SCPが生成したもの かもしれません。Captureの取得点(SMF⇔SCP か SCP⇔PCF か)と、Responseの送信元を確認してください。

Layer 4: Policy Logic

APIが成功していれば、ようやく Policyの中身 を見ます。

flowchart TD
    W["5QI / Bit Rate が期待と違う"] --> Q1{"SmPolicyContextData の
DNN・S-NSSAI・RAT等は正しい?"} Q1 -- "No" --> S["SMF側の問題
Context生成・加入者データ"] Q1 -- "Yes" --> Q2{"SmPolicyDecision の
qosDecs・sessRules は期待どおり?"} Q2 -- "No" --> P["PCF側の問題
Policy設定・UDRのPolicy Data"] Q2 -- "Yes" --> E["SMFの展開以降を疑う
N1・N2・N4 と比較"]

Wrong Policy = PCF bug とは限りません。PCFは受け取った Context に対して判断するため、必ず Request と Response を対で 見ます。

また、SMFが受け取ったPCC Ruleを適用できなかった場合、SMFは Update の中で Rule Report(ruleReports、適用失敗の理由付き)としてPCFへ報告できます(TS 29.512 §4.2.4、属性名・値は要確認)。「PCFは正しく返したが、SMFが適用できなかった」はここに現れます。


「N7 Failure」を細分化する

報告では、少なくとも次のどれかまで特定します。

# 分類 典型的な証拠 主な担当
① PCF Discovery / Selection 失敗 NRFへのDiscoveryが失敗、または候補0件。N7のTCP SYNすら出ない NRF / SMF設定
② TCP / TLS 失敗 SYNに応答なし、RST、TLS Alert、証明書エラー 伝送 / PKI
③ HTTP/2 失敗 RST_STREAM、GOAWAY、Response未着(Stream単位のTimeout) NF実装 / LB
④ SBI API Error 4xx / 5xx + ProblemDetails Request側 or PCF
⑤ Policy Rejection 403 等で cause がPolicy上の拒否を示す(要確認) PCF Policy設定
⑥ Policy Decision Mismatch 2xx だが 5QI / Bit Rate が期待と違う PCF設定 or SMF Context
⑦ SMF Policy Application Failure PCFの値と N1 / N2 / N4 の値が違う、Rule Report で失敗報告 SMF

この粒度で報告するだけで、関係チーム間の切り分けが大きく速くなります。


Packet Analysis (Wireshark)

Display Filter

フィルタ 用途
http2 HTTP/2 全体(TLS復号後、または平文)
http2.headers.path contains "npcf-smpolicycontrol" N7のRequestに絞る
http2.headers.method == "POST" POSTに絞る
http2.headers.status == 201 Create成功のResponse
http2.headers.status >= 400 Error Response
http2.streamid == 21 && tcp.stream == 3 特定Connection内の特定Streamを追う
http2.type == 3 / http2.type == 7 RST_STREAM / GOAWAY(フレーム種別値は RFC 9113 §6)
json JSON Body
tls.handshake.type == 1 / tls.alert_message ClientHello / TLS Alert
tcp.flags.reset == 1 TCP RST
http2.headers.path contains "nnrf-disc" NRF Discovery

フィールド名はWiresharkの版で異なる場合があります(要確認)。Response側には :path が無いため、:path で絞ると Response が落ちる点にも注意します(Stream ID で拾い直す)。

Decode例(概念表現)

以下は表示構造の概念表現で、値はテスト用PLMN(001-01)の架空例です(要キャプチャ)。

Stream 21  HEADERS  (SMF → PCF)
 ├─ :method: POST
 ├─ :scheme: https
 ├─ :authority: pcf1.example.net
 ├─ :path: /npcf-smpolicycontrol/v1/sm-policies
 └─ content-type: application/json
Stream 21  DATA
 └─ JSON: SmPolicyContextData
     ├─ supi: imsi-001010000000001
     ├─ pduSessionId: 1
     ├─ dnn: internet
     ├─ sliceInfo: { sst: 1, sd: 010203 }
     ├─ pduSessionType: IPV4
     ├─ ratType: NR
     └─ notificationUri: https://smf1.example.net/cb/pdu-1

Stream 21  HEADERS  (PCF → SMF)
 ├─ :status: 201
 ├─ location: https://pcf1.example.net/npcf-smpolicycontrol/v1/sm-policies/abc123
 └─ content-type: application/json
Stream 21  DATA
 └─ JSON: SmPolicyDecision
     ├─ sessRules: { sr1: { authSessAmbr: { uplink: 100 Mbps, downlink: 200 Mbps },
     │                      authDefQos: { 5qi: 9, arp: { priorityLevel: 8, ... } } } }
     ├─ pccRules:  { pcc1: { flowInfos: [...], precedence: 100, refQosData: [ qos1 ] } }
     └─ qosDecs:   { qos1: { 5qi: 7, maxbrUl: 10 Mbps, maxbrDl: 10 Mbps } }

Error の例(概念表現):

Stream 23  HEADERS  (PCF → SMF)
 ├─ :status: 400
 └─ content-type: application/problem+json
Stream 23  DATA
 └─ JSON: ProblemDetails
     ├─ status: 400
     ├─ cause: MANDATORY_IE_MISSING
     ├─ detail: (実装依存の文言)
     └─ invalidParams: [ { param: /sliceInfo, reason: ... } ]

見る順番

flowchart LR
    A["① Src / Dst
SMF→PCFか"] --> B["② tcp.stream と
Stream ID"] B --> C["③ :method
④ :path"] C --> D["⑤ :status"] D --> E["⑥ Request JSON
⑦ Response JSON"] E --> F["⑧ ProblemDetails
status・cause"]

その後、SUPI・PDU Session ID・DNN・S-NSSAI など利用できる相関キーで、他Interfaceと結び付けます。

N7 → N4 → N2 を相関させる

相関キー N7(SBI) N11(SBI) N4(PFCP) N2(NGAP)
SUPI Create Body の supi N1N2MessageTransfer の URI(ue-contexts/{ueContextId}、要確認) 通常は含まれない 含まれない
PDU Session ID Create Body の pduSessionId Body の pduSessionId 通常は含まれない(F-SEIDで識別) PDU Session ID IE
時刻 Create / Update の時刻 直後 Session Establishment / Modification PDU Session Resource Setup / Modify
値 qosDecs.5qi / maxbrUl/Dl / authSessAmbr (N1 / N2 SM情報を内包) QER の QFI / MBR / GBR QoS Flow Level QoS Parameters の 5QI / Bit Rate

N4にはSUPIが通常現れないため、時刻 + UE IPアドレス + SMFログ で PFCP Session(F-SEID)を特定するのが実務的です。PFCP の User ID IE などで加入者情報を運べる場合もありますが、使うかどうかは構成依存です(TS 29.244 §8.2.101、要確認)。

Bit Rate は Interface ごとに表現が違う

同じ値でも表現が異なります。SBIの BitRate は "100 Mbps" のような 単位付き文字列(TS 29.571 §5.5.2、要確認)、PFCP の MBR / GBR は kbps 単位の整数(TS 29.244 §8.2.8、要確認)、NGAP の Bit Rate は bit/s 単位の整数(TS 38.413 §9.3.1.4、要確認)です。「桁が違う」ように見えても単位換算すると一致する場合があります。比較表は単位をそろえて作ってください。

項目 N7(PCF Decision) N4(PFCP QER) N2(NGAP) 判定
5QI 7 (QFIに対応付け) 7 OK
MBR DL 10 Mbps 10000 kbps 10000000 bit/s OK(単位換算後一致)
Session-AMBR DL 200 Mbps 200000 kbps (PDU Session Aggregate Maximum Bit Rate) 要確認

N7の値と N4 / N2 の値が違えば、PCFより後ろ(SMFのPolicy処理) を重点的に疑えます。N4・N2 の読み方は PFCP と PDR / FAR / QER / URR と PDU Session Establishment 深掘り を参照してください。


Trouble Shooting

症状 想定原因 確認ポイント ログ Packet 解決方法
PCFへRequestが全く来ない NRF Discovery失敗、PCF Selection設定誤り NRFへのDiscoveryと結果、SMFのPCF設定 SMFログ、NRFログ http2.headers.path contains "nnrf-disc" NRF登録・Discovery条件を修正
TCP SYNに応答がない / RST 経路・FW・待受ポート NRF登録のIP Endpoint / ポート SMF / PCFの接続ログ tcp.flags.reset == 1 経路・FW・登録情報を修正
TLS Alert で切断 証明書の期限・信頼チェーン・SAN不一致 ServerHello後のAlert種別 TLSライブラリのログ tls.alert_message 証明書・CA設定を修正
ヘッダが表示されない Capture途中開始によるHPACK文脈欠落、TLS未復号 Connection開始から取れているか、Key Logの有無 — http2 Connection開始から取り直す、鍵を用意
Responseが来ない PCF処理遅延、Stream Timeout、RST_STREAM 同じStream IDのResponse有無、GOAWAY SMFのTimeoutログ http2.type == 3 PCF負荷・Timeout設定を確認(値は実装依存)
400 必須属性欠落・不正値・JSON不正 ProblemDetails の cause / invalidParams PCFログ http2.headers.status == 400 SMFのRequest生成を修正
401 / 403 Access Token無効・scope不足、Policy上の拒否 cause、authorization ヘッダ、Token取得 PCF / NRFログ http2.headers.status == 403 Token / 認可設定、Policy設定を確認
404 apiName / apiVersion / apiPrefix 誤り、smPolicyId 消失 :path、NRFのNF Profile、PCF再起動の有無 PCFログ http2.headers.status == 404 URI組立・NRF登録を修正
5xx / 504 PCF内部失敗、過負荷、SCPから先へ到達不可 cause、Response送信元(PCFかSCPか) PCF / SCPログ http2.headers.status >= 500 PCF / SCP側を調査
2xx なのに 5QI が違う SMFのContext誤り、またはPCFのPolicy設定 Request の DNN・S-NSSAI と Response の qosDecs PCFのPolicy評価ログ json 比較表で層を特定して修正
PCF値は正しいが UE / UPF の値が違う SMFの展開誤り、Rule適用失敗 N4 QER、N2 QoS、ruleReports SMFログ pfcp / ngap SMF側を調査

PCFがHTTP 500を返したときにSMFが何回・どの間隔でRetryするか、別PCFへ切り替えるかは 実装依存 です(代替PCFの選択や NF Set の考え方は NF Set / Binding Indication を参照)。


3GPP仕様とVendor実装の境界

3GPPが定義するもの Vendor / 運用が決めるもの
Npcf_SMPolicyControl の Operation、Resource URI、Data Model PCF / SMF の Pod 構成、Policy Worker、内部Cache、DB
HTTP/2・JSON・TLS をSBIで使うこと、Status Code の使い方 SBIの待受ポート、TLS終端位置(NF / Sidecar / LB)
ProblemDetails の構造と 3GPP定義の cause detail の文言、内部エラーコード、ログ形式
NRFによる登録・Discovery、OAuth 2.0 認可の枠組み PCF選択アルゴリズムの細部、Token Cache
SM Policy Association の手続き(Establishment / Modification / Termination) Timeout値、Retry回数・間隔、Failover方式、Vendor CLI

N7で問題が出たら、3GPPのAPI動作の問題か / Transport・基盤の問題か / Vendor実装の問題か を分けて考えます。


EPC(4G)との比較

項目 4G EPC(Gx) 5GC(N7)
両端 PCEF(PGW)⇔ PCRF SMF ⇔ PCF
プロトコル Diameter(TS 29.212) HTTP/2 + JSON(TS 29.512)
確立 CCR-Initial / CCA Create(POST → 201)
更新(PCEF / SMF起点) CCR-Update / CCA Update(POST .../update)
更新(PCRF / PCF起点) RAR / RAA UpdateNotify(POST {notificationUri}/update)
終了 CCR-Termination / CCA Delete(POST .../delete)
Sessionの識別 Session-Id AVP smPolicyId(Location の URI)
結果の表現 Result-Code / Experimental-Result AVP HTTP Status + ProblemDetails の cause
宛先の決定 静的設定、DRA(Diameter Routing Agent) NRF Discovery、SCP

Gx の Diameter メッセージ対応は概念的な対応付けです(手続きは TS 29.212 §4.5、メッセージ定義は §5.6、いずれも要確認)。最大の違いは、結果判定が「HTTP Status」と「3GPP cause」の2段になった ことと、宛先がNRFで動的に決まる ことです。


3GPP Specification

仕様 節 内容
TS 23.501 §7.1 NF Service Consumer / Producer の考え方(要確認)
TS 23.501 §6.3.7.1 PCF Discovery and Selection(要確認)
TS 23.502 §4.3.2.2.1 UE-requested PDU Session Establishment(SM Policy Association確立の位置)
TS 23.502 §4.16.4 / §4.16.5 / §4.16.6 SM Policy Association Establishment / Modification / Termination(枝番は要確認)
TS 23.502 §5.2.5.4 Npcf_SMPolicyControl サービスの定義(要確認)
TS 29.512 §4.2.2 / §4.2.3 / §4.2.4 / §4.2.5 Create / UpdateNotify / Update / Delete(枝番は要確認)
TS 29.512 §5.1 / §5.3 API URI と Resource構造(sm-policies、custom operation。要確認)
TS 29.512 §5.5 Notification({notificationUri}/update・/terminate の Callback URI、要確認)
TS 29.512 §5.6 / §5.7 Data Model(SmPolicyContextData / SmPolicyDecision 等)/ Error Handling(要確認)
TS 29.500 §5.2 SBIでのHTTP/2の使い方
TS 29.500 §5.2.7 HTTP Status Code と ProblemDetails・Application Error(要確認)
TS 29.500 §6.7.3 / §6.10.9 OAuth 2.0 認可 / Redirect(要確認)
TS 29.501 §4.4 Resource URI構造(apiRoot / apiName / apiVersion、§4.4.1。要確認)
TS 29.571 §5.2.4.1 / §5.5.2 ProblemDetails 型 / BitRate 等の共通型(要確認)
TS 29.510 §5.3.2.2 / §6.1.6.2.3 NFDiscover / NFService(apiPrefix 等。要確認)
TS 29.518 §5.2.2.3.1 Namf_Communication_N1N2MessageTransfer(要確認)
TS 29.244 §8.2.8 MBR(PFCP、要確認)
TS 38.413 §9.3.1.4 Bit Rate(NGAP、要確認)
TS 33.501 §13.1 / §13.4.1 SBIのTLS保護 / OAuth 2.0 による NF Service 認可(要確認)
TS 29.212 §4.5 / §5.6 Gx の手続き / CCR・CCA・RAR・RAA のメッセージ定義(EPC比較用、要確認)
RFC 9113 §5 / §6 / §8 HTTP/2 の Stream・Frame・Pseudo-header(RFC 7540 を置き換え)
RFC 7541 §2.2 / §2.3.2 HPACK の Dynamic Table
RFC 9457 — Problem Details for HTTP APIs(RFC 7807 を置き換え)
RFC 6750 §3.1 Bearer Token のエラー(401 / 403)

Summary

  • N7の実体は Npcf_SMPolicyControl。SMF = Consumer(HTTP Client)、PCF = Producer(HTTP Server)。通知(UpdateNotify)では向きが逆になり、Connectionも別になる
  • URIは {apiRoot}/npcf-smpolicycontrol/v1/sm-policies...。Create は POST → 201 + Location、Update / Delete は POST の custom operation(/update、/delete)
  • 後続Transactionは smPolicyId でしか識別できないので、Create の Location を控える
  • HTTP 2xx ≠ 正しいPolicy。Request(SmPolicyContextData)と Response(SmPolicyDecision)を対で見る
  • 切り分けは ⓪ NRF → ① IP/TCP/TLS → ② HTTP/2 → ③ 3GPP API → ④ Policy Logic → ⑤ SMFの展開
  • Request / Response は TCP Connection + Stream ID で対応付ける。ヘッダが見えないときは HPACK文脈 と TLS鍵 を疑う
  • Errorは status と cause で判定し、invalidParams で箇所を特定する。403 / 404 は「PCF Down」ではない
  • N7 → N4 → N2 を SUPI・PDU Session ID・時刻で相関させ、単位をそろえて 値を比較する

理解度チェック

Q1. SMFからPCFへの Npcf_SMPolicyControl Request に対して、PCFが HTTP 201 を返しました。しかしUEに適用された5QIが期待値と異なります。最も適切な対応はどれか。A. HTTPが成功しているのでPCF / SMFに問題はなく、gNBのHardware故障と判断する / B. HTTP成功はAPI Transactionの成功を示すだけなので、SMFのRequest Context、PCFのPolicy Decision、SMFによるN1 / N2 / N4への展開を順に確認する / C. HTTP 2xxなら5QIは必ず3GPPのDefault値になるので確認は不要 / D. N7のPolicyはQoSに関係しないので、N3のTEIDだけを確認する

正解: B。201 は SM Policy Association が作られたこと(API層の成功)を示すだけで、Policyの中身の正しさは保証しません。まず SmPolicyContextData の DNN・S-NSSAI 等が正しいか、次に SmPolicyDecision の qosDecs が期待どおりか、最後に N1 / N2 / N4 に同じ値が展開されているかを順に確認します。A は根拠なく層を飛ばしています。C・D は誤りです(5QI は PCF の Decision で決まり得ます)。

Q2. Captureで SM Policy Association の Delete を探すため、HTTP DELETE Method でフィルタしましたが見つかりません。なぜですか。

Npcf_SMPolicyControl_Delete は HTTP DELETE ではなく、POST .../sm-policies/{smPolicyId}/delete という custom operation だからです(TS 29.512 §4.2.5、要確認)。SMFは削除時に SmPolicyDeleteData を Body で渡します。:path に /delete を含む POST を探します。Update も同様に /update への POST です。

Q3. SMF→PCF の HTTP/2 Request を見つけましたが、直後のパケットは別のUEに関する Response でした。対応する Response はどう探しますか。また、:path が表示されない場合に何を疑いますか。

同じ TCP Connection 内で 同じ Stream ID を持つ HEADERS(:status を含む)を探します(RFC 9113 §5.1.1)。HTTP/2 は多重化されるため、直後のパケットが Response とは限りません。:path などのヘッダが表示されない場合は、Capture が Connection の途中から始まって HPACK の Dynamic Table 文脈が欠けている か、TLS が復号できていない(Key Log が無い)ことを疑います。NFが壊れたヘッダを送ったとは限りません。

Q4. SMFからPCFへの Create に 404 が返りました。「PCFがDownしている」と報告してよいですか。

よくありません。404 を返せている時点で、PCF(または中継のSCP)は Requestを受信してHTTP Responseを返せる状態 です。:path の apiName / apiVersion、NRFに登録された apiPrefix、NRF Discovery で得たURIを確認し、ProblemDetails の cause(例: RESOURCE_URI_STRUCTURE_NOT_FOUND、要確認)を見ます。「PCFは生きているが、SMFが誤ったService URIへアクセスしている」可能性があります。


Next Step