2023. 1. 24. 20:32ㆍ2018년 이전 관심사/통신프로토콜
XMODEM 이란?
바이너리 데이터 전송을 하기 위한 프로토콜입니다. 최초의 Xmodem 프로토콜은 최대 128bytes의 데이터만 보낼 수 있어, Ymodem, Zmodem 등의 개량판이 있었습니다.
최근 Xmodem은 모드를 선택해서 128bytes의 데이터를 사용 할지 1KBytes의 데이터를 사용할지 선택 할 수 있습니다.
XMODEM 기본 Protocol Byte
시리얼 통신에서 일반적으로 사용하는 통신 제어 문자를 사용 합니다.
각 문자 별 특징은 아래와 같습니다.
- SOH, Start Of Header ( 0x01 )
- 메시지의 시작을 의미 함
- XMODEM 128 모드에서 사
- STX, Start Of Text ( 0x02 )
- 본문 시작, 헤더 종료
- XMODEM 1K 모드에서 사용
- EOT, End Of Transmission ( 0x03 )
- 전송 종료, 데이터 링크 초기화
- ACK, Acknowledge ( 0x06 )
- 긍정 응답
- DLE, Data Link Escape ( 0x10 )
- 데이터 전송 중단
- NAK, Negative Acknowledge ( 0x15 )
- 부정 응답
- CAN, Cancel ( 0x18 )
- 취소
XMODEM 1K
패킷 구조
XMODEM 1K의 패킷 구조는 아래와 같습니다.
STX (1Byte) |
Packet Number (1Byte) |
~(Packet Number) (1Byte) |
Data (1024 Bytes) |
CRC (2Bytes) |
0x02 | 0x01 | 0xFE | XXXXXXX | 0xXXXX |
흐름도
RECEIVER는 SENDER가 첫 메시지를 보낼 때까지 C(0x43)를 주기적으로 송신합니다.
NAK(0x15)를 수신한 SENDER는 위 메시지 포맷으로 Data를 포함하여 메시지를 보내고, RECEIVER로 부터 ACK 수신을 기대 합니다. 혹 NAK를 수신 시, 특정 횟수 만큼 메시지를 재 전송 합니다.
ACK를 수신하면, Packet Number를 1증가 시키고 다음 Data를 포함하여 메시지를 보내고 ACK 수신을 기다립니다.
마지막 데이터를 송신 할 때는 아래 로직을 따릅니다.
- 마지막 송신할 데이터가 1024 보다 작은 경우 남은 사이즈만큼 지정된 패딩 데이터로 채웁니다.
- 예를 들어 마지막 남은 데이터가 1000 Bytes이며 지정된 패딩 값이 0xAA인 경우, 아래 그림의 CPMEOF에 0xAA를 채워서 메시지를 보냅니다.
XMODEM 128 bytes
패킷 구조
XMODEM 128의 패킷 구조 및 메시지 흐름은 아래 그림과 같습니다.
SOH (1Byte) |
Packet Number (1Byte) |
~(Packet Number) (1Byte) |
Data (128Bytes) |
Check Sum (1Bytes) |
0x01 | 0x01 | 0xFE | XXXXXXXXX | 0xXX |
흐름도
RECEIVER는 SENDER가 첫 메시지를 보낼 때까지 NAK(0x15)를 주기적으로 송신합니다.
나머지 흐름은 위 XMODEM 1K와 동일 합니다. 단 이때는 CRC 대신 Check Sum을 사용하여 메시지 유효성 검사를 수행 합니다.
Mixed 1024 & 128
패킷 구조
SOH or STX (1Byte) |
Packet Number (1Byte) |
~(Packet Number) (1Byte) |
Data (1024 Bytes) |
CRC (2Bytes) |
0x01 or 0x02 | 0x01 | 0xFE | XXXXXXX | 0xXXXX |
흐름도
데이터 사이즈를 1024 & 128을 선택해서 사용할 수 있는 모드도 지원 합니다.
추가로 테스트를 해 보면, Teraterm이나 일반적으로 XModem 프로토콜을 사용하는 Tool에서는 Mixed Mode를 사용하여 XMODEM 128를 지원 하는 것으로 보입니다.
참고 자료
https://ko.wikipedia.org/wiki/%EC%A0%9C%EC%96%B4_%EB%AC%B8%EC%9E%90
'2018년 이전 관심사 > 통신프로토콜' 카테고리의 다른 글
[UDS,14229-1] WriteMemoryByAddress(0x3D) 서비스 (0) | 2023.05.26 |
---|---|
[TCP/IP] SO_REUSEADDR 옵션 (1) | 2023.01.23 |
[UART] Parity Bit (0) | 2023.01.19 |
[IPV6] D-Link IPV6 in IPV4 Tunnel 설정, IPV6 사용하기 (0) | 2022.04.05 |
[RabbitMQ] 다른 메시지 큐 간 차이 (MQTT, ZeroMQ, Kafka) (0) | 2022.02.24 |