바이트 순서와 네트워크 바이트 순서

   

기본적으로 메모리를 표현하는 두가지 방법이 있다.

빅 엔디언

상위 바이트의 값을 작은 번지수에 저장하는 방식

리틀 엔디언

상위 바이트의 값을 큰 번지수에 저장하는 방식

   

ex. ) 0x20 번지를 시작으로 4바이트 int 형 정수 .0x12345678 을 저장한다고 가정

   

빅 엔디안 형식의 바이트 표현

   

   

리틀 엔디언 형식의 바이트 표현일 경우 이와 반대로 표현이 된다 .

리틀 엔디언 형식의 바이트 표현

   

   

위 그림에서 보는 것 처럼 최 하위 바이트인 0x78 이 먼저 저장이 되고 있다 .

   

저장방식은 CPU 마다 다르기 때문에 어떤 CPU 를 쓰냐에 따라 차이가 난다 .

이 때문에 바이트 순서를 지켜서 데이터를 전송해야 한다 .

   

이 때문에 서로 방식이 다른 CPU 에서 통신할 때 문제가 생기게 된다 .

이 문제점 때문에 통일된 형식으로 데이터를 전송하기로 했는데

그 약속을 가리켜 " 네트워크 바이트 순서 ( Network Byte Order ) " 라고 한다.

약속은 빅 엔디언 방식으로 통일 되어 전송한다.

   

CPU 데이터 저장방식을 표현하는걸 " 호스트 바이트 순서 ( Host Byte Order ) "라고 하며, 네트워크 바이트 순서로 전송 하거나 수신을 받았을 땐 네트워크 바이트 순서로 재 정렬을 해야 한다 .

   

   

바이트 순서의 변환 ( Endian Conversion )

   

바이트 순서의 변환을 돕는 함수이다 .

  • unsigned short htons(unsigned short);
  • unsigned short ntohs(unsigned short);
  • unsigned long htonl(unsigned long);
  • unsigned long ntohl(unsigned long);

위의 함수 이름 패턴을 찾아보자

   

htons 함수의 경우 h to n s 이다 .

이건 Host 바이트 순서를 Network 바이트 순서로 변환하는 것이며,

s 는 short , l 은 long 을 의미한다 .

즉, short 형 데이터를 Host 바이트 순서를 Network 바이트 순서로 변환해라 ! 로 해석이 가능해진다 .

   

   

***** 데이터 전송 전엔 전부 바꿔줘야 하나 ?

데이터 송수신 기준이 " 네트워크 바이트 순서 " 라고 해서 데이터 전송 전 전부 네트워크 바이트 순서로 변경해야 하고, 수신된 데이터를 전부 호스트 바이트 순서로 변경해서 저장해야 한다고 생각 할 수 있지만 ,

그런 변환의 과정은 자동으로 이뤄진다. sockaddr_in 구조체 변수에 데이터를 채울 때 이외에는 바이트 순서를 신경 쓰지 않아도 된다 .

   

   

'Programing > Win32API' 카테고리의 다른 글

에러 핸들링  (0) 2016.01.15
CreateProcess , CreateThread  (0) 2015.09.26
프로세스와 쓰레드  (0) 2015.09.26
대화상자 모달, 모달리스  (0) 2015.09.19
윈도우 기반의 TCP 소켓 통신 ( C )  (0) 2015.09.12

+ Recent posts