빅 엔디안(big endian)과 리틀 엔디안(little endian)

들어가기

네트워크 관련 과목을 수강하거나 관련 문서를 읽다보면 종종 빅 엔디언(big endian)과 리틀 엔디언(little endian) 같은 단어를 쉽게 볼수 있습니다.
평소 따로 정리해두지 않으면 충분히 헷갈릴수 있는 개념이므로 이번 포스팅을 통해 한번 정리해보겠습니다.

본론

빅 엔디안과 리틀 엔디안

CPU에 따라서 바이트의 숫자를 메모리 공간에 저장하는 방식에 있어 차이가 있을 수 있습니다. 이해하기 쉽게 32비트 CPU란 가정하에 간략한 예를 들어보겠습니다.

00000000 00000000 00000000 00000001

CPU에서는 4바이트의 숫자 1을 이진수 형태로 예시처럼 저장하는가 하면, 다음과 같이 거꾸로 저장하는 CPU도 존재합니다.

00000001 00000000 00000000 00000000

위에서 확인할 수 있는 차이때문에 데이터를 주고 받는 통신에 있어 데이터의 표현을 어떻게 하느냐는 상당히 중요합니다.

CPU가 데이터를 메모리에 저장하는 방식은 위에서 확인한 대로 두가지로 나뉩니다.

  • 상위 바이트의 값을 작은 번지수에 저장하는 방식의 빅 엔디안(big endian)
  • 상위 바이트의 값을 큰 번지수에 저장하는 방식의 리틀 엔디안(little endian)

자! 그럼 다시한번 예를 들어보겠습니다. 이번에는 4바이트 int형 정수 0x12345678이 있다고 생각해보겠습니다. 먼저 빅 엔디안(big endian)부터 확인해보겠습니다.

빅 엔디안(big endian)은 데이터의 상위 바이트가 번지수가 작은곳에 저장되므로 위의 예시처럼 저장됩니다. 하지만 리틀 엔디안(little endian)은 이와 반대 입니다.

예시에서와 같이 리틀 엔디안(little endian)은 데이터의 상위 바이트가 주소값이 큰 곳에 저장이 됩니다.

참고로 우리가 주로 사용하는 인텔 계열은 리틀 엔디안(little endian)방식으로 데이터를 저장하고 있습니다. 이와 같은 CPU가 빅 엔디안(big endian)방식의 CPU와 데이터를 주고 받을때는 서로 데이터를 저장하는 방식에서의 차이가 있어 문제가 발생할 수 있습니다.
따라서 CPU간의 호환 문제를 해결하기 위해 통일된 네트워크 바이트 순서를 정의 했고 이는 빅 엔디안(big endian) 방식입니다.

즉, 네트워크상으로 데이터를 전송할 때는 데이터의 배열을 빅 엔디안(big endian)으로 변경해서 송신해야 합니다. 수신하는 입장에서도 네트워크에서 전달되는 데이터가 빅 엔디안(big endian)방식임을 인지하고 있어야 올바른 데이터 처리가 가능합니다.

마치며

간단한 개념이였지만 네트워크에 있어 기초가 되는 개념을 정리해보았습니다. 틀린 부분이 있으면 편하게 말씀해 주세요. 수정하겠습니다.

Share