OTNS를 사용한 스레드 네트워크 시뮬레이션

1. 소개

Thread 메시 네트워크 토폴로지의 개요

스레드 및 OTNS란 무엇인가요?

Thread는 기기 간 및 기기-클라우드 간 보안 통신을 지원하는 IP 기반 저전력 무선 메시 네트워킹 프로토콜입니다. 스레드 네트워크는 단일 장애점을 방지하기 위해 토폴로지 변경사항에 적응할 수 있습니다.

Google에서 출시한 OpenThread는 Thread의 오픈소스 구현입니다. 코드 크기와 메모리 사용량이 작지만 OpenThread는 Thread 사양에 정의된 모든 기능을 지원합니다.

OpenThread 네트워크 시뮬레이터 (OTNS)는 POSIX 플랫폼에서 시뮬레이션된 OpenThread 노드를 실행하여 Thread 네트워크를 시뮬레이션하는 데 사용할 수 있습니다. OTNS는 시뮬레이션된 Thread 네트워크를 시각화하고 운영하기 위한 간편한 웹 인터페이스 (OTNS-Web)를 제공합니다. Python을 사용한 스크립트 시뮬레이션도 가능합니다.

학습할 내용

  • OTNS 및 종속 항목 설치
  • OTNS-CLI 기본사항 알아보기
  • OTNS-Web에서 OpenThread 노드를 추가/이동/삭제하는 방법
  • OTNS-Web의 다른 유용한 기능을 사용하여 네트워크 시뮬레이션 제어
  • OpenThread의 단일 장애 지점 없음 확인
  • Wireshark에서 OpenThread 노드 간의 데이터 트래픽 보기

이 Codelab에서는 대화형 사용을 위한 OTNS-CLI 및 OTNS-Web에 중점을 둡니다. Python 스크립팅과 같은 OTNS의 다른 기능은 다루지 않습니다.

필요한 항목

  • Linux x86_64 또는 Homebrew가 설치된 Mac OS를 사용하는 것이 좋습니다. Windows WSL2의 Ubuntu 22/24도 작동하지만 설정을 수동으로 조정해야 할 수 있습니다.
  • Git.
  • 웹브라우저 OTNS-Web은 시뮬레이션을 표시하는 데 웹브라우저를 사용합니다.
  • 스레드 입문 이 Codelab에서 다루는 내용을 이해하려면 스레드의 기본 개념을 알아야 합니다.

용어

'라우터'라는 용어는 처음에는 Thread 라우터라고 불렸던 Thread 메시 확장기의 기술적 용어로 사용됩니다. '노드'는 OTNS 시뮬레이션에서 시뮬레이션된 OpenThread 기기를 의미합니다.

2. 설치

OTNS 코드 가져오기

$ git clone https://github.com/openthread/ot-ns.git ./otns
$ cd otns

이 Codelab의 후속 콘솔 명령어는 모두 otns 디렉터리에서 실행됩니다.

부트스트랩 및 설치

bootstrap 스크립트는 종속 항목 (필요한 경우 Python3 및 Go/Golang 포함)을 설치하고 OTNS를 설치합니다. 또한 시뮬레이션에서 직접 사용할 수 있는 다양한 OT 노드 유형을 빌드하고 몇 가지 기본 테스트를 실행합니다. 노드 빌드로 인해 몇 분 정도 걸릴 수 있습니다.

$ ./script/bootstrap
....
....
OTNS installed - use 'otns' to start it.
$

sudo의 비밀번호를 입력하라는 메시지가 표시될 수 있습니다.

otns가 올바르게 설치되지 않은 경우

스크립트에서 다음과 같은 오류를 보고할 수 있습니다.

....
OTNS installed - please add ~/go/bin to your PATH variable first, to use it.
$

이 경우 $PATH.$(go env GOPATH)/bin를 추가해야 합니다.

다른 오류의 경우 GitHub 문제를 만들 수 있습니다.

3. OTNS를 처음 실행합니다.

otns을 실행합니다.

$ otns
>_ ← OTNS-CLI prompt

OTNS가 성공적으로 시작되면 CLI 콘솔 (OTNS-CLI)로 전환되고 네트워크 시각화 및 관리를 위한 웹브라우저 (OTNS-Web)가 실행됩니다.

시작 시 OTNS-Web 창

OTNS-Web에 빈 페이지만 표시되면 브라우저에서 WebGL이 사용 설정되지 않은 것일 수 있습니다. WebGL을 사용 설정하는 방법은 https://superuser.com/a/836833을 참고하세요.

다음 섹션에서는 OTNS-CLIOTNS-Web를 통해 OTNS 시뮬레이션을 관리하는 방법을 알아봅니다.

4. OTNS-CLI 및 OTNS-Web 알아보기

OTNS-CLI

OTNS-CLI은 OTNS 시뮬레이션을 관리하기 위한 명령줄 인터페이스 (CLI)입니다.

$ otns
>_ ← OTNS-CLI prompt

OTNS-CLI를 통해 명령어를 입력할 수 있습니다. 전체 명령어 목록은 OTNS CLI 참조를 참고하세요. 이 Codelab에서는 이러한 명령어 중 일부만 사용합니다.

help 명령어를 입력하여 CLI 명령어 개요를 확인합니다. 이 목록은 CLI 참조와 동일합니다.

> help
add             Add a node to the simulation and get the node ID.
....
....
Done
> 

특정 명령어에 대한 자세한 도움말을 보려면 명령어 이름을 사용합니다. 예를 들면 다음과 같습니다.

> help add
add
  Add a node to the simulation and get the node ID.
  
Definition:
....
....
> 

OTNS-Web

OTNS-Web는 OTNS의 네트워크 시각화 및 관리 도구입니다. 시뮬레이션된 대화목록 네트워크의 노드, 메시지, 링크를 시각적으로 보여줍니다. OTNS-Web의 다양한 요소를 확인합니다.

OTNS-웹 요소 설명

5. 노드 추가

OTNS-CLI를 통해 노드 추가

시뮬레이션에 스레드 라우터를 추가합니다.

> add router
1
Done

OTNS-Web에 생성된 노드가 표시됩니다. 노드는 라우터로 시작하여 몇 초 후에 리더가 됩니다.

리더 역할의 노드 1개

대화형으로 시뮬레이션을 쉽게 시작할 수 있도록 각 새 OpenThread 노드는 기본적으로 표준 네트워크 매개변수 세트로 커미셔닝됩니다.

OTNS-CLI를 통해 노드 추가

이제 다양한 유형의 노드를 추가해 보겠습니다.

> add fed
2
Done
> add med
3
Done
> add sed
4
Done

노드가 하나의 파티션으로 병합될 때까지 몇 초간 기다립니다. OTNS-Web에 노드가 표시됩니다.

노드 4개가 있는 스레드 네트워크

또한 OTNS-Web에서 노드를 선택하여 노드에 관한 자세한 정보가 포함된 패널을 가져올 수 있습니다. 예를 들어 아래 그림에서는 노드 1이 선택되어 있습니다. 패널의 '역할' 항목에서 리더임을 확인할 수 있습니다.

노드 4개가 있는 스레드 네트워크, 노드 1이 선택됨

OTNS-Web로 노드 추가

OTNS-Web를 통해 노드를 추가할 수도 있습니다. Action BarNew Router 버튼을 클릭합니다. 선택한 노드의 오른쪽에 노드가 생성되는 것을 볼 수 있습니다. 새 라우터는 기존 스레드 파티션에 조인해야 합니다.

라우터가 추가되어 총 5개의 노드가 됩니다.

작업 표시줄에서 FED, MED, SSED, BR 버튼을 클릭하여 다른 유형의 노드를 만들 수도 있습니다. 이제 총 9개의 노드가 표시됩니다. 원하는 경우 일부 노드를 다른 위치로 드래그하여 다른 물리적 네트워크 토폴로지를 만들 수 있습니다.

총 9개의 새 노드가 추가되었습니다.

이제 여러 노드가 포함된 하나의 파티션으로 구성된 스레드 네트워크를 만들었습니다. 다음 섹션에서는 시뮬레이션 속도를 조정하여 시뮬레이션을 더 빠르게 실행합니다.

6. 속도 조정

현재 시뮬레이션은 1X 속도로 실행되고 있으므로 지금까지 경과한 시뮬레이션 시간은 첫 번째 노드를 만든 이후의 실제 시간과 같습니다.

OTNS-CLI를 통해 속도 조정

OTNS-CLI를 통해 시뮬레이션 속도를 조정할 수 있습니다.

시뮬레이션 속도를 100X로 설정

> speed 100
Done

노드가 이전보다 훨씬 더 자주 메시지를 전송하는 것을 볼 수 있습니다.

시뮬레이션 속도를 MAX로 설정

> speed max
Done

이제 OTNS는 최대한 빨리 시뮬레이션하기 위해 최선을 다하고 있으므로 노드에서 많은 메시지를 전송하는 것을 볼 수 있습니다.

시뮬레이션 일시중지

> speed 0
Done

시뮬레이션 속도를 0로 설정하면 시뮬레이션이 일시중지됩니다.

시뮬레이션을 정상 속도로 복원

> speed 1
Done

시뮬레이션 속도를 0보다 큰 값으로 설정하면 시뮬레이션이 재개됩니다.

OTNS-Web를 통해 속도 조정

속도 제어 버튼

Action Bar에서 속도 제어 버튼 속도 제어 버튼을 찾습니다. 이 버튼은 현재 시뮬레이션 속도를 표시하며 시뮬레이션 속도를 조정하고 시뮬레이션을 일시중지/재개하는 데 사용할 수 있습니다.

시뮬레이션 속도 높이기

속도가 MAX: MAX 시뮬레이션 속도 표시기에 도달할 때까지 속도 높이기 버튼 버튼을 클릭하여 시뮬레이션 속도를 높일 수 있습니다.

시뮬레이션 속도 저하

속도 감소 버튼 버튼을 클릭하면 시뮬레이션 속도를 느리게 할 수 있습니다.

시뮬레이션 일시중지

시뮬레이션이 실행 중일 때 일시중지 버튼 버튼을 클릭하여 일시중지합니다. 버튼이 재생 버튼로 변경됩니다.

시뮬레이션 재개

일시중지된 시뮬레이션을 재개하려면 재생 버튼 버튼을 클릭합니다. 버튼이 다시 일시중지 버튼로 변경됩니다.

시뮬레이션 속도를 10X로 설정

시간을 절약하려면

OTNS-CLI 시뮬레이션 속도를

10X 네트워크의 토폴로지 변경사항을 훨씬 더 빠르게 관찰할 수 있습니다.

> speed 10
Done

7. 라디오 켜기/끄기

이제 시뮬레이션에는 라우터 (육각형 모양) 2대 이상, 경계 라우터 (정사각형 모양) 1대, 하위 요소가 여러 개 포함되어 있으며 10배 속도로 실행됩니다.

라우터 2대의 현재 리더 (빨간색 테두리)를 찾아 한 번 클릭하여 선택합니다.

리더 노드 1이 선택된 스레드 네트워크

무선 끄기

작업 표시줄에서 라디오 끄기 버튼 버튼을 클릭하여 리더 노드의 무선 기능을 사용 중지합니다. 리더는 무전기를 끄면 메시지를 보내거나 받을 수 없습니다.

다른 라우터 또는 보더 라우터가 새 리더가 될 때까지 약 12초 (시뮬레이션 시간으로 120초) 동안 기다립니다.

노드 9가 새 리더로 새 파티션이 형성됨

스레드 네트워크는 새 리더로 새 파티션을 형성하여 리더 실패에서 자동으로 복구됩니다. 새 파티션에는 새 파티션 색상도 있습니다.

무선 켜기

무선이 꺼진 리더를 선택합니다. Action Bar라디오 켜기 버튼 버튼을 클릭하여 무선 연결을 복원합니다.

노드 1의 무선이 다시 켜진 후 파티션에 가입함

무선 연결이 복원된 후 리더가 네트워크에 다시 연결해야 합니다.

8. 노드 이동

OTNS를 사용하면 사용자가 OTNS-CLI 또는 OTNS-Web를 통해 노드를 쉽게 이동할 수 있습니다.

OTNS-CLI를 통해 노드 이동

경계 라우터 노드 9를 새 위치로 이동합니다.

> move 9 50 50
Done

OTNS-Web을 통해 노드 이동

노드 5를 드래그하여 오른쪽 하단으로 완전히 이동합니다. 이제 노드 5가 다른 라우터의 무선 범위를 벗어나므로 새 파티션 ID로 자체 파티션을 형성합니다. 파티션 ID는 노드를 클릭하여 노드 정보 패널에서 확인할 수 있습니다.

노드 5가 다른 노드에서 멀리 이동하여 새 파티션을 형성합니다.

노드 5와 노드 9 사이에는 여전히 하나의 녹색 선이 그려집니다. 이는 이전 상위 요소의 하위 테이블에 여전히 유지되는 하위 요소에 관한 오래된 정보 때문인 경우가 많습니다. 또는 노드 9와 노드 5 간의 이전 라우터 간 연결에 관한 오래된 정보일 수도 있습니다. 이 경우 렌더링 버그일 수도 있습니다. 적절한 시간 제한이 지나면 노드에서 오래된 정보가 정리됩니다.

9. 노드 삭제

OTNS-CLI를 통해 노드 삭제

노드 5를 삭제합니다.

> del 5
Done

노드 5가 시뮬레이션에서 사라집니다.

노드 5가 시뮬레이션에서 삭제됩니다.

OTNS-Web를 통해 노드 삭제

경계 라우터 노드 9를 선택하고 Action Bar삭제 버튼 버튼을 클릭하여 노드 9를 삭제합니다.

경계 라우터 노드 9가 삭제됨

Node 1가 새 파티션의 리더가 되고 나머지 모든 노드는 노드 1에 하위 요소로 연결됩니다.

10. OTNS-CLI 노드 컨텍스트

OTNS-CLI는 개발자가 노드의 상태를 진단하는 데 도움이 되도록 노드와 쉽게 상호작용할 수 있는 노드 컨텍스트 모드를 제공합니다. 또한 이 모드에서 노드 작업을 시작할 수 있습니다.

노드 컨텍스트 모드 시작

노드 1의 노드 컨텍스트를 입력합니다.

> node 1
Done
node 1>

CLI 프롬프트가 node 1>로 변경되어 현재 노드 컨텍스트를 나타냅니다. 노드와 직접 상호작용하는 것처럼 노드에서 실행할 OpenThread CLI 명령어를 입력할 수 있습니다.

노드 컨텍스트에서 명령어 실행

node 1> state
leader
Done
node 1> channel
11
Done
node 1> panid
0xface
Done
node 1> networkname
otns
Done
node 1> ipaddr
fdde:ad00:beef:0:0:ff:fe00:fc00
fdde:ad00:beef:0:0:ff:fe00:b400
fd00:f00d:cafe:0:2505:8719:3685:ebfb
fdde:ad00:beef:0:4fd9:b9ba:44e0:96cb
fe80:0:0:0:e86a:e07:ec97:777
Done

다른 노드 컨텍스트로 전환

node 1> node 2
Done
node 2> 

노드 컨텍스트 종료

node 1> exit
Done
>

노드 컨텍스트를 종료하는 다른 방법은 node 0 명령어입니다.

11. 노드 로그 및 패킷 캡처 보기

OpenThread 노드 로그

기본적으로 OTNS는 시뮬레이션된 모든 OpenThread 노드에 관한 자세한 로그 파일을 생성합니다. ./tmp 디렉터리에서 확인할 수 있습니다. 파일 이름은 0_.log입니다. 예를 들어 로그 파일 발췌 부분은 다음과 같습니다.

7616488 00:00:06.326 [I] MeshForwarder-: Received IPv6 UDP msg, len:90, chksum:5915, ecn:no, from:ca72650db7b856af, sec:no, prio:net, rss:-58.0
7616488 00:00:06.326 [I] MeshForwarder-:     src:[fe80:0:0:0:c872:650d:b7b8:56af]:19788
7616488 00:00:06.326 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:1]:19788
7616488 00:00:06.326 [D] Mle-----------: Receive MLE message
7616488 00:00:06.326 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7657544 00:00:06.367 [D] Mac-----------: ==============================[RX len=063]==============================
7657544 00:00:06.367 [D] Mac-----------: | 41 D8 7F CE FA FF FF 46 | 74 5A 33 9E 76 51 4E 7F | A......FtZ3.vQN. |
7657544 00:00:06.367 [D] Mac-----------: | 3B 02 F0 4D 4C 4D 4C 81 | E6 00 15 03 00 00 00 00 | ;..MLML......... |
7657544 00:00:06.367 [D] Mac-----------: | 00 00 00 01 46 86 7D FE | 06 CC DB 94 86 9C 88 0B | ....F.}......... |
7657544 00:00:06.367 [D] Mac-----------: | 1C 1E 26 9B 8D 21 2E 65 | 53 5A 43 4E A2 59 D6    | ..&..!.eSZCN.Y.  |
7657544 00:00:06.367 [D] Mac-----------: ------------------------------------------------------------------------
7657544 00:00:06.367 [I] MeshForwarder-: Received IPv6 UDP msg, len:84, chksum:81e6, ecn:no, from:4e51769e335a7446, sec:no, prio:net, rss:-48.0
7657544 00:00:06.367 [I] MeshForwarder-:     src:[fe80:0:0:0:4c51:769e:335a:7446]:19788
7657544 00:00:06.367 [I] MeshForwarder-:     dst:[ff02:0:0:0:0:0:0:2]:19788
7657544 00:00:06.367 [D] Mac-----------: Idle mode: Radio receiving on channel 11
7833912 00:00:06.543 [I] Mle-----------: AttachState ParentReq -> Idle
7833912 00:00:06.543 [N] RouterTable---: Allocate router id 12
7833912 00:00:06.543 [N] Mle-----------: RLOC16 fffe -> 3000
7833912 set node RLOC16: fffe -> 3000
7833912 00:00:06.543 [D] SubMac--------: RadioShortAddress: 0x3000
7833912 00:00:06.543 [N] Mle-----------: Role detached -> leader
7833912 00:00:06.543 [N] Mle-----------: Partition ID 0x24c35f10
7833912 00:00:06.543 [I] RouterTable---: Route table
7833912 00:00:06.543 [I] RouterTable---:     12 0x3000 - me - leader

절대 시뮬레이션 시간(마이크로초)이 왼쪽에 표시됩니다. hh:mm:ss 타임스탬프는 OpenThread 노드의 자체 로그 타임스탬프를 표시하며, 이는 절대 시뮬레이션 시간과 다를 수 있습니다.

Wireshark 패킷 캡처

기본적으로 전송된 모든 IEEE 802.15.4 프레임은 PCAP 파일 current.pcap에 캡처됩니다. 이 파일은 시뮬레이션 중 또는 후에 Wireshark에서 읽을 수 있습니다. Thread의 링크 레이어 암호화로 인해 OTNS의 복호화 키를 올바르게 설정하려면 Wireshark에서 일회성 구성 작업이 필요합니다. 기본적으로 Wireshark에서 프레임 복호화를 쉽게 할 수 있도록 잘 알려진 네트워크 키 하나가 사용됩니다.

Wireshark에서 OpenThread 패킷 검사의 예는 아래 스크린샷을 참고하세요.

Wireshark의 OpenThread 패킷 분석 스크린샷

복호화 키를 구성하려면 메뉴에서 수정 -> 환경설정을 선택합니다. 그런 다음 환경설정 창에서 프로토콜 -> IEEE 802.15.4를 선택합니다. '복호화 키' 옆에 있는 수정... 버튼을 클릭합니다. +를 클릭하여 새 항목을 만들고 키 00112233445566778899aabbccddeeff (32자)를 입력한 다음 '키 해시' 필드에서 '스레드 해시'를 선택합니다. '복호화 키 색인'은 0으로 두어도 됩니다. 그런 다음 확인을 클릭한 후 확인을 다시 클릭합니다. 이제 OTNS PCAP 파일이 로드될 때 올바르게 복호화됩니다.

'시간' 열에 표시된 타임스탬프 (초)는 OpenThread 노드 로그에 표시된 절대 시뮬레이션 시간 값에 해당합니다. 이렇게 하면 로그 메시지를 전송되거나 수신된 무선 프레임과 더 쉽게 연결할 수 있습니다. 그러나 값은 일반적으로 마이크로초 단위의 정밀도까지 동일하지 않습니다. 시뮬레이션된 IEEE 802.15.4 무선 하드웨어는 OpenThread 스택에서 무선 프레임 전송을 요청한 후 약간의 지연을 추가할 수 있습니다.

12. 축하합니다

축하합니다. 첫 번째 OTNS 시뮬레이션을 실행했습니다.

OTNS 및 종속 항목을 설치하는 방법을 알아봤습니다. OpenThread 시뮬레이션 노드로 OTNS 시뮬레이션을 시작했습니다. OTNS-CLIOTNS-Web를 통해 다양한 방식으로 시뮬레이션을 조작하는 방법을 알아봤습니다.

이제 OTNS가 무엇인지, OTNS를 사용하여 OpenThread 네트워크를 시뮬레이션하는 방법을 알게 되었습니다.

다음 단계

다음 Codelab을 확인하세요.

참조 문서