나만의 작은 도서관
[Network] 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian) 본문
유의사항: 해당 글은 공부한 내용을 정리하는 용도이므로, 수정이 필요할 경우 내용의 수정이 있을 수 있습니다.
개요
이번에 바이트 배열을 이용한 TCP 통신을 배우던 중 빅 엔디안 방식과 리틀 엔디안 방식이 있다는 것을 알게되었다. 자주보던 용어들이니 정리해보고자 이번 기회에 글로 기록해볼까 한다.
상위바이트 하위바이트
빅 엔디안과 리틀 엔디안을 알기 전에 패킷에서 상위 또는 하위 바이트 어느 위치에 있는 바이트를 의미하는 지 알아두면 좋다. 우리가 메모리의 비트패턴에서 최상위 비트가 가장 왼쪽에 있는 비트(leftmost bit)인 것처럼 패킷에서 최상위 바이트도 가장 왼쪽에 있는 바이트를 의미한다. 반대로, 최하위 바이트는 가장 오른쪽에 있는 바이트를 의미한다.
빅 엔디안(Big Endian)
빅 엔디안은 이름에서 알 수 있듯 큰 놈을 기준으로 저장하는 방식인데, 여기서 큰 놈은 상위 바이트를 의미한다. 따라서, 전달받은 패킷에서 최상위 바이트 -> 최하위 바이트 순으로 메모리(buffer)에 저장하게 된다. 빅엔디안은 패킷에 담긴 데이터 순서와 메모리에 저장되는 순서가 일치하기 때문에, 그리고 평소 사람이 읽기 편하기 때문에 이해가 용이하다는 장점이 있다.
리틀 엔디안(Little Endian)
리틀 엔디안은 빅 엔디안과 반대로, 전달받은 패킷에서 최하위 바이트 -> 최상위 바이트 순으로 메모리(buffer)에 저장하게 된다. 리틀 엔디안은 패킷에 담긴 데이터 순서와 메모리에 저장되는 순서가 달라, 읽기가 불편하지만 자리 올림 수 여부를 판단하는데 용이하여 수학적 연산에 유리하다.
혼용 금지
클라이언트-서버 구조처럼 TCP통신을 하는 과정에서 각 터미널이 빅 엔디안/리틀 엔디안 방식이 서로 다르면 문제가 발생하게됩니다. 송신자가 0x01020304와 같은 데이터를 보냈을 때 한 쪽은 0x01020304로, 한 쪽은 0x04030201로 읽는 것처럼 같은 데이터가 다르게 해석되기 때문이죠. 어느 CPU를 쓰느냐에 따라(빅 엔디안: Sparc, 리틀 엔디안: Intel) 기본 엔디안 방식이 다를 수 있기 때문에 충분히 발생할 수 있는 문제이고, 이런 문제를 방지하기 위해 하나로 통일하여 사용하는 것이 바람직합니다. 일반적으로 네트워크에서는 빅 엔디안으로 통일하도록 되어있습니다.
Node.js에서 빅 엔디안/ 리틀 엔디안 설정해보기
Node.js에서는 Buffer라는 객체가 존재하고, readUInt16BE()와 같은 메소드를 통해 빅 엔디안/ 리틀 엔디안 방식을 설정하고 바이트 크기 또한 설정할 수 있습니다. 예시로 든 readUInt16BE(start_pos)의 뜻은 다음과 같습니다.
- read: 버퍼에서 데이터를 읽겠다.
- UInt: unsigned int 타입
- 16: 16비트 = 2Byte
- BE: Big Endian
- start_pos : 시작 위치(바이트 단위)
즉, readUInt16BE(start_pos)는 "버퍼에서 start_pos바이트부터 unsigned int 타입의 2Byte 크기를 가진 데이터를 빅 엔디안 방식으로 버퍼에서 읽겠다"라는 의미가 됩니다. 간단한 사용법 코드는 다음과 같습니다.
import { TOTAL_LENGTH_SIZE, HANDLER_ID } from './constants.js';
export const readHeader = (buffer) => {
return {
length: buffer.readUInt32BE(0),
handlerId: buffer.readUInt16BE(TOTAL_LENGTH_SIZE),
};
};
참고 자료
'Common > CS-네트워크' 카테고리의 다른 글
[Network] 블로킹/논블로킹 방식, 동기/비동기 방식 (0) | 2025.01.11 |
---|---|
[Network] protoBuf와 직렬화/역직렬화 (0) | 2024.06.28 |
[Network] TCP vs UDP (0) | 2024.06.28 |
[Network] 1분 간단 질문. TCP Handshake란 무엇인가요? (0) | 2024.06.27 |
[Network] 대칭 키 암호화 방식과 공개 키 암호화 방식 (0) | 2024.06.26 |