LwM2M과 Anjay의 통신이 간헐적으로 끊기는 현상이 발생하여 이와 관련하여 프로토콜의 개념에 대해 알아보고, 와이어샤크를 이용해 DTLS handshake를 확인한 내용입니다.

LwM2M에 대해

LwM2M (Lightweight M2M)은 경량화된 기기 간 통신 프로토콜로서, IoT (Internet of Things) 기기와 서버 간의 효율적인 통신을 위해 설계되었습니다.

LwM2M은 경량화된 프로토콜로, 리소스 제약이 있는 IoT 기기에서도 효율적으로 동작합니다. 작은 패킷 크기와 최소한의 대역폭을 사용하여 효율적인 통신을 제공합니다.

LwM2M은 RESTful 아키텍처를 기반으로 하며, HTTP/CoAP 프로토콜을 사용하여 기기와 서버 간 통신을 지원합니다.

Anjay에 대해

Anjay는 LwM2M 프로토콜을 구현한 오픈 소스 라이브러리로, C 언어로 작성되었습니다. 주로 임베디드 시스템 및 경량 IoT 장치에서 사용됩니다.

Anjay는 임베디드 디바이스에서 CoAP(Constrained Application Protocol)을 구현하기 위한 오픈 소스 라이브러리입니다. CoAP는 저전력 비동기 통신 프로토콜 입니다. UDP를 기반으로 비동기 통신을 사용합니다. Anjay는 mbedTLS를 사용하여 보안 기능을 제공합니다.

mbedTLS를 사용하여 보안 기능을 통합하는 것은 Anjay의 디바이스 측 보안 기능을 강화하는 데 도움이 되며, DTLS (Datagram Transport Layer Security)를 통한 CoAP 통신을 안전하게 구현하는 데 적합합니다.

mbedTLS 란

mbedTLS는 오픈 소스의 암호 라이브러리로, TLS(Transport Layer Security) 및 SSL(Secure Sockets Layer) 프로토콜을 구현하는 데 사용됩니다.

TLS 및 SSL은 네트워크 통신을 보안하고 데이터를 암호화하는 데 사용되는 프로토콜로, 주로 웹 서버 및 클라이언트 간의 안전한 통신을 제공하는 데 사용됩니다.

mbed TLS는 C 언어로 작성된 라이브러리로, 경량이며 임베디드 시스템 및 리소스 제한된 환경에서도 사용할 수 있도록 설계되었습니다. 이 라이브러리를 사용하면 암호화, 디지털 서명, 인증 및 안전한 통신을 구현하는 데 도움을 줍니다.

mbed TLS안에는 DTLS 1.2 기능이 포함 돼 있습니다.

RFC 9146의 문서 에서는 DTLS 1.2에 연결 식별자를 추가하는 방법에 대한 표준이 정의돼 있습니다.

연결 식별자를 CID라고 하며, 아래와 같이 연결 식별자의 형식과 사용 방법에 대한 예제가 나옵니다.
예제는 아래와 같습니다.

image

구현 과정 중 문제점

문제는 RFC 9146의 예제 문서대로라면 위와 같이 돼야 하는데 와이어 샤크로 확인했을 때는 위의 예제처럼 동작하지 않았습니다.

공식 문서와 스택오버플로우, 구글링을 통해 확인해보니 결론적으로 LwM2M과 Anjay의 통신 설정을 문서를 참조하여 올바르게 설정 해야합니다.

이렇게 Server(LwM2M)와 Client(Anjay)가 정상적으로 통신하면 아래와 같이 위의 예제 문서와 동일하게 출력한 걸 확인할 수 있습니다.

image

위와 같이 Client에서는 ClientHello의 신호를 Server에 보내고 Server에서는 HelloVerifyRequest로 Client에 요청합니다.

Client는 위 값을 받고 다시 Server에게 ConnectionID를 요청합니다. Server는 내부적으로 ConnectionId(c89be44b77a2)를 만들어서 Client에게 전달합니다.

그렇게 ConnectionId(c89be44b77a2)를 받은 Client는 해당 값을 다시 Server에게 ConnectionId(c89be44b77a2)를 확인 받은 뒤에 해당 ConnectionId를 이용하여 통신을 합니다.

위의 handshake 절차를 통해 정상적으로 연결을 유지할 수 있습니다.

아래는 와이어 샤크로 통신한 내용의 세부 내용입니다.

Clinet(ClientHello) image

Server(HelloVerifyRequest) image

Client(ClientHello - CID 요청) image

Server(ServerHello - CID 제공) image

Client(Server에 해당 CID 재확인 요청) image

Server(인증 완료) image

Client(CID를 이용해 통신) image

와이어 샤크를 실제로 자주 사용한 적은 없지만 네트워크 패킷을 분석하여 여러 상황에서 유용하게 쓸 수 있는 도구라고 생각됩니다.

참고