나만의 작은 도서관

[Network] 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian) 본문

Common/CS-네트워크

[Network] 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian)

pledge24 2024. 6. 28. 18:48
유의사항: 해당 글은 공부한 내용을 정리하는 용도이므로, 수정이 필요할 경우 내용의 수정이 있을 수 있습니다.

 

개요

이번에 바이트 배열을 이용한 TCP 통신을 배우던 중 빅 엔디안 방식과 리틀 엔디안 방식이 있다는 것을 알게되었다. 자주보던 용어들이니 정리해보고자 이번 기회에 글로 기록해볼까 한다.


상위바이트 하위바이트

빅 엔디안과 리틀 엔디안을 알기 전에 패킷에서 상위 또는 하위 바이트 어느 위치에 있는 바이트를 의미하는 지 알아두면 좋다. 우리가 메모리의 비트패턴에서 최상위 비트가 가장 왼쪽에 있는 비트(leftmost bit)인 것처럼 패킷에서 최상위 바이트도 가장 왼쪽에 있는 바이트를 의미한다. 반대로, 최하위 바이트는 가장 오른쪽에 있는 바이트를 의미한다.


빅 엔디안(Big Endian)

빅 엔디안은 이름에서 알 수 있듯 큰 놈을 기준으로 저장하는 방식인데, 여기서 큰 놈은 상위 바이트를 의미한다. 따라서, 전달받은 패킷에서 최상위 바이트 -> 최하위 바이트 순으로 메모리(buffer)에 저장하게 된다. 빅엔디안은 패킷에 담긴 데이터 순서와 메모리에 저장되는 순서가 일치하기 때문에, 그리고 평소 사람이 읽기 편하기 때문에 이해가 용이하다는 장점이 있다.

빅 엔디안

 


리틀 엔디안(Little Endian)

리틀 엔디안은 빅 엔디안과 반대로, 전달받은 패킷에서 최하위 바이트 -> 최상위 바이트 순으로 메모리(buffer)에 저장하게 된다. 리틀 엔디안은 패킷에 담긴 데이터 순서와 메모리에 저장되는 순서가 달라, 읽기가 불편하지만 자리 올림 수 여부를 판단하는데 용이하여 수학적 연산에 유리하다.


혼용 금지

클라이언트-서버 구조처럼 TCP통신을 하는 과정에서 각 터미널이 빅 엔디안/리틀 엔디안 방식이 서로 다르면 문제가 발생하게됩니다. 송신자가 0x01020304와 같은 데이터를 보냈을 때 한 쪽은 0x01020304로, 한 쪽은 0x04030201로 읽는 것처럼 같은 데이터가 다르게 해석되기 때문이죠. 어느 CPU를 쓰느냐에 따라(빅 엔디안: Sparc, 리틀 엔디안: Intel) 기본 엔디안 방식이 다를 수 있기 때문에 충분히 발생할 수 있는 문제이고, 이런 문제를 방지하기 위해 하나로 통일하여 사용하는 것이 바람직합니다. 일반적으로 네트워크에서는 빅 엔디안으로 통일하도록 되어있습니다.

출처: https://bumukisbest.tistory.com/13


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),
  };
};

 


참고 자료

https://bumukisbest.tistory.com/13

https://softtone-someday.tistory.com/20