안녕하세요. 허언증 입니다
소켓을 배우다 보면 네트워크 바이트 순서 또는 호스트 바이트 순서 라는 문구를 많이 보았을 텐데
이번엔 이들이 어떤 뜻인지 알려드리겠습니다. 설명하기에 앞서 바이트 순서의 의미부터 알아야 합니다.
바이트 순서는 시스템이 어떠한 데이터를 표현하는 방법을 말하는데 모든 시스템이 같은 방식을 사용하지는 않습니다.
크게 빅-엔디안(big-endian)방식과 리틀-엔디안(little-endian)방식이 있습니다.
빅엔디안은 상위 바이트의 값이 메모리상에 먼저 표시되는 방법 입니다.
리틀 엔디안은 하위 바이트의 값이 메모리상에 먼저 표시되는 방법 입니다.
예를 들어 0x12345678 이란 데이터를 메모리에 쓴다면 빅엔디안은 아래와 같이 메모리에 표시됩니다.
0x12 |
0x34 |
0x56 |
0x78 |
그리고 리틀엔디안은 아래와 같이 메모리에 표시됩니다.
0x78 |
0x56 |
0x34 |
0x12 |
정확히 시스템이 어떠한 방식을 쓰느냐는 CPU에 따라 달라집니다.
이렇게 메모리에 표현되는 것 즉, 어떠한 순서로 데이터들이 메모리에 쓰여지는 것을 호스트 바이트 순서 라고 합니다.
그런데 문제가 있습니다. 무슨 CPU을 쓰느냐에 따라 호스트 바이트 순서가 다르기 때문에 만약 서로 다른
CPU를 사용하는 컴퓨터들이 데이터를 주고 받을 때 문제가 발생합니다.
이 문제점 때문에 네트워크를 통해 데이터를 전송할 때는 통일된 방식을 이용해
데이터를 전송하기로 약속을 했는데 이것이 바로 네트워크 바이트 순서 입니다.
네트워크 바이트 순서는 빅엔디안 방식만 사용하기로 약속되어 있습니다.
리틀엔디안 방식을 사용하는 컴퓨터는 데이터를 보내기 전에 빅엔디안 방식으로
데이터를 바꿔야 하고 받을 때도 전송되는 데이터들을 역순으로 받아 조합해야 합니다.
또 sockaddr_in 구조체 안에 존재하는 모든 값들은 네트워크 바이트 순서로 채워져야 합니다.
바이트 순서는 변환 함수를 이용해서 변환시킵니다.
'# Network > [ Network ]' 카테고리의 다른 글
[허언증/네트워크] htonl() / htons() / ntohl() / ntohs() 바이트 순서 변환 (0) | 2019.12.07 |
---|---|
[허언증/네트워크] Port(포트)와 소켓(Socket) 차이 (0) | 2019.11.23 |
[허언증/네트워크] URL / HTTP (0) | 2019.10.31 |
[허언증/네트워크] 네트워크 스캐닝 하는 방법(실습) (0) | 2019.03.27 |
[허언증/네트워크] IP와 Port(포트) 관계 (0) | 2019.03.25 |