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

前回はfree5gcを構築してテストコールを行いました。

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

今回はテストコールの結果を詳しく見ていきましょう。

# 1. 5GCで使われるコールフロー

例の如く巨人の肩にのるため他の方の説明を引用します。

https://qiita.com/kuro227/items/bf2e63a16355ecec5257



# 2. 実際にみてみる

という訳で読んでも分からないなら動かしてみるのが一番です。
前回と同じtest.shを使いますが、今回はfree5gc内を流れるパケットを実際に追ってみます。
まずはパケットキャプチャの準備としてテキストベースのtsharkをインストールします。

```
q14537@free5gc:~$ sudo apt install tshark
```

そしてキャプチャ取得。ターミナルを２つ開いて１つのターミナルで以下の様にtsharkを起動しておいて、もう1つのターミナルでtest.shを実行します。取得したキャプチャは5G_registration.pcapというファイル名で保存されます。

```
q14537@free5gc:~$ tshark -i any -w 5G_registration.pcap 
```
以下の様にtmuxを使って画面分割してもよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/e24f39b8-89b9-84f1-f579-d6967acee803.png)


# 3. wiresharkで開いてみる

tsharkだけでも解析はできますがやはりGUIが便利なのでtsharkでキャプチャしたファイルをホストWindowsマシンにsftpしてWindows上に別途InstallしたWiresharkで読み込ませてみます。

https://www.wireshark.org/download.html

色々なパケットがキャプチャされているのですが、フィルターで注目すべきプロトコルだけに絞ってみます。
先に一部のメッセージが暗号化されていてうまくデコードしてくれないので、Wiresharkメニューの編集->設定->ProtocolsでNAS-5GSを探し、以下のNAS-5GSのメニューで"Try to detect..."のチェックボックスをチェックします。
その後フィルター部分に"sctp||ngap||pfcp||gtp"と入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/dbcdb1c9-88ab-27d7-4e81-e45a1ee1bcdc.png)


以下は例です。何やら見慣れないプロトコルが出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/4db2e5b3-bc56-5463-44b1-10aa8cfb4f1a.png)


一部localのLoopbackアドレス同士で通信しているのでわかりにくいのですが、以下が対応表です。

|IP Adress:Port  |Entity  |
|---|---|
|127.0.0.1:9487   |gNodeB(5G基地局)
|127.0.0.1:38412  |AMF
|10.200.200.1 |SMF
|10.200.200.101 |UPF
|60.60.0.1 |UE
|60.60.0.101 |DN上の何かサーバ等 

このあたりの設定は各NFのconfigurationのyamlファイルに記載されています。
以下AMFの例の抜粋

```yaml
q14537@free5gc:~/free5gc/config$ cat amfcfg.yaml
info:
  version: 1.0.0
  description: AMF initial local configuration

configuration:
  amfName: AMF # the name of this AMF
  ngapIpList:  # the IP list of N2 interfaces on this AMF
    - 127.0.0.1
  sbi: # Service-based interface information
    scheme: http # the protocol for sbi (http or https)
    registerIPv4: 127.0.0.18 # IP used to register to NRF
    bindingIPv4: 127.0.0.18  # IP used to bind the service
    port: 8000 # port used to bind the service
  serviceNameList: # the SBI services provided by this AMF, refer to TS 29.518
    - namf-comm # Namf_Communication service
    - namf-evts # Namf_EventExposure service
    - namf-mt   # Namf_MT service
    - namf-loc  # Namf_Location service
    - namf-oam  # OAM service
  servedGuamiList: # Guami (Globally Unique AMF ID) list supported by this AMF
    # <GUAMI> = <MCC><MNC><AMF ID>
    - plmnId: # Public Land Mobile Network ID, <PLMN ID> = <MCC><MNC>
        mcc: 208 # Mobile Country Code (3 digits string, digit: 0~9)
        mnc: 93 # Mobile Network Code (2 or 3 digits string, digit: 0~9)
      amfId: cafe00 # AMF identifier (3 bytes hex string, range: 000000~FFFFFF)
```
# 4. 5GCで使用されるプロトコル

前回の5GCアーキテクチャでも参照した図に各NF間で使用されるプロトコルをマッピングした図が以下です。
今回は紫で記載している部分が見えてる事になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/b5287983-1ab0-1009-48fc-5e49481f5816.png)

|プロトコル名略称  |フルネーム  |
|---|---|
|GTP|GPRS Tunneling Protocol|
|NGAP|NG Application Protocol|
|NAS|Non-Access Stratum|
|PFCP|Packet Forwarding Control Protocol |
|SCTP|Stream Control Transmission Protocol|
|HTTP2|Hypertext Transfer Protocol Version2|

# 5 コールフロー詳細

## 5.1 Registration手順

3GPP(TS23.502)の以下の図が参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/6c7fe131-b464-a2cf-5c78-782880e11035.png)

上記コールフローはOld AMFとNew AMFの間のやりとりが記載されていますが、今回はOld AMFは無視してOKです。RANとNew AMFの間のやり取りに注目しましょう。微妙に3GPPのコールフローとは合わないのですが、コールフローの1,6,7,9,11,21,22の部分がキャプチャの以下の部分に対応しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/70473b1e-0713-1227-caa6-34619e93a8f8.png)

ひとつひとつのメッセージにどんなパラメータが含まれいてるかは3GPPと睨めっこしながら勉強していくしかないのですが、例えば#1125のRegistration Requestを開くと以下の様にSUCI(Subscription Concealed Identifier)というパラメータが含まれており、端末の固有識別番号をネットワークに送信し認証をこの番号に対して行う依頼をしている事がわかります。この例では0-208-93-0-0-0-00007487がSUCIになります。SUCIはIMSIをもとに作成されています。IMSI=2089300007487です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/f8c5c35f-4322-9b6c-7fca-d4da5c7c9310.png)

その他色々解説しているとキリがないのですがこの辺りは以下の記事も参考になります。

https://sgforum.impress.co.jp/article/5146?page=0%2C3

事業者国番号と事業者コードのPLMN ID=MCC+MNCだけ覚えておきましょう。今回の例はMCC=208:MNC=93でWiresharkはFranceのThales Communicationとデコードしてくれています。なぜにタレスなのかは謎。この部分が事業者毎に割り振られている番号ですので例えば日本のソフトバンクならMCC=440:MNC=20を使用したりします。

### 5.1.1 認証メカニズム

5GCの認証方式は5G AKAとEAP-AKA’認証があるのですが、このtest.shでは5G AKAを使う様になっています。両社の微妙な違いはとりあえずおいておいて#1356と#1357のパケットのやり取りを見てみましょう。AMF側から以下のパラメータ（秘密の暗号のヒントの様な物を端末に送信し、端末側が返してくる答えが合っているかどうかをAMF経由でAUSFに送信して認証をしています。様は”山”
と言ったら”川”が返ってくるかを試してます。

AMF->UEチャレンジ送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/a3cee140-c852-0d1c-e40a-97e708ee4993.png)

UE->AMFチャレンジ応答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/1975c629-01a3-a674-f828-fe950000c68c.png)


## 5.2 PDU Session Establishment手順

Registrationが成功=5GCに端末が認証され無事登録された=携帯サービスが使えるという事ですので、次にPDU Sessionと呼ばれるパケット通信が出来る通り道を確立する手順にいきます。

3GPP(TS23.502)の以下の図が参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/2bbec5e0-eb8a-7b0c-972a-a22649f8c72e.png)

キャプチャの以下の部分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/58ffb1a2-becc-63af-e793-f179d94974f5.png)

PDU Session Establishment Requestの中にどんなサービスを受けたいかの詳細が含まれています。この例ではIPv4で繋げたいのでIPアドレスを割り振ってくれないか等々の要求が入っています。また5GではDNN(Data Network Name)と呼ばれる4GでのAPN相当のパラメータを使ってどこのData Networkを使って外部(5GCのその先)と通信するかを指定します。DNNの指定を変える事で出先のネットワークを変える事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/9b6f879e-af8f-bb96-a3c6-b7de5f090bc4.png)



5GC側ではこのUEからの要求をもとにUEに割り振るIPアドレスを払い出します。実際に行うのはSMFです。その他パケットの通り道のQoSパラメータ等も返信します。以下が#2555のメッセージに含まれいてるPDU Session Establishment Responseの中のUEにIPアドレス=60.60.0.1を割り振っているところです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/6049870c-cc6f-5056-758f-8c854bf2b4ce.png)

その後無事にUEに60.60.0.1が割り振られましたのでこのアドレスをソースとしてPINGを60.60.0.101に送っているところが見えます。コールフロー図のFirst Uplink DataとFirst Downlink Dataに該当する部分です。UEが送るユーザーからのペイロードの事をU-planeデータといいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/baa4b4dc-193a-cdd1-3fe3-ebf2ac017097.png)

U-planeのデータはGTPというトンネリングプロトコルを使用して運ばれます。UEとUPFの間でトンネルを作るのです。UPFがDNとのGatewayとなってGTPヘッダをつけたり、外したりします。以下の様に実際のペイロード(ICMP)がGTPの上に乗っかっているのがわかります。GTPの通信のIPアドレス(10.200.200.1<->10.200.200.102)とペイロードで使用するIPアドレス(60.60.0.1<->60.60.0.101)が全然別なのが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241184/fef81914-305f-da48-9871-79c43b153b02.png)


# 6.最後に

よく見たらRegistrationしてますが、最後にDeregistrationしてなかったですね。。UEがIP通信始めたらいきなりシグナルロストになったイメージですね。。

SMF<->UPF間のPFCPについては解説しませんでしたが、後日追記するかもです。。
実際のPINGメッセージはUPFを通ってDN(Data Network)に出ていきます。簡単に言うと、その為の通り道の設定をSMFがUPFにPFCPを使って指示出しをしているのです。

今回はUE/gNB<->AMF(5GC)間を中心にやりとりを見ましたが、次回は5GC内部を詳細にみてみましょう。

https://qiita.com/wzm/items/043f33a73dd129bd2aea