이제 RFsimulator를 사용해 동일한 종단간 OAI 5G 구성에서 여러 개의 OAI nrUE를 설정하고 실행해보자.
여기서는 OAI CN5G와 OAI RAN이 이미 배포되어 있다고 가정한다.
기본적인 OAI nrUE 구성 및 배포는 아래 블로그에 정리해두었다.
https://gksyb4235.tistory.com/23
OAI 5G - OAI RAN - FlexRIC Setup 방법
https://hackmd.io/@praveeng/6GMLAB-OAI-5G-SETUP-GUIDE OAI 5G SA setup Guide - HackMDSteps to setup OAI 5G SA and the following checklist.hackmd.iohttps://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/develop/doc/NR_SA_Tutorial_OAI_CN5G.md doc/NR_SA_Tutor
gksyb4235.tistory.com
RFsimulator를 사용하는 동일한 종단 간 OAI 5G 환경에서 여러 개의 OAI nrUE를 설정하고 실행하는 방법에 관한 것이다.
이 튜토리얼은 OAI CN5G와 OAI RAN이 이미 배포되어 있다고 가정한다.
gNB와 5G Core Setting
OAI Core Network(5GC) 실행
먼저 5G 코어 네트워크를 구동한다.
OAI CN5G는 Docker Compose 기반으로 구성되어 있어 각 네트워크 기능(AMF, SMF, UPF, NRF 등)을 컨테이너로 실행한다.
# 코어 네트워크 실행
cd ~/oai-cn5g
docker compose up -d

이 명령어로 백그라운드에서 코어 네트워크 컨테이너들이 올라가며, gNB와 UE가 접속할 수 있는 5G 핵심망 환경이 준비된다.
gNB(Base Station) 실행
코어 네트워크가 준비되면 다음으로 기지국 역할을 하는 gNB를 실행한다.
# gNB 실행
cd ~/openairinterface5g/cmake_targets/ran_build/build
sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf --gNBs.[0].min_rxtxtime 6 --rfsim
이 명령어는 OAI의 nr-softmodem을 사용해 gNB를 실행하는 과정이다.
- -O: gNB 설정 파일 지정
- band78: 3.5GHz 대역 사용
- 106PRB: 대역폭 설정
- usrpb210.conf: USRP B210 기준 설정 파일
- --rfsim: 실제 RF 장비 없이 RF Simulator 모드 실행


즉 실제 SDR 장비 없이 소프트웨어 기반으로 5G 무선망을 테스트할 수 있다.
Multi-UE를 gNB에 연결하는 방법
구체적인 내용은 아래 튜토리얼 참고
doc/NR_SA_Tutorial_OAI_multi_UE.md · develop · oai / openairinterface5G · GitLab
Openairinterface 5G Wireless Implementation
gitlab.eurecom.fr
첫 번째 5G 단말 실행
코어 네트워크와 gNB를 실행한 뒤에는 실제 단말 역할을 하는 UE를 실행한다.
여기서는 OAI의 nr-uesoftmodem을 사용해 UE1을 RF Simulator 환경에서 구동한다.
cd ~/openairinterface5g/tools/scripts
sudo ./multi-ue.sh -c1
sudo ./multi-ue.sh -o1
먼저 multi-ue.sh 스크립트를 이용해 UE1 실행을 위한 네트워크 네임스페이스 또는 컨테이너 환경을 준비하고,
해당 UE 환경 안으로 진입한다.
그 안에서 다음 명령어로 uesoftmodem을 실행한다.
cd ~/../home/gksyb/openairinterface5g/cmake_targets/ran_build/build
./nr-uesoftmodem \
-O /home/gksyb/openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue1.conf \
-r 106 \
--numerology 1 \
--band 78 \
-C 3619200000 \
--rfsim \
--uicc0.imsi 001010000000001 \
--rfsimulator.serveraddr 10.201.1.100 \
--telnetsrv \
--telnetsrv.listenport 9095
이 명령어는 UE1을 gNB에 접속시키기 위한 설정이다. 주요 옵션은 다음과 같다.
- -O ue1.conf는 UE 설정 파일을 지정한다.
- -r 106은 106 PRB 설정을 의미하며, gNB 설정과 맞춰야 한다.
- --numerology 1은 30kHz subcarrier spacing을 사용한다는 의미다.
- --band 78은 5G NR n78 대역을 사용한다는 뜻이다.
- -C 3619200000은 중심 주파수를 3.6192GHz로 설정한다.
- --rfsim은 실제 무선 장비 없이 RF Simulator로 gNB와 통신하게 한다.
- --uicc0.imsi 001010000000001은 UE의 IMSI를 지정한다. 이 값은 코어 네트워크의 가입자 정보와 일치해야 정상적으로 Registration이 가능하다.
- --rfsimulator.serveraddr 10.201.1.100은 RF Simulator 서버 역할을 하는 gNB의 주소를 지정한다.
- --telnetsrv와 --telnetsrv.listenport 9095는 UE 제어용 telnet 서버를 열고, 포트를 9095로 지정하는 옵션이다.

정리하면, 이 단계는 UE1을 RF Simulator 환경에서 실행해 앞서 띄운 gNB와 5G Core Network에 접속시키는 과정이다.
성공하면 UE Registration과 PDU Session Establishment가 진행되고,
이후 UE 네임스페이스에서 ping이나 iperf 테스트를 할 수 있다.

UE를 실행해 gNB에 접속시키자, 기존 gNB의 대기 상태 로그(E2 Setup retry)가 사라지고 UE의 RNTI, RSRP, UL/DL 전송량 등이 표시되는 활성 접속 로그로 전환되었다.
이는 UE와 gNB 간 무선 연결이 정상적으로 성립되었음을 의미한다.
UE RNTI b637
in-sync
RSRP -44
dlsch_rounds ...
ulsch_rounds ...
TX/RX bytes ...
위와 같은 형태의 로그인데, 이는 실제 UE가 붙은 이후 나오는 활성 무선 로그다.
- UE RNTI b637: UE에게 할당된 무선 식별자(C-RNTI)다. 즉 gNB가 UE를 인식했다는 뜻이다.
- in-sync: gNB와 UE 간 timing synchronization 완료. 무선 링크 정상.
- RSRP -44 dBm: 신호 세기 매우 좋음. rfsim 환경이라 거의 이상적 수치가 나온다.
- dlsch_rounds ...: Downlink 데이터 전송 통계.
- ulsch_rounds ...: Uplink 데이터 전송 통계.
- TX / RX bytes: 실제 패킷 송수신 중이라는 뜻이다.
UE가 접속하면 gNB는 다음 작업을 시작한다.
- Random Access 처리
- RRC Connection Setup
- NAS Registration
- DRB 생성
- UL/DL 스케줄링 시작
- PHY/MAC 통계 실시간 출력
그래서 idle 로그가 사라지고 UE 중심 통계 로그로 바뀐다.
두 번째 5G 단말 실행
이어서 마찬가지로 2번째 단말도 등록한다.
cd ~/openairinterface5g/tools/scripts
sudo ./multi-ue.sh -c2
sudo ./multi-ue.sh -o2
cd ~/../home/gksyb/openairinterface5g/cmake_targets/ran_build/build
./nr-uesoftmodem \
-O /home/gksyb/openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue3.conf \
-r 106 \
--numerology 1 \
--band 78 \
-C 3619200000 \
--rfsim \
--uicc0.imsi 001010000000003 \
--rfsimulator.serveraddr 10.202.1.100 \
--telnetsrv \
--telnetsrv.listenport 9096

즉 두 번째 UE가 접속하면서 gNB가 새로운 C-RNTI를 할당했다 (RNTI 1066)
RNTI는 셀 내에서 각 UE를 구분하는 무선 계층 식별자다. 쉽게 말하면 기지국 내부에서 UE마다 붙는 임시 ID다.

이제 gNB 로그에서 확인할 수 있듯이 단일 UE 상태에서 다중 UE 상태로 전환되었다.
UE1 (RNTI b637)만 붙어있던 환경에서 UE2 (RNTI 1066) 까지 동시에 스케줄링하고 있다.
두 번째 UE에는 코어망 관점에서 CU-UE-ID 2가 부여되어 RAN과 Core 양쪽 모두 2번째 가입자를 인식했다.
(CU-UE-ID는 RRC/CU 측 UE 관리 번호다.)
로그의 TX/RX bytes, dlsch_rounds, ulsch_rounds는 일반적으로 “순간 실시간 throughput 표시기”라기보다 gNB 실행 이후 현재 시점까지 얼마나 전송했는지 누적해서 보여주는 값이다.
여기서 TX와 RX의 의미는 다음과 같다.
- TX = gNB가 해당 UE에게 내려보낸 데이터량 (Downlink)
- RX = gNB가 해당 UE로부터 받은 데이터량 (Uplink)
즉 UE가 uplink를 훨씬 많이 보낸 상태다.
RX가 더 많은 이유는 UE가 주기적으로 보내는 제어/상태 메시지 때문이다.
UE는 붙어 있는 동안 uplink로 다음 신호를 계속 보낸다.
- Scheduling Request
- Buffer Status Report
- CSI / CQI / HARQ feedback
- RRC/NAS signaling
- keepalive 성격 패킷
멀티 UE attach 직후엔 이런 uplink signaling이 많다.
iperf3로 Downlink 트래픽 생성
이제 iperf3를 이용해서 gNB에서 UE로 가는 Traffic 흐름을 만들 차례.
이를 위해 일단 UE 주소부터 알아야 한다.
sudo ip netns exec ue1 ip route
sudo ip netns exec ue2 ip route

첫 번째 UE의 주소는 10.0.0.2, 두 번째 UE의 주소는 10.0.10.2이다.
이 주소는 정확하게는 각 UE에 할당된 PDU Session IP(데이터 통신용 UE 주소)라고 보면 된다.
이제 Downlink 트래픽을 iperf3 server(oai-ext-dn) → UPF → gNB → UE1의 순서로 생성할 차례.
서버는 oai-ext-dn에 열고, UE namespace에서 iperf3 client를 실행하되, -R 옵션을 넣어야 한다.
서로 다른 2개의 터미널을 열고 다음을 수행한다.
docker exec -it oai-ext-dn bash
iperf3 -s -p 5201
docker exec -it oai-ext-dn bash
iperf3 -s -p 5202
이제 UE1의 Downlink CSV 트래픽을 실행한다.
관련된 Traffic은 GAN을 이용하여 생성된다: https://github.com/0913ktg/5G-Traffic-Generator
GitHub - 0913ktg/5G-Traffic-Generator
Contribute to 0913ktg/5G-Traffic-Generator development by creating an account on GitHub.
github.com
CSV 파일에 맞춰서 iperf를 이용해서 UE1에게 Downlink로 트래픽을 전송할 수 있다.
UE1의 경우 명령어는 다음과 같다.
python3 run_traffic.py \
--csv afreeca_dataset_dl_mbps.csv \
--server-ip 192.168.70.135 \
--server-port 5201 \
--netns ue1 \
--bind-ip 10.0.0.2 \
--interval 1 \
--pkt-len 1200 \
--max-rows 300


gNB로그를 확인하면 다음과 같다.
[E2 AGENT]: E2 SETUP REQUEST timeout. Resending again (tx)
[NR_MAC] Frame.Slot 0.0
UE RNTI 4e3e CU-UE-ID 1 in-sync PH 48 dB PCMAX 20 dBm, average RSRP -44 (16 meas)
UE 4e3e: UL-RI 1, TPMI 0
UE 4e3e: dlsch_rounds 214789/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (0) 28 CCE fail 87
UE 4e3e: ulsch_rounds 90329/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 27 (Qm 6 deltaMCS 0 dB) NPRB 5 SNR 50.5 dB CCE fail 0
UE 4e3e: MAC: TX 277389300 RX 7597380 bytes
UE 4e3e: LCID 1: TX 576 RX 332 bytes
UE 4e3e: LCID 2: TX 0 RX 0 bytes
UE 4e3e: LCID 4: TX 259866791 RX 659372 bytes
UE RNTI ab63 CU-UE-ID 2 in-sync PH 48 dB PCMAX 20 dBm, average RSRP -44 (16 meas)
UE ab63: UL-RI 1, TPMI 0
UE ab63: dlsch_rounds 11456/0/0/0, dlsch_errors 0, pucch0_DTX 0, BLER 0.00000 MCS (0) 28 CCE fail 74
UE ab63: ulsch_rounds 38647/0/0/0, ulsch_errors 0, ulsch_DTX 0, BLER 0.00000 MCS (0) 28 (Qm 6 deltaMCS 0 dB) NPRB 5 SNR 50.5 dB CCE fail 0
UE ab63: MAC: TX 10786057 RX 930345 bytes
UE ab63: LCID 1: TX 578 RX 342 bytes
UE ab63: LCID 2: TX 0 RX 0 bytes
UE ab63: LCID 4: TX 10321222 RX 78755 bytes
로그 초반과 후반을 비교하면:
- UE1 MAC TX: 277,389,300 → 280,020,109 bytes
증가량 약 2.63 MB - UE2 MAC TX: 10,786,057 → 13,243,321 bytes
증가량 약 2.46 MB
즉 이 구간에서는 두 UE 모두 Downlink 데이터를 받고 있고, 증가량도 거의 비슷하다.
다만 누적 총량은 UE1이 훨씬 크다. UE1이 더 먼저/더 오래 트래픽을 받았기 때문이다.
또 LCID 4가 크게 증가하고 있다.
LCID 4는 사용자 데이터 트래픽 쪽으로 보면 되므로, iperf Downlink 패킷이 실제로 DRB를 통해 내려가고 있다는 증거다.
반면 LCID 1, LCID 2는 거의 변하지 않아서 제어 메시지가 아니라 실제 user-plane 트래픽이 중심이다.
'RAN CN 테스트베드 구축 > OAI+Free5GC (RAN-Core)' 카테고리의 다른 글
| 5G Network Slicing QoS 실험을 위한 Multi-UE 환경 구축 (0) | 2026.04.30 |
|---|---|
| 실제 UE 5G Traffic Dataset 기반으로 바라본 Network Slicing (0) | 2026.04.29 |
| VMware 환경에서 OAI gNB ↔ free5GC 연동하기 (NG Setup) (0) | 2026.04.28 |
| VM에 Free5GC Docker Compose 설치하기 (0) | 2026.04.26 |
| OAI RAN + Free5GC 환경에서 AI Agent로 네트워크 슬라이스를 통합 제어 Prototype 설계 (0) | 2026.04.23 |