글
■ 시스템이 내부적으로 데이터를 표현하는 방법
(1) 바이트 순서
: 바이트 순서는 데이터가 바이트 단위로 메모리에 저장되는 순서를 의미한다.
- 크게 Big Endian과 Little Endian 방식이 존재하며, 각 CPU 벤더 의존적인 특징을 가지고 있다.
- Little Endian을 사용하는 대표적인 벤더가 '인텔(AMD)'계열의 80x86시스템이고,
- Big Endian을 사용하는 대표적인 벤더가 '모토로라 or IBM'계열의 Power PC 시스템이다.
- Network Protocol은 Big Endian, ARM은 대부분 Little Endian이다.
(2) Big Endian
: 데이터가 상위 바이트 부터 메모리에 적재(Network Ordering)
가장 최상위 바이트(0A)가 가장 낮은 메모리 주소에 저장되는 방식
(ex) 0x12345678의 32비트 값을 Big Endian으로 표현하면 :
0x12 0x34 0x56 0x78
낮은 주소 --> 높은주소
(3) Littel Endian
: 데이터가 하위 바이트 부터 메모리에 적재(Host Ordering)
가장 최상위 바이트(0A)가 가장 높은 메모리 주소에 저장되는 방식
(ex) 0x12345678의 32비트 값을 Little Endian으로 표현하면 :
0x78 0x56 0x34 0x12
낮은 주소 --> 높은주소
(4) 정리
- 네트워킹을 통해 데이터를 송수신할 때 올바른 데이타를 받기 위에서는 시스템에 맞게 바이트 오더링 과정이 필요하다.
- Microsoft Visual C++에서 제공하는 Library 에는 이런 바이트 오더링을 위한 네트워크 함수를 지원한다.
- WS2_32.lib에 있는 htons(), htonl(), ntohs(), ntohl()
: 이 함수들의 이름 중 'n'은 네트워크를 의미하고, 'h' 는 호스트를 의미한다.
's'는 short (2바이트) 데이타 타입, ' l '은 long (4바이트) 데이타 타입을 의미한다.
=> 그래서, htonl() 같은 경우는.. 호스트가 네트워크로(h to n) 데이터를 전송하기 전에 4바이트( l ) 데이터에 대한
바이트 오더링을 해주는 함수이다.
(5) Byte Ordering 함수
unsigned long int ntohl ( unsigned long int x)
{
return(
( ( x & 0x000000ffU ) << 24 ) |
( ( x & 0x0000ff00U ) << 8 ) |
( ( x & 0x00ff0000U ) >> 8 ) |
( ( x & 0xff000000U ) >> 24 ) )
);
}
※ 네트워크 바이트 순서 변환 함수 관련 포스팅 자료
2011/04/13 - [[ C laguage ]/Function] - Network Byte Ordering 변환 함수 (ntohl, ntohs, htonl, htons)
'T heory > Network' 카테고리의 다른 글
Network / 용어설명 (0) | 2011.07.15 |
---|---|
서브넷 / 서브넷마스크 (0) | 2011.07.08 |
포트 (Port) (0) | 2011.05.11 |
네트워크 주소체계 (Internet Address) (0) | 2011.05.11 |
라우터, 공유기, 허브, 스위치 (0) | 2011.05.11 |
RECENT COMMENT