N7 SBI解析 — URI / HTTP/2 / ProblemDetails を4層で切り分ける¶
学習目標¶
この章を読み終えると、次のことができるようになります。
- 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がどこで変わったかを特定できる
前提知識¶
- PCF / SM Policy Association / PCC Rule — SM Policy Association と PCC Rule の中身
- N7 — N7がSBIであり、実体が Npcf_SMPolicyControl であること
- 補助: 5GC概要(SBA / SBI / NRF) / PCF / NRF / HTTP API辞典 / パケット解析のTips / PFCP と PDR / FAR / QER / URR
この章の焦点(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¶
- AFがPCFへQoSを要求する流れ → AF / N5 / Application Session
- PCFが返すPolicyの中身 → PCF / SM Policy Association / PCC Rule / QoS Flow / QFI / 5QI / GFBR / MFBR / AMBR / ARP
- Policyが UPF / gNB へ届く先 → PFCP と PDR / FAR / QER / URR / PDU Session Establishment 深掘り
- PCFの選び方と冗長 → BSF / PCF Binding / NF Set / Binding Indication / SBI Communication Model
- 基礎の確認 → N7 / PCF / NRF / HTTP API辞典 / パケット解析のTips