본문 바로가기

진리는어디에

byte order(little-endian and big-endian)

/**
 1699년 걸리버가 표류한 소인국 릴리푸틴(Lilliputin)들은 삶은 달걀을 먹는 방법에 생사를 걸었다. 왕은 달걀의 양끝 중 작은 쪽부터 깨서 먹을 것을 명령했으나 큰 끝부터 깰 것을 고집하는 빅-엔디안(Big-Endians)들이 사생결단해 저항했다.
 36 월력(月曆)간 6차례 대 폭동이 일어나고 1만1천명이 작은 끝부터 깨기를 거절하고 죽음을 택했다.

 걸리버 여행기 中
*/
 
네트워크 바이트 순서(Network-byte order)

 CPU가 데이터를 처리하기 위해서는 가장 먼저 메모리에 데이터가 적재가 되어 있어야만 한다. 그런데 이 세상에는 CPU의 종류가 한 두 가지가 아니고, CPU를 만들어 내는 회사 또한 한 두군데가 아니다. 그리고 그 회사들은 저마다 각각의 바이트 순서(byte order)를 사용하고 있다.

 바이트 순서(byte order)란, 데이터를 메모리에 적재하는 방법이라고 생각하면 된다. 그 방법에는 Big-endian(상위 바이트가 메모리에 먼저 기록 되는 방식)과 Little-endian(하위 바이트가 메모리에 먼저 기록 되는 방식)이다.

사용자 삽입 이미지

big endian and little endian

 위의 그림을 보면 메모리 번지가 증가 하는 순서 대로 바이트를 증가 시키는 것을 Big endian, 그 반대의 것을 Little endian이라고 한다. 그리고 시스템이 사용하는 바이트 순서를 호스트 바이트 순서(Host byte order)라고 하며 위에서도 이야기 했다 싶이 CPU마다 다르므로 네트워크로 데이터를 주고 받는 시스템들이 같은 호스트 바이트 순서를 가진다는 보장이 없다.

 이렇게 서로 바이트 순서(byte order)가 다른 두 호스트가 통신을 할 경우에는 바이트를 읽어 들이는 순서가 달라 같은 데이터를 가지고도 서로 다르게 인식 하는 경우가 발생한다. 아래의 그림을 보도록 하자.

사용자 삽입 이미지

comunication between Big endian and Little endian

 호스트 A에서 0x12, 0x34라고 보낸 데이터가 동일하게 호스트 B에 도착 하였지만, Little endian 방식의 호스트 B는 0x34, 0x12 순서로 바이트를 읽어 버리기 때문에 동일한 값을 다르게 처리해 버린다.

 이런 문제를 해결하기 위해서 네트워크 바이트 순서(Network-byte order)라는 것이 만들어 졌고, 네트워크 바이트 순서는 Big-endian만을 사용한다. 따라서 시스템이 Little-endian방식을 사용하고 있다면 반드시 Big-endian방식으로 변경해서 전송을 해야 하고, 받을 때에는 Little-endian으로 변경해서 받아야 한다.

 그리고 sockaddr_in 구조체 안에 존재하는 모든 값들은 반드시 네트워크 바이트 순서로 채워 져야 한다.

관련 함수 : hotns, ntohs, htonl, ntonl
참고 : Unix Network Programming
         열혈강의 TCP/IP
         http://www.terms.co.kr/big-endian.htm
         http://blog.naver.com/ssadaegee?Redirect=Log&logNo=110011193494
         http://blog.naver.com/process3?Redirect=Log&logNo=20029237790
         http://blog.naver.com/cybeagle/4074876

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!