일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- lua for windows
- lua interpreter
- Lua
- QT TCP
- 국토교통부
- TCP/IP
- 찾다죽는줄
- 엑스퍼트생일축하해
- #신혼부부 #결혼준비 #신혼부부희망타운신혼부부특별공급
- 월세
- QTcpServer
- 수도권주택공급
- meta table
- 중소규모택지
- file open
- C API
- FILE TRANSFER
- 프리미어 영상변환
- object
- 청량리역한양수자인192
- 엑스퍼트2주년
- lua install
- #부동산전자거래 #부동산전자계약 #부동산계약 #부동산전자계약방법 #부동산전자계약하는법 #부동산계약방법 #부동산중개수수료 #부동산중개수수료아끼기 #부동산복비아끼기
- 등록임대주택
- 프리미어 영상저장
- 티몬삼겹살데이
- C++ API
- file read
- lua setup
- file write
- Today
- Total
Value Creator의 IT(프로그래밍 / 전자제품)
네트워크 바이트 순서 본문
네트워크 바이트 순서 (Byte Ordering)
설정
■ 시스템이 내부적으로 데이터를 표현하는 방법
(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)
바이트 순서 변환 함수 (ntohl, ntohs, htonl, htons)
설정
(1) 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 시스템에서만 사용된다는 보장을
할 수 없기 때문에.
(2) 표현계층(presentation layer)
네트워크 바이트 순서를 결정하는 등의 서로 표현하는 방법에 대한 규칙을 정한다.
ex) 나라마다 날짜 표기가 다르다.
한국 : 09/06/02, 미국 : June 2th 2009
(3) WORD
- 컴퓨터가 한 번에 처리할 수 있는 단위. (실제 의미)
- 윈도우즈 WIN16의 호환성을 위해 2바이트를 사용한다.
unsigned long inet_addr(__in const char *cp);
IPv4의 점으로 표시된 10진수 주소값으로 구성된 문자열을 IN_ADDR 구조체를 위한 적절한 주소로 변환한다.
- 리턴 : 주어진 인터넷 주소의 2진수 표현으로 구성된 부호없는 long값.
- cp : 인터넷 표준 "." 표기법으로 표현된 숫자를 나타내는 NULL종료 문자열
char* FAR inet_ntoa(__in struct in_addr in);
(IPv4인) 인터넷 네트워크 주소를 인터넷 표준 10진-구두점 형태의 문자열로 변환한다.
- 리턴 : "." 표기법으로 문자 주소를 포함한 정적인 버퍼의 포인터.
- in : 인터넷 호스트 주소를 표현한 in_addr 구조체
※ 네트워크 바이트 순서 관련 이론 포스팅 자료
'1. 프로그래밍 > 4) Network' 카테고리의 다른 글
네트워크 프로그래밍 팁(1) (0) | 2020.03.05 |
---|---|
(멀티) 프로세스, (멀티) 쓰레드, 임계영역, 뮤텍스, 세마포어 (0) | 2020.01.08 |
네트워크 관련 유용한 강의 자료 사이트 (0) | 2019.11.14 |
Chapter 18 멀티 쓰레드 기반의 서버 구현 (0) | 2019.11.11 |
Chapter 17 epoll 기반 IO 멀티플렉싱 서버 구현 (0) | 2019.11.07 |