教養としての5GC(free5gc+UERANSIMで学ぶ5Gコアネットワーク)その3

前回まではfree5gcをInstallしてコールテストを行い主にRANと5GCの間の通信を見てみました。

https://qiita.com/wzm/items/e3eb73835005ed7e8702

今回は5GC内で何が起きているのかを見てみましょう。

#1. 5GC内のプロトコル

第２回でも書きましたが5GC内ではHTTP/2が使われています。以下の図の黄色の部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/5babd3ce-4cf6-adc9-477d-8ce34bc05122.png)

5GC内はSBA(Service Based Architecture)という仕様になっていて、従来のEPCとは違って全NFがフルメッシュで通信できるバス型のアーキテクチャになっています。それぞれのNF間はSBI(Service Based Interface)と呼ばれるAPIを使って通信します。テレコムのコアな世界にもようやくAPIが入って来たかと感慨深いものがあります。。

#1.1 プロトコルスタック

5GC内では以下のHTTP/2上のスタックで通信します。Applicationの部分にJSONフォーマットのメッセージを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/d04dc9e1-e1f7-d835-71cf-a2995f20e6f0.png)

引用元:3GPP TS29.500

具体的には以下の様に各NFがProducerやCosumerという役割を担い、Cosumer側がProducer側にWebAPIの各種Requestを送信し、各NFのServiceを利用する事になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/99b64d65-8284-a303-87d5-9f381d98555a.png)

引用元:3GPP TS29.501

#2. 5g-trace-visualizer install

それでは各NF間の実際のやり取りを見てみましょう。Wirersharkを使ってもHTTP/2通信は見えるのですが、今回は5g-trace-visualizerという便利なpythonツールがあるので、こちらを使ってみましょう。

https://github.com/telekom/5g-trace-visualizer

Install手順は以下のReadmeに書いてある通りでwireshark/tsharkのほかにplantuml.jarという別のjavaのモジュールが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/5454eee7-8582-6b02-dab8-947f7f86dc9b.png)

tsharkのパスだけそのままInstallしただけだとうまく動作しないので以下の様にディレクトリを掘ってそこにtsharkをコピーしました。WiresharkPortableとやらをちゃんとInstallすればよいのかもしれませんが、まぁtsharkをaptで入れているんだしという事で。。

```
q14537@free5gc:~/free5gc/5g-trace-visualizer$ ls -lR wireshark/
wireshark/:
total 4
drwxrwxr-x 3 q14537 q14537 4096 Sep  8 15:36  WiresharkPortable_3.2.3
-rw-rw-r-- 1 q14537 q14537    0 Sep  8 15:35 'WiresharkPortable_x.y.z folders place here'

wireshark/WiresharkPortable_3.2.3:
total 4
drwxrwxr-x 3 q14537 q14537 4096 Sep  8 15:36 App

wireshark/WiresharkPortable_3.2.3/App:
total 4
drwxrwxr-x 2 q14537 q14537 4096 Sep  8 15:36 Wireshark

wireshark/WiresharkPortable_3.2.3/App/Wireshark:
total 312
-rwxr-xr-x 1 q14537 q14537 315560 Sep  8 15:36 tshark
```

#3. pcapファイルの読み込み

無事Installが終われば以下のコマンドで5g-trace-visualizerにキャプチャしたファイルを処理させます。5GC NF達がそれぞれ通信するので、その通信に使用するポート番号を-http2portsオプションで指定してHTTP/2としてデコードさせます。Wiresharkの”...としてデコード”のオプションでHTTP2と指定してあげてもHTTP/2としてデコード出来たりするのですが、出来ないパケットもあったりします。5g-trace-visualizerならポートをちゃんと指定してあげれば綺麗にデコードしくれます。

```
5g-trace-visualizer$ python3 trace_visualizer.py -wireshark "3.2.3" -http2ports "80,8080,35170,42632,40798,43088,43108,47154,27017,50818,50826,50840,54138,54852,50900,60194" -limit 200 -simple_diagrams True ../5GC_Registration.pcap
```

うまく動作すれば*.svgファイルが生成されます。これをChromeなどのブラウザから開いてあげると以下の様なコールフローが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/3c1ca92d-0755-5988-c298-49261553ce51.png)

このフローの上の箱たちを見てもらえれば良いと思うのですが、それぞれのNF間で通信がずらーっと出てきます。nnrf-discとか見えているものが各NF達がAPIを通して公開しているサービス名になります。この箱の名前は5g-trace-visualizerがキャプチャファイルの中身から自動で付加してくれる様でとても便利ですね。

各NFで定義されているサービスは以下のサイトで詳細が見えます。

https://github.com/jdegre/5GC_APIs/tree/Rel-15

たとえばnnrf-discであれば以下の通りです。

https://jdegre.github.io/editor/?url=https://raw.githubusercontent.com/jdegre/5GC_APIs/Rel-15/TS29510_Nnrf_NFDiscovery.yaml

全部を追っていくのはとても大変なのでお任せしますが、前回でもとりあげたPDU Session Establishmentの部分だけ少し詳しく見てみましょう。

#4. AMF<->SMF PDU Session Establisment

1.まずNGAPでPDU Session Establishment RequestをAMFが受けます。
29. AMF->NRFにNSSFはどこかを訪ねます。NRFはDNSみたいな役割なので5GC内のサービスを使いたい場合はまず問い合わせが行きます。今回はスライス情報が欲しいのでNSSFのAPIのURL情報を聞きます。
59. AMFはNRFから教えてもらったNSSFのWebAPIにAMF->NSSFにスライスに関する情報を訪ねます。
112. AMF->SMFにこんな加入者からPDU Session確立したい要求を受けたんだけどIPv4アドレスとかアサインしてくれない？とRequestを送っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/98f4b494-6982-1c08-e487-96bd6afa056e.png)

ちなみにWiresharkだと以下の様に見えます。Wiresharkだと必要なパラメータだけ詳細展開できるので、特定の部分だけを見たい場合はWiresharkを使ったほうが見やすいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/4d6591f4-ab24-019a-6720-4b3ab04ea097.png)

以上の様に膨大な情報がやりとりされているので全部を一度に理解する必要はないと思いますが、JSONでテキストなのでデコードしたメッセージを眺めて、このパラメータの意味はなんだろうと調べていくと理解が深まるのではと思います。

#5. 最後に

今回はHTTP/2の部分を少し細かく見てみました。3GPPのコールフローと比較しながら一通りすべてのメッセージのパラメータの展開をして見ていくとより良いと思います。

次回はUERANSIMをInstallしてUE+gNodeBとfree5gcをインテグレーションしてみます。

https://qiita.com/wzm/items/b17dfaf72838154facb1