티스토리 뷰

리틀 엔디안과 빅 엔디안 (Little Endian, Big Endian)


이번 포스팅에서는 리틀 엔디안과 빅 엔디안에 대해서 소개하도록 하겠다.


컴퓨터에서 어떤 크기의 데이터를 메모리에 저장할때 바이트 단위로 나누어 저장하는데 이러한 방식을 바이트 오더(Byte Order) 라고 한다.


바이트 오더라고 하면 가장 먼저 떠오르는 것이 보통 오늘 이야기하고자 하는 리틀 엔디안(Little Endian)과 빅 엔디안(Big Endian)인데, 알고 있더라도 자주 헷갈리는 부분중에 하나이다.



[그림] 레지스터와 메모리 위치 매핑관계, 출처 : 위키피디아(www.wikipedia.org)


우리가 패킷 분석을 하면서 많이 보게되는 네트워크 프로토콜은 기본적으로 빅 엔디안 표현이다.



리틀 엔디안 (Little-Endian)

낮은(시작)주소에 하위 바이트부터 기록, Intel CPU 계열

예) 32비트형 4바이트 값 :0x01020304


하위 주소 

0x04 

0x03 

0x02 

0x01 

상위 주소




빅 엔디안(Big-Endian)

낮은(시작) 주소에 상위 바이트부터 기록, Sparc / RISC CPU 계열

예 32비트형 4바이트 값 : 0x01020304


하위 주소 

0x01 

0x02 

0x03 

0x04 

상위 주소



빅 엔디안은 우리가 평소에 보던 방식으로 메모리에 쓴다고 생각하면 되고 리틀 엔디안은 뒤집어서 쓴다고 생각하면 이해하기가 쉽다. 그럼 왜 빅엔디안을 사용하지 않고 리틀 엔디안을 사용하는 것일까


그 이유는 산술연산유닛(ALU)에서 메모리를 읽는 방식이 메모리 주소가 낮은 쪽에서부터 높은 쪽으로 읽기 때문에 산술 연산의 수행이 더 쉽다는 점이 있다. 또한, 데이터를 다른 시스템으로 전송할 때 서로 다른 데이터 저장 방식의 시스템끼리 통신하게 되면 전혀 엉뚱한 값을 주고 받을수 있기 때문이다.


우리가 주로 이용하는 시스템은 인텔 기반의 리눅스와 윈도우이므로 리틀 엔디안 방식이다. 단, 네트워크를 통해 전송되는 것은 빅 엔디안이다. 그래서 소켓통신을 할때 htons등 바이트 순서 변환 함수를 통해서 데이터를 전달한다.


그렇다면 Network Byte Ordering 변환 함수에 대해서 알아보자.


Network Byte Ordering 변환 함수

u_long WSAAPI ntohl(__in  u_long netlong);
network to host(시스템) long(4바이트)

TCP/IP 네트워크로부터 인텔 프로세스의 리틀 엔디안인 호스트(시스템) 바이트 순서로 u_long(부호 없는 4바이트) 타입의 값을 변환한다.
-
리턴 : netlong 전달인자에 대해 뒤집어진 바이트 순으로 제공된 값
- netlong : TCP/IP 네트워크 바이트 순서에서 32비트 숫자.

u_short WSAAPI ntohs(__in  u_short netshort);
network to host(시스템) short(2바이트)

TCP/IP 네트워크로부터 인텔 프로세스의 리틀 엔디안인 호스트(시스템) 바이트 순서로 u_short(부호 없는 2바이트) 타입의 값을 변환한다.
- 리턴 : 호스트(시스템) 바이트 순서로 된 값.
- netshort : TCP/IP 네트워크 바이트 순서에서 16비트 숫자.

u_long WSAAPI htonl(__in  u_long hostlong);
host to network long

호스트로부터 빅 엔디안인 TCP/IP 네트워크 바이트 순서로 u_long 타입의 값을 변환한다.
- 리턴 : TCP/IP 네트워크 바이트 순서로 된 값.
- hostlong : 호스트(시스템) 바이트 순서로 된 32비트 숫자.

u_short WSAAPI htons(__in  u_short hostshort);
host to network short

호스트로부터 빅 엔디안인 TCP/IP 네트워크 바이트 순서로 u_short 타입의 값을 변환한다.
- 리턴 : TCP/IP 네트워크 바이트 순서로 된 값.
- hostshort : 호스트(시스템) 바이트 순서로 된 16비트 숫자.

※ 네트워크 바이트 순서는 Big Endian 이다 !
: 현 재 시스템의 CPU가 Big-Endian 방식을 사용하고 있다 하더라도, 반드시 변환 함수를 사용해서 네트워크 바이트 순서로 변환하는 과정을 거쳐야 한다. 그 이유는 '이식성'을 위해서 이다. 본 프로그램이 Big-Endian 시스템에서만 사용된다는 보장을 할 수 없기 때문에.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함