Notice
Recent Posts
Recent Comments
Link
«   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
Archives
Today
Total
관리 메뉴

codingfarm

네트워크 바이트 순서(Network byte order) 본문

TCP IP 소켓 프로그래밍

네트워크 바이트 순서(Network byte order)

scarecrow1992 2021. 5. 11. 00:17

www.tcpschool.com/c/c_refer_endian

forum.falinux.com/zbxe/index.php?document_srl=431494&mid=C_LIB

 

바이트 정렬(Byte Order)

  • 컴퓨터에서 연속된 데이터를 byte단위로 순서대로 저장하는것
  • byte가 저장되는 순서에 따라 little endianess와 big endianess로 나뉨

 

 


빅 앤디언(Big Endianess) 

  • 낮은 주소에 데이터의 높은 바이트(MSB, Most Significant Bit)부터 저장하는 방식
  • 평소 숫자를 사용하는 선형 방식과 같은 방식입니다.
  •  메모리에 저장된 순서 그대로 읽을 수 있으며, 이해하기가 쉽다
  • SPARC을 포함한 대부분의 RISC CPU 계열에서는 이 방식으로 데이터를 저장
    • TCP/IP 네트워크에서는 Big Endianess을 사용함

가령 0x12345678 이라는 32bit 크기의 데이터가 존재 할 경우

0x12, 0x34, 0x56, 0x78로 나뉜다

 


리틀 엔디언(Little Endianess)

  • 낮은 주소에 데이터의 낮은 바이트(LSB, Least Significant Bit)부터 저장하는 방식
  • 평소 우리가 숫자를 사용하는 선형 방식과는 반대로 거꾸로 읽어야 함
  • 대부분의 인텔 CPU 계열에서는 이 방식으로 데이터를 저장

가령 0x12345678 이라는 32bit 크기의 데이터가 존재 할 경우

 


Byte Order 확인

1
2
3
4
5
6
int i;
int test = 0x12345678;
char* ptr = (char*)&test; // 1 바이트만을 가리키는 포인터를 생성함.
 
for (i = 0; i < sizeof(int); i++)
    printf("%x", ptr[i]); // 1 바이트씩 순서대로 그 값을 출력함.
cs

사용중인 시스템이

빅 엔디안일 경우 : 12345678 출력

리틀 엔디안일 경우 : 78563412 출력

 

 

 


Host to Network 함수

ehpub.co.kr/tag/htonl-%ED%95%A8%EC%88%98/

소켓 프로그래밍의 bindconnect 함수에서 htonl이나 htons라는 함수를 볼 수 있다.

이 함수는 호스트(Host) 바이트 순서를 네트워크(Network) 바이트 순서로 바꾸는 함수이다.

각각 32bit(Long)및 16bit(Short) 단위로 데이터를 변환한다.

 

앞서 TCP/IP 네트워크에서는 big endianess, 인텔 계열의 CPU 에서는 little endianess의 byte order를 따른다 설명했다.

그렇기에 byte order를 전환하는 작업을 수행해야 네트워크에서 값을 해석할 수 있다.

이때 사용하는 함수가 htonl과 htons이다.

1
2
u_long htonl( u_long hostlong );
u_short htons( u_short hostshort );
cs

htonl : host byte order형의 IPv4 주소를 network byte order 형으로 변환

htons :  host byte order형의 IP 포트 번호를 network byte order 형으로 변환

 

 

 

 

 

 

 

 

Comments