Server/Winodw Network

바이트 정렬 함수

Ginger-Prince 2015. 7. 20. 19:49

바이트 정렬 함수

바이트 정렬(byte ordering)

- 메모리에 데이터를 저장할 때의 바이트 순서를 나타내는 용어이다.

 

빅 엔디안(big-endian)

- 최상위 바이트(MSB, Most significant Byte)부터 차례로 저장되는 방식

 

리틀 엔디안(little-endian)

- 최하위 바이트(LSB, Least Significant Byte)부터 차례대로 저장되는 방식

 

 

파일에 데이터를 저장하고 읽어오는 경우나 네트워크를 통해서 데이터를 전송하는 경우에

바이트 정렬 방식에 특히 유의해야 한다.

 

리틀 엔디안 방식으로 저장한 데이터를 빅 엔디안 방식으로 읽는 경우 또는 그 반대의 경우에

저장해둔 내용을 완전히 다른 내용으로 해석하므로 문제가 된다.

 

 

네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우

 

1. IP 주소, 포트 번호 등과 같이 프로토콜 구현을 위해 필요한 정보

 

- 종단 시스템과 라우터가 IP 주소의 바이트 정렬 방식 약속하지 않을 경우에

  IP 주소 해석이 달라져서 잘못된 라우팅이 이루어질 가능성이 있다.

 

- 두 종단 시스템이 포트 번호의 바이트 정렬 방식을 약속하지 않을 경우에

  잘못된 목적지 프로세스에 데이터가 전달될 가능성이 있다.

 

이러한 문제점 때문에 IP주소와 포트 번호의 정렬 방식은 빅 엔디안으로 통일하여 사용하도록 되어 있다.

네트워크 용어로 빅 엔디안을 네트워크 바이트 정렬(network byte ordering) 이라고 부른다.

반면에, 시스템이 사용하는 고유한 바이트 정렬 방식을 호스트 바이트 정렬(host byte ordering)이라고 부른다.

 

 

2. 애플리케이션이 주고 받는 데이터

 

- 두 종단 시스템이 교환하는 데이터에 대해 바이트 정렬 방식을 약속하지 않으면, 데이터 해석의 문제가 발생할 수 있다.

 

우연히 두 종단 시스템의 호스트 바이트 정렬 방식이 같을 경우는 문제가 되지 않지만,

일반적으로 네트워크를 통해 이기종간 데이터를 교환하는 경우가 많으므로 상호 약속이 필요하다.

 

 

윈속에서 바이트 정렬을 위해서 유틸리티 함수를 지원한다.

 

hton*()

- 호스트 바이트 정렬로 저장된 값을 받아서 네트워크 바이트 정렬로 변환한 값을 리턴한다.

- 애플리케이션이 소켓 함수에 값을 넘겨주기 전에 호출한다.

 

ntoh*()

- 네트워크 바이트 정렬로 저장된 값을 입력으로 받아서 호스트 바이트 정렬로 변환한 값 리턴

- 소켓 함수가 결과로 전달한 값을 애플리케이션에서 출력등의 목적으로 사용하기 전에 호출

 

 

SOCKADDR_IN 구조체의 바이트 정렬 방식

 

sin_family(2)   -> 호스트 바이트 정렬

 

sin_port(2)    ->  네트워크 바이트 정렬

sin_addr(4)   ->  네트워크 바이트 정렬

 

sin_zero(8)