티스토리 뷰

NBO [Network - byte - Ordering]

: sockaddr_in 구조체 변수에 값을 대입할 경우에는 NBO 순서로 값을 병경한 다음에 대입해야 한다.

NBO는 시스템이 내부적으로 데이터를 표현하는 방법을 의미한다. 크게 두가지 방법으로 나뉘는데 Big-Endian과 Little-Endian으로 나뉜다.


Big-Endian

: 상위 바이트의 값이 메모리상에 먼저 표시되는 방법(번지수가 작은 위치에)

<Big-Endian 표현 방식>


Little-Endian

: 하위 비트의 값이 메모리상에 먼저 표시되는 방법.

<Little-Endian 표현 방식>

시스템이 내부적으로 데이터를 처리하는데 있어서 Big-Endian 또는 Little-Endian을 쓰느냐는 시스템의 CPU에 따라 달라진다. 따라서 서로 다른 CPU를 장착하고 있는 호스트들이 데이터를 주고 받을 경우 문제가 발생할 수 있다. 따라서, 네트워크를 통해 데이터를 전송할 때는 통일된 방식을 이용해 데이터를 전송하기로 약속을 하였는데, 이것이 바로 NBO이다. 네트워크 바이트 순서는 Big-Endian 방식만을 사용하기로 약속되어 있다.


바이트 순서 변환

: sockaddr_in 구조체에 값을 채우기 전에 Big-Endian방식으로 데이터 변경을 해야 하는 이유에 대해 살펴보았다. 그렇다면 이번에는 바이트 순서 변환을 해주는 함수에 대해 살펴보자면, 여러가지 함수가 있으며 함수 이름만 자세히 보면 그 기능을 충분히 파악할 수 있다. 


            • htons

            • ntohs

            • htonl

            • ntohl


살펴보자면, htonl이란 h to n 이므로 Host Byte 순서를 Network Byte 순서로 바꾸어 준다는 의미이다. 또한 뒤에 붙은 l은 long 타입을 의미한다. 따라서 32비트 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 바꿔주는 함수이다. 


일반적으로 뒤에 s(shot)가 붙은 함수는 s가 2바이트 데이터를 의미하므로 Port 정보의 바이트 순서를 변경하는데 사용하고,

l(long)이 붙은 함수는 l이 4바이트를 의미하므로 IP 주소의 바이트 순서를 변경하는데 사용하게 된다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   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
글 보관함