# 專題簡報大綱
:::warning
[專題影片參考](https://www.youtube.com/watch?v=z-3Gve0HH_0)
:::
## Checklist
- 專題簡介
- [ ] 成果預期
- [ ] 實作流程簡介
- 專題報告
- [x] 5G 核心網路簡介
- [ ] 條列並比較目前開放免費使用的核心網路 (與第一點合併)
- [ ] 簡述為何選擇 free5gc (與第一點合併)
- [x] 介紹 free5gc, UERANSIM, 我們架設的環境
- [ ] 網路架構圖介紹 (和環境合併)
- [ ] 實作的流程以及結果 (簡化內容)
- [x] 結果分析及驗證假設 (保留)
- [x] 紀錄Demo流程
- 用影片或是投影片動畫呈現demo流程
## 專題簡介
### 成果預期
1. 架設出 5G 核心網路並了解其運作機制
2. 透過自行撰寫程式以更詳細的了解封包轉送的順序
3. 架設出可以讓手機使用並通訊的核心網路
### 實作流程簡介
1. 根據 [free5gc](https://www.free5gc.org/installations/stage-3/) 官網的下載流程安裝核心網路 ([專案 github 連結](https://github.com/free5gc/free5gc))
2. 設定完成核心網路後前往 [UERANSIM github](https://github.com/aligungr/UERANSIM) 取得 UE/RAN 的模擬器
3. 先嘗試在僅有一個 UE 的狀況下對外部網路連線,確認核心網路可以運作
4. 接著嘗試在兩個 UE 的狀況下彼此互相連線及對外部網路連線
5. 比較通過預設網路卡及核心網路的網路延遲影響
6. 嘗試自行撰寫程式讓兩台 UE 可以透過核心網路互相通訊
## 專題報告
### 5G 核心網路簡介
#### 核心網路是甚麼?
核心網路是整個網路架構的中心部分,是許多網路元件的集合體,每個元件都有其被賦予的功能,在核心網路中被稱為 Network Function (NF) ,眾多元件的合作與溝通即形成核心網路,用實際一點的例子來舉例,就是電信業者所架設的機房。

核心網路可以把 local area networks (LANs) 及 wide-area networks (WANs) 連結起來,目的是傳送大規模、遠距離的資料,並確保其穩定性及效能。
#### 4G 與 5G 核心網路的差異
##### Reference
[Evolution of Core Network(3G vs. 4G vs. 5G)](https://medium.com/@sarpkoksal/core-network-evolution-3g-vs-4g-vs-5g-7738267503c7)
[當SDN遇上NFV 虛擬化5G核心網路掀革](https://www.2cm.com.tw/2cm/zh-tw/tech/EE1AD67D7C08456CAE1D35B89F89AACE)
由於 Software-Defined Networking (SDN) 及 Network-Function Virtualization (NFV) 技術的發展, 5G 核心網路比起 4G 核心網路多了不少虛擬化的網路元件 (Network Function , NF) ,這樣帶來的好處有 3 :
1. 減少實體設備所需要的成本
2. 較容易維護,不需要關閉服務就能進行
3. 網路的穩定性更高,若其中一個 NF 故障,只需用其他 VM 去替補即可維持服務。
```
5G 的元件將原先 4G 的元件分工的更加細緻
如 4G 的 MME 變為 5G 的 AMF, SMF
4G 的 S-GW 和 P-GW 變為 5G 的 UPF
```
### 條列並比較目前開放免費使用的核心網路
目前我們知道的開放使用 5G 核心網路有以下幾種
[開放的 5G 核心網路清單](https://open5g.info/core/)
#### free5GC
由[國立陽明交通大學通訊服務與軟體研究中心](https://cslab.cs.nycu.edu.tw/index.php/projects/)主持
[此專案](https://github.com/free5gc/free5gc)至今仍然持續維護
此專案歷經三個版本的改良,最新版本中僅包含 5G 核心網路的 NF ,不具有 4G 核心網路的架構。
目前的功能僅限於網路上,不具有通話的功能。
~~與 UERANSIM (用戶裝置模擬器)配合~~
#### OMEC
由 [Open Networking Fundation](https://opennetworking.org/org-structure/) 主持維護
[此專案](https://github.com/omec-project)目前也持續維護
屬於[ COMAC ](https://opennetworking.org/comac/)底下的其中一個專案
COMAC 架構圖如下

可以看出此專案較為接近商業用的版本,除了核心網路本身之外,還在網路服務的方向做了許多功能,使其更貼近商用的目的。
除了 OMEC 專案以外,其他專案僅部分為開源 project 。
#### open5GS
[此專案](https://github.com/open5gs/open5gs)也持續維護
此專案基於 4G 核心網路進行改良,在安裝時可以根據指南選擇安裝的組態,一種是 4G/5G 的核網架構,另一種為純 5G 的架構。
底下的 VoLTE 有提供 call setup 的功能,功能相較於 free5GC 更為完善。
### 簡述為何選擇 free5gc
[科技部新聞---世界第一套符合國際標準的開放原始碼5G核心網路](https://www.most.gov.tw/folksonomy/detail/586f1127-cfd7-4da2-b24d-26197b5e0f34)
https://www.p1sec.com/corp/2021/12/31/pentesting-5g-core-networks/
https://read01.com/zh-tw/J843zAK.html#.YonlhKhBxPY
| | free5GC | OMEC | Open5GS |
|--------| -------- | -------- | -------- |
|優點|官方文件整理得較易懂|功能最多最齊全|指南詳盡、補充資料多|
| |架設流程最簡單| | 延伸功能多,且有文件教學 |
|缺點 |功能相對單調 | 安裝上相對困難|文件有些凌亂|
| ||官方文件雜亂無章||
| free5GC | OMEC | Open5GS |
| -- | -- | -- |
| 台灣研發 | 國際組織 | 韓國研發 |
| 全世界第一套完全依照3GPP Release 15國際標準的開放原始碼5G核心網路 | -- | -- |
| 安裝指南詳細+影片輔助 | 安裝指南複雜 | 安裝指南詳細但無影片輔助 |
| 硬體需求低 | 硬體需求高 | 硬體需求居中 |
| -- | 重視商用 | -- |
| 功能完善 | 功能較侷限 | 附加功能較多 |
free5GC: https://www.free5gc.org/installations/stage-3-free5gc/
OMEC:https://guide.opencord.org/prereqs/hardware.html
Open5GS:https://open5gs.org/open5gs/docs/tutorial/01-your-first-lte/
https://opennetworking.org/onf-connect-2019-resources/
因為我們深知核心網路相關議題之深與其複雜程度,在對核心網路一無所知的前提下,我們決定選擇 free5GC 做為研究的方向,原因無他,只因為其最好上手,較有可能是一介大學生可以涉足的程度。
### 介紹我們架設的環境
共有三台虛擬機,一台架設核心網路,兩台架設 RAN(GNodeB) 和 UE 的模擬器
- 架設核心網路的機器在底下架構圖中屬於最上面的 Core Network
- Core Network中有著許多元件,我們有修改過的僅有 AMF, UPF, SMF
- AMF 修改了 N2 的 IP 為 192.168.56.101 (本機 IP )
- SMF 修改了 UPF 的 N3 IP 為 192.168.56.101
- UPF 修改了 GTPU 的 IP 為 192.168.56.101
- 兩台模擬器分別是圖片左下角和右下角的黑框
- 裡面皆有一個 GnB 和 UE 的模擬器
- UE 和 GnB 之間的 tunnel IP 會在和 CN 連線時才決定(藍色字體 IP)
- GnB 設定 N2 和 N3 為本機 IP,以及 AMF 的位置為 192.168.56.101 (Core Network IP 位置)
### 網路架構圖介紹

Core Network中有著許多元件,每個元件都有他各自的用途
主要解釋 AMF, SMF, UPF 這三個元件
### 實作的流程以及結果
我們自己撰寫了一份程式,這隻程式可以讓兩台虛擬機透過核心網路互相傳送訊息和檔案
**必須從 103 開始此程式,這是因為這隻程式的架構依舊是 client-server 架構,我 hardcode 成 103 那端做為第一個 client 端**
這隻程式會創建出兩個 thread ,分別負責接收和傳送訊息。
* 文字傳輸
* 假設在 102 上輸入要傳文字的指令,102 上的傳送訊息端會和 103 的接收訊息端發一則訊息,跟 103 那邊的程式說接下來要準備接收文字。從 103 開始傳文字同理。
* 這段期間內可以不斷傳輸文字,直到傳送端從 user 收到停止傳輸指令
* 當傳送端接收到停止傳輸文字指令時,會傳輸一則訊息讓接收端可以關閉接收文字的功能
* 檔案傳輸
* 設置過程和文字傳輸同理
* 傳送端會等待 user 輸入要傳輸的檔案名字,輸入檔名後會傳給接收端
* 傳送端接著會傳輸檔案內容給接收端,傳送端已經傳送完檔案後接收端會多等一秒後才結束此次傳輸檔案
* 傳送端會繼續等待 user 輸入要傳輸的檔案名字,或是收到停止傳輸指令
* 收到停止傳輸指令後的動作和文字傳輸時相同
### 結果分析及驗證假設
:::info
介紹 tshark 工具,可指定攔截封包的介面卡及了解封包的在傳輸時的時間戳記變化,並藉由它協助分析封包傳輸順序
:::
#### 工具介紹: tshark
tshark 與 wireshark 的功能大致相同,可以藉由特定參數指定我們想要抓取的 interface 或是指定 IP 位置,我們在後續進行實驗時使用到以下參數:
* `-i <interface>`: 選定特定的 interface
* `-t <format>`: 設定輸出的 timestamp 格式,以下皆使用 `-t a`作為輸入參數,以顯示絕對時間
* `-f <filter>`: 設定攔截封包時的 filter
e.g. `-f "src 192.168.56.102"`, `-f "dst 192.168.56.102"`
* `-c <count> `: 設定最大攔截封包量,如 `-c 1` 代表僅攔截一個封包
::: info
tshark 是 wireshark 的無 GUI 版本
整體功能和 wireshark 相同,可針對各個 interface 攔截封包
也可在攔截或輸出時設置 filter 抓取特定來源或是特定目的地的封包
:::
* 分析互 ping 和我們自製程式執行時的封包傳輸順序
#### 結果假設
在我們設置核心網路的過程中,會先依序建立 GNB 及 UE ,若只建立 GNB 時先用 `ifconfig` 檢查,會發現 tunnel (`uesimtun0`) 尚未建立,
```shell
$ cd ~/UERANSIM
$ build/nr-gnb -c config/free5gc-gnb.yaml
$ ifconfig
```
```shell
#外網卡
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 │
inet6 fe80::a00:27ff:fe71:80f6 prefixlen 64 scopeid 0x20<link> │
ether 08:00:27:71:80:f6 txqueuelen 1000 (Ethernet) │
RX packets 19146 bytes 28323255 (28.3 MB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 4281 bytes 330622 (330.6 KB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │
│
#內網卡
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │
inet 192.168.56.103 netmask 255.255.255.0 broadcast 192.168.56.│
255 │
inet6 fe80::a00:27ff:fea7:2fe8 prefixlen 64 scopeid 0x20<link> │
ether 08:00:27:a7:2f:e8 txqueuelen 1000 (Ethernet) │
RX packets 165647 bytes 11151423 (11.1 MB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 541021 bytes 88881165 (88.8 MB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │
│
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 │
inet 127.0.0.1 netmask 255.0.0.0 │
inet6 ::1 prefixlen 128 scopeid 0x10<host> │
loop txqueuelen 1000 (Local Loopback) │
RX packets 84275 bytes 4604638 (4.6 MB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 84275 bytes 4604638 (4.6 MB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │
```
此時再建立 UE 後,即可在 `ifconfig` 中看到多了一個網路介面 `uesimtun0` 。
```shell
$ cd ~/UERANSIM
$ sudo build/nr-ue -c config/free5gc-ue.yaml
$ ifconfig
```
```shell
#外網卡
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 │
inet6 fe80::a00:27ff:fe71:80f6 prefixlen 64 scopeid 0x20<link> │
ether 08:00:27:71:80:f6 txqueuelen 1000 (Ethernet) │
RX packets 19146 bytes 28323255 (28.3 MB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 4281 bytes 330622 (330.6 KB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │
│
#內網卡
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 │
inet 192.168.56.103 netmask 255.255.255.0 broadcast 192.168.56.│
255 │
inet6 fe80::a00:27ff:fea7:2fe8 prefixlen 64 scopeid 0x20<link> │
ether 08:00:27:a7:2f:e8 txqueuelen 1000 (Ethernet) │
RX packets 165647 bytes 11151423 (11.1 MB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 541021 bytes 88881165 (88.8 MB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │
│
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 │
inet 127.0.0.1 netmask 255.0.0.0 │
inet6 ::1 prefixlen 128 scopeid 0x10<host> │
loop txqueuelen 1000 (Local Loopback) │
RX packets 84275 bytes 4604638 (4.6 MB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 84275 bytes 4604638 (4.6 MB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 │
│
#tunnel
uesimtun0: flags=369<UP,POINTOPOINT,NOTRAILERS,RUNNING,PROMISC> mtu 1400│
inet 60.60.0.2 netmask 255.255.255.255 destination 60.60.0.2 │
inet6 fe80::1d04:6930:f887:e4fa prefixlen 64 scopeid 0x20<link>│
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuele│
n 500 (UNSPEC) │
RX packets 39 bytes 3640 (3.6 KB) │
RX errors 0 dropped 0 overruns 0 frame 0 │
TX packets 40 bytes 2968 (2.9 KB) │
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
```
因此我們推論 `uesimtun0` 建立在本機(GNB 和 UE 間)而非核心網路所在的虛擬機上。
#### 驗證假設
為了驗證假設,我們先用 tshark 來抓取內網卡的封包。
```shell
#在核網虛擬機的內網卡截取封包
$ sudo tshark -i enp0s8 -t a | grep 60.60.0.2
```
輸出結果:
```shell
Capturing on 'enp0s8'
67 09:52:47.242659917 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=64
68 09:52:47.242744115 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=63
69 09:52:47.243838476 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=64 (request in 68)
70 09:52:47.243884277 10.0.2.15 → 60.60.0.2 GTP <ICMP> 170 Redirect (Redirect for host)
71 09:52:47.243903999 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=63
```
---
```shell
#在UE/RAN 102的內網卡截取封包
$ sudo tshark -i enp0s8 -t a | grep 60.60.0.2
```
輸出結果:
```shell
Capturing on 'enp0s8'
47 60 11:22:07.153655482 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=64
61 11:22:07.155416577 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=63 (request in 60)
```
---
```shell
#在UE/RAN 103的內網卡截取封包
$ sudo tshark -i enp0s8 -t a | grep 60.60.0.2
```
輸出結果:
```shell
Capturing on 'enp0s8'
37 1 09:52:47.231759080 60.60.0.1 → 60.60.0.2 GTP <ICMP> 142 Echo (ping) request id=0x0043, seq=1/256, ttl=63
2 09:52:47.232191412 60.60.0.2 → 60.60.0.1 GTP <ICMP> 142 Echo (ping) reply id=0x0043, seq=1/256, ttl=64 (request in 1)
3 09:52:47.232849427 10.0.2.15 → 60.60.0.2 GTP <ICMP> 170 Redirect (Redirect for host)
```
---
### Note
DNS outside Core Network
`-`: dash
`_`: underscore
` `: space
`/`: slash
`\`: backslash
---
## 0525
- [ ] 架構圖大小重拉
- [ ] 簡介AMF, SMF, UPF
- [x] 簡易網路架構加註全名
- [x] CN圖片
- [x] 表格順序調換
- [x] Terminal加註
## tmux basic hotkeys
[link](https://blog.gtwang.org/linux/linux-tmux-terminal-multiplexer-tutorial/)
| Hotkey | usage |
| --- | ---- |
| `Ctrl+b d` | detach tmux |
| `Ctrl+b c` | create new window |
| `Ctrl+b %` | Split pane horizontally |
| `Ctrl+b "` | Split pane vertically |
| `Ctrl+b x` | Close selected pane |
| `Ctrl+b w` | Show window list |
| `Ctrl+b &` | Close selected window |