1. 소개
스레드 및 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에 빈 페이지만 표시되면 브라우저에서 WebGL이 사용 설정되지 않은 것일 수 있습니다. WebGL을 사용 설정하는 방법은 https://superuser.com/a/836833을 참고하세요.
다음 섹션에서는 OTNS-CLI
및 OTNS-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
의 다양한 요소를 확인합니다.
5. 노드 추가
OTNS-CLI를 통해 노드 추가
시뮬레이션에 스레드 라우터를 추가합니다.
> add router 1 Done
OTNS-Web
에 생성된 노드가 표시됩니다. 노드는 라우터로 시작하여 몇 초 후에 리더가 됩니다.
대화형으로 시뮬레이션을 쉽게 시작할 수 있도록 각 새 OpenThread 노드는 기본적으로 표준 네트워크 매개변수 세트로 커미셔닝됩니다.
OTNS-CLI
를 통해 노드 추가
이제 다양한 유형의 노드를 추가해 보겠습니다.
> add fed 2 Done > add med 3 Done > add sed 4 Done
노드가 하나의 파티션으로 병합될 때까지 몇 초간 기다립니다. OTNS-Web
에 노드가 표시됩니다.
또한 OTNS-Web
에서 노드를 선택하여 노드에 관한 자세한 정보가 포함된 패널을 가져올 수 있습니다. 예를 들어 아래 그림에서는 노드 1이 선택되어 있습니다. 패널의 '역할' 항목에서 리더임을 확인할 수 있습니다.
OTNS-Web
로 노드 추가
OTNS-Web
를 통해 노드를 추가할 수도 있습니다. Action Bar
의 New Router
버튼을 클릭합니다. 선택한 노드의 오른쪽에 노드가 생성되는 것을 볼 수 있습니다. 새 라우터는 기존 스레드 파티션에 조인해야 합니다.
작업 표시줄에서 FED, MED, SSED, BR 버튼을 클릭하여 다른 유형의 노드를 만들 수도 있습니다. 이제 총 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
: 에 도달할 때까지
버튼을 클릭하여 시뮬레이션 속도를 높일 수 있습니다.
시뮬레이션 속도 저하
버튼을 클릭하면 시뮬레이션 속도를 느리게 할 수 있습니다.
시뮬레이션 일시중지
시뮬레이션이 실행 중일 때 버튼을 클릭하여 일시중지합니다. 버튼이
로 변경됩니다.
시뮬레이션 재개
일시중지된 시뮬레이션을 재개하려면 버튼을 클릭합니다. 버튼이 다시
로 변경됩니다.
시뮬레이션 속도를 10X
로 설정
시간을 절약하려면
OTNS-CLI
시뮬레이션 속도를
10X
네트워크의 토폴로지 변경사항을 훨씬 더 빠르게 관찰할 수 있습니다.
> speed 10 Done
7. 라디오 켜기/끄기
이제 시뮬레이션에는 라우터 (육각형 모양) 2대 이상, 경계 라우터 (정사각형 모양) 1대, 하위 요소가 여러 개 포함되어 있으며 10배 속도로 실행됩니다.
라우터 2대의 현재 리더 (빨간색 테두리)를 찾아 한 번 클릭하여 선택합니다.
무선 끄기
작업 표시줄에서 버튼을 클릭하여 리더 노드의 무선 기능을 사용 중지합니다. 리더는 무전기를 끄면 메시지를 보내거나 받을 수 없습니다.
다른 라우터 또는 보더 라우터가 새 리더가 될 때까지 약 12초 (시뮬레이션 시간으로 120초) 동안 기다립니다.
스레드 네트워크는 새 리더로 새 파티션을 형성하여 리더 실패에서 자동으로 복구됩니다. 새 파티션에는 새 파티션 색상도 있습니다.
무선 켜기
무선이 꺼진 리더를 선택합니다. Action Bar
의 버튼을 클릭하여 무선 연결을 복원합니다.
무선 연결이 복원된 후 리더가 네트워크에 다시 연결해야 합니다.
8. 노드 이동
OTNS를 사용하면 사용자가 OTNS-CLI
또는 OTNS-Web
를 통해 노드를 쉽게 이동할 수 있습니다.
OTNS-CLI
를 통해 노드 이동
경계 라우터 노드 9를 새 위치로 이동합니다.
> move 9 50 50 Done
OTNS-Web을 통해 노드 이동
노드 5를 드래그하여 오른쪽 하단으로 완전히 이동합니다. 이제 노드 5가 다른 라우터의 무선 범위를 벗어나므로 새 파티션 ID로 자체 파티션을 형성합니다. 파티션 ID는 노드를 클릭하여 노드 정보 패널에서 확인할 수 있습니다.
노드 5와 노드 9 사이에는 여전히 하나의 녹색 선이 그려집니다. 이는 이전 상위 요소의 하위 테이블에 여전히 유지되는 하위 요소에 관한 오래된 정보 때문인 경우가 많습니다. 또는 노드 9와 노드 5 간의 이전 라우터 간 연결에 관한 오래된 정보일 수도 있습니다. 이 경우 렌더링 버그일 수도 있습니다. 적절한 시간 제한이 지나면 노드에서 오래된 정보가 정리됩니다.
9. 노드 삭제
OTNS-CLI
를 통해 노드 삭제
노드 5를 삭제합니다.
> del 5 Done
노드 5가 시뮬레이션에서 사라집니다.
OTNS-Web
를 통해 노드 삭제
경계 라우터 노드 9를 선택하고 Action Bar
의 버튼을 클릭하여 노드 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_
입니다. 예를 들어 로그 파일 발췌 부분은 다음과 같습니다.
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 패킷 검사의 예는 아래 스크린샷을 참고하세요.
복호화 키를 구성하려면 메뉴에서 수정 -> 환경설정을 선택합니다. 그런 다음 환경설정 창에서 프로토콜 -> IEEE 802.15.4를 선택합니다. '복호화 키' 옆에 있는 수정... 버튼을 클릭합니다. +를 클릭하여 새 항목을 만들고 키 00112233445566778899aabbccddeeff
(32자)를 입력한 다음 '키 해시' 필드에서 '스레드 해시'를 선택합니다. '복호화 키 색인'은 0
으로 두어도 됩니다. 그런 다음 확인을 클릭한 후 확인을 다시 클릭합니다. 이제 OTNS PCAP 파일이 로드될 때 올바르게 복호화됩니다.
'시간' 열에 표시된 타임스탬프 (초)는 OpenThread 노드 로그에 표시된 절대 시뮬레이션 시간 값에 해당합니다. 이렇게 하면 로그 메시지를 전송되거나 수신된 무선 프레임과 더 쉽게 연결할 수 있습니다. 그러나 값은 일반적으로 마이크로초 단위의 정밀도까지 동일하지 않습니다. 시뮬레이션된 IEEE 802.15.4 무선 하드웨어는 OpenThread 스택에서 무선 프레임 전송을 요청한 후 약간의 지연을 추가할 수 있습니다.
12. 축하합니다
축하합니다. 첫 번째 OTNS 시뮬레이션을 실행했습니다.
OTNS 및 종속 항목을 설치하는 방법을 알아봤습니다. OpenThread 시뮬레이션 노드로 OTNS 시뮬레이션을 시작했습니다. OTNS-CLI
와 OTNS-Web
를 통해 다양한 방식으로 시뮬레이션을 조작하는 방법을 알아봤습니다.
이제 OTNS가 무엇인지, OTNS를 사용하여 OpenThread 네트워크를 시뮬레이션하는 방법을 알게 되었습니다.
다음 단계
다음 Codelab을 확인하세요.
- OpenThread로 스레드 네트워크 시뮬레이션
- Docker에서 OpenThread를 사용하여 Thread 네트워크 시뮬레이션
- nRF52840 보드 및 OpenThread으로 Thread 네트워크 빌드하기