본문 바로가기

별걸다하는 IT/네트워크_소켓_통신

[Byte Order 바이트 오더] 빅엔디안(Big Endian)과 리틀엔디안(little endian) - 1편

 

 

안녕하세요~~!! 오늘도 시작되는 말랑이몰랑이 블로그 포스팅입니다~ ㅎㅎ

오늘은 네트워크나 통신쪽을 공부한다면 알고 있어야 할 Byte Order 의 빅엔디안과 리틀엔디안에 대한 개념을 완전하게 잡아보는 시간을 가져보도록 합시다.

 

시작하기 전..

우리나라 책은 왼쪽에서 오른쪽으로 읽죠? 지금 여러분이 읽고 있는 블로그처럼요~

그런데, 혹 일본 만화책을 읽어본 경험이 있으신가요? 일본만화책을 읽을 때는 오른쪽에서 왼쪽으로 읽어요. (dave님 오타지적 감사드립니당~)

 

사진 출처:  http://blog.aladin.co.kr/715001177/popup/4309946

 

이렇듯, 국가별(?)로 읽고 쓰는 방식이 다른데, 컴퓨터도 마찬가지입니다~~!

컴퓨터도 결국에는 메모리에 써져있는 어떤 이진수의 데이터 값들을 읽어서 판독하고 이해하는거잖아요~~

 

우리가 왼쪽에서 읽어야 한다, 오른쪽에서 읽어야 한다 등의 모두 동일한 룰이 법으로 정해져 있는게 아닌 것처럼, 컴퓨터도 데이터를 읽을 때, 정해진 규칙이 없습니다.

지금이야 뭐~~~ 통신에 관한 어떤 규격이나 규칙들이 다 정해져있거나 권고사항들이 나와있지만..

예전에는 컴퓨터별로 다 데이터를 읽는 방식이 달랐어요. 물론 자기 컴퓨터 내에서는 자기 방식대로 읽으니까 문제가 안되겠죠? 하지만 다른 컴퓨터가 내가 보낸 데이터를 읽는데, 서로 방식이 다르다면 문제가 될거예요~ 내가 1000을 보냈는데 다른 컴퓨터는 왼쪽부터 읽으면 0001로 이해할거아니에요!! 이 하나의 데이터는 읽는 방식에 따라 전혀 다르게 전해질 수 있다고요!! 

(한국인이 한국인 책을 보면 문제가 안되지만 일본 만화책을 보면 읭? 하는거처럼~~ ! )

 

우리야 뭐 만화책을 보면 딱 보고 어디서부터 읽어야할지 감이 오지만,,

멍청한 컴퓨터는 이러한 판단을 자기가 할 수 없습니다. ㅎㅎㅎ 그러므로 우리가 오른쪽으로 읽는데,, 저쪽 왼쪽부터 읽는 컴퓨터로부터 데이터가 왔다..그러면 우리가 직접 변환을 해줘야해요 ㅠㅠ 흑흑

 

Byte Order - 바이트 오더

우리는 지금 컴퓨터의 대화를 이해하기 위해 이 개념을 배우는 것이므로,

일반적으로 메모리에 데이터가 어떻게 저장되고 있는지 먼저 알아보도록 할게요!

 

ex) 예시

쉽게 이해하기 위해 역시 실생활에서 예를 찾는게 좋겠죠?

 

 

 

 

 

같은 언어, '안녕하세요' 를 사용하는 나라라도 ~~

왼쪽 사진처럼 순서에 따라 판독이 상이할 수 있어요!

 

A국가가 B국가로부터 문서를 받았을 때, B국가가 우리와 다른 읽기 체계를 가지고 있는지 모른다면,

실상은 같은 '안녕하세요'인데 '요세하녕안'으로 이해할거예요 ㅎㅎ

 

 

 

 

 

 

 

 

 

 

 

컴퓨터는 데이터를 주소단위로 읽는데, 방금 한거를 컴퓨터 식으로 똑같이 그려보면 아래처럼 생각할 수 있어요.

 

 

컴퓨터에서는 저장되는 데이터의 최소 단위가 1바이트이기 때문에 (BYTE)

데이터를 고대로 읽어서 낮은 주소에서 높은 주소 순서로 저장하느냐 (마치 왼쪽부터 읽는 것처럼), 데이터를 오른쪽에서부터 읽어서 메모리에 저장하느냐 등 순서에 따른 방식이 나뉘어집니다. (ORDER)

이걸 그래서 BYTE + Order(순서) = 바이트 오더 라고 하고, 바이트 오더에는 크게 빅엔디안 방식과 리틀 엔디안 방식이 있어요 ㅎㅎ

 

Bit Order - 비트 오더

컴퓨터가 저장하는 방식을 좀 더 내부로 가서 들여다보면,

실제 한 바이트는 8bit로 이루어져 있습니다. 그리고 여러분들도 알다시피 이진수를 사용하죠 01010001010이런거..! 컴퓨터의 언어는 이진수인거 다 알고 계시죠?! ㅎㅎ

 

 

요렇게 사실 1Byte는 8개의 bit로 구성되어 있어요

근데 우리가 '안녕하세요' 반대로 읽는다 하면 '요세하녕안'으로 읽지,

'안'의 내부 구성단위까지 쪼개서 반대로 읽지는 않잖아요? 반대의 순서대로 읽는다고 했을 때 'ㅇ'+'ㅏ'+'ㄴ' 까지 거꾸로 해서 'ㄴ'+'ㅓ'+ㅇ'이렇게 읽지는 않아요 ㅎㅎ

왜냐면 '안', 이걸 최소의 단위라고 생각하기 때문이죠!

 

컴퓨터도 마찬가지로 1BYTE가 최소의 단위이기 때문에 bit는 영향을 받지 않습니다.

다시 한번~ 바이트 단위로 끊어서 읽는 방향에 따라 저장 방식이 달라지므로 BYTE ORDER라고 합니다. 왼쪽부터 읽을수도 있고 오른쪽부터 읽을수도 있고~~

그런데 비트 단위에서 순서는 우리가 왼쪽에서 읽는 것처럼 읽고, 바이트 오더처럼 막 컴퓨터별로 상이하지 않습니다. 걍 왼쪽부터 읽어요 ㅎㅎ'안'을 굳이 쪼개서 거꾸로 읽지 않는거처럼~

이렇게 우리가 평상시 왼쪽에서 읽는걸 빅엔디안 방식이라 하는데, 이와 같은 이유로 '비트 오더링은 빅 엔디안 방식을 사용한다'라고 말하기도 합니다. 그래서 한 바이트만 있을 경우에는 읽는 방법이 하나이기 때문에 바이트 오더가 의미가 없죠 ㅎㅎ

 

 

1바이트만 봤을 때

바이트 내에서 맨 왼쪽을~~ 상위비트라고 하고 아래쪽으로 하위비트라고 합니다. (헷갈리지 말깅~)

다시 한 번 전체적인 그림을 그려보면 아래처럼 그려볼 수 있어요

 

 

이제 어느정도 저장 방식에 대한 감은 왔을 거라 생각합니다. ㅎㅎ

이제 바이트오더 방식에 대해 본격적으로 들어가볼까요?

 

엔디안 ENDIAN

엔디언이라는 단어는 조너선 스위프트의 <걸리버 여행기>에 나오는 소인국 릴리퍼트 이야기에서 달걀을 깰 때 뭉툭한 끝 (big-end)를 먼저 깨는 사람들(빅엔디언)과 뾰족한 끝(little-end)를 먼저 깨는 사람들(리틀 엔디언) 사이에 격론이 벌어진 데서 따온 것입니다. 빅 엔디언과 리틀 엔디언 중 어느 것을 쓰느냐 하는 문제는 상황에 따라서 임의적이고, 종종 논란의 대상이 있었습니다. 

 

 

일단, 리틀엔디언과 빅엔디언이라는 단어 자체는 여기서 유래되었습니다. ㅎㅎ

(cf. 출처 위키백과 )

 

컴퓨터에서 엔디안이란 '데이터가 있을 때, 어떤 순서로 메모리 위치에 저장시킬 것인가'로 생각하면 되겠습니다.

엔디안의 방식에는 크게 세 가지로 나눕니다.

1. 빅엔디안

큰 단위가 앞에 나오는 것을 말합니다.

2. 리틀 엔디안

작은 단위가 앞에 나오는 것을 말해요

3. 미들 엔디안

두 경우에 속하지 않거나, 둘을 모두 지원하는 것을 말합니다.

 

빅 엔디안 방식 (BIG ENDIAN)

그럼 가장 먼저 빅 엔디안 방식에 대해서 살펴볼게요 ~ㅎㅎ

빅 엔디안은 우리가 왼쪽부터 읽어나가는 거랑 비슷해요.

'0x123456'이라는 16진수 데이터를 메모리에 저장한다고 합시다. 16진수 한 자리수가 4 bit를 차지하므로 최소 단위인 1 바이트씩 나눠보면 아래처럼 두 숫자가 할당될거예요.

 

 

메모리에는~~

 

 

마치 데이터 123456을 그대로 읽는 거처럼 순차적으로 메모리에 들어간거같죠?ㅎㅎ

이렇게 저장되는 것이 빅엔디안 방식입니다.

 

근데 왜 빅엔디안 설명에 보면, '큰 단위가 앞에 나온다'라고 되어 있는가?

--> 이진수에서는 상위비트로 갈 수록 값이 커집니다. 16진수 123456을 사실 2진수로 변환해보면 0001 0010 0011 ... 이런식으로 가겠죠? 

 

 

이와 같은 이유로 앞쪽으로 갈 수록 단위가 크다고 하는거예요 ㅎㅎ

 

리틀 엔디안 방식 (LITTLE ENDIAN)

빅엔디안 방식을 완벽하게 이해했으면,요 리틀~ 작은~ 엔디안 방식은 반대이기 때문에 완전 쉽습니다!

똑같이 0x123456'이라는 16진수 데이터를 메모리에 저장한다고 합시다.

 

 

요렇게~

우리가 '안녕하세요'를 '요세하녕안'으로 읽은 것처럼 오른쪽에서부터 읽어서 넣어주는 걸 리틀엔디안 방식이라고 합니다. 즉 작은 단위부터 읽어서 메모리에 차곡차곡 넣어줘요.

리틀엔디안이나 빅엔디안이나, 데이터는 낮은 주소에서 높은 주소 순으로 저장이 됩니다. ㅎㅎ

다만 읽어들이는 순서가 다른거예요!

 

근데 오른쪽부터 읽어들이는데 654321이 아닌가요?

앞에~~~ 비트 오더 파트를 다시 한 번 읽고 생각해보기!! (다시 정독하쎄요!! ㅎㅎ)

가장 최소 단위가 1바이트 이므로, 그 내부의 순서는 바뀌지 않고 빅 엔디안으로 진행됩니다 ㅎㅎ

 

 

쓰다보니 포스팅이 너무 길어지네요 ㅎㅎ 아마 2편으로 나눠서 진행해야 할 것 같습니다.

다음편에는, 왜 어떤 컴퓨터는 빅엔디안을 쓰고 어떤 컴퓨터는 리틀엔디안으로 쓰는지 - 각 방식의 장단점,

그리고 실질적으로 네트워크 통신에서 일어나는 문제 상황, 이를 해결하기 위해 정의된 NBO, 관련 함수 등을 살펴보도록 할게요 ㅎㅎ 

다음 편은 아래 링크 참조!

 

[endian 2탄]리틀엔디안 vs 빅엔디안, 각 엔디안방식의 장단점, NBO(network byte order), CPU별 엔디안 차이

안녕하세요! 드디어 오랜만에 찾아온 엔디안 방식 2탄입니다. 저번시간에는 엔디안의 개념적인 부분을 다뤘었는데요. - 바이트 오더 vs 비트 오더 - 빅 엔디안 방식 vs 작은 엔디안 방식 요렇게 살

jhnyang.tistory.com

항상, 공감, 댓글, 광고보답 감사드립니다.

잘못된 부문 있으면 지적 부탁드려요 :)

다음에 더 좋은 포스팅으로 찾아뵙도록 하겠습니다!