CS / / 2024. 10. 24. 15:00

엔디안이란? (빅엔디안 / 리틀엔디안)

엔디안이란?

  • 데이터에 여러 바이트가 있는 경우 바이트 순서를 정하는 규칙
  • cpu가 메모리를 접근하는 방식
    • 1byte짜리 데이터는 상관없지만, 2byte 이상(short, int, long, …)인 multibyte일 경우 메모리에 저장하는 순서를 이야기하는 것
    • 내가 쓰는 시스템 cpu에 따라 결정됨 → os도 아니고 cpu가 결정하는 것
    • 나 혼자 쓰는 거면 cpu가 내가 저장한 형태로 읽고 쓰니까 중요하지 않은데, 네트워크로 연결될 경우 나와 상대방 간의 엔디안이 다를 수 있음
  • 빅 엔디안, 리틀 엔디안 두 가지 방법

 

빅 엔디안(Big-endian)

  • 낮은 주소에 데이터의 높은 바이트(MSB: Most Significant Byte)부터 저장
  • 숫자의 상위 바이트가 최하위 주소에 저장되고 하위 바이트가 최상위 주소에 저장됨을 의미
  • 평소 사람이 사용하는 선형 방식과 같아 메모리에 저장된 순서 그대로 읽을 수 있으며, 이해하기 쉬움
    • 123F 데이터가 있으면, 이 순서대로 저장되어 있는 것

 

저장할 32bit 크기의 정수

0x12345678
// 16진수는 한 자리당 4비트 (2^4=16)

 

4개의 byte(4byte == 32bit)로 나뉨

0x12, 0x34, 0x56, 0x78

 

리틀 엔디안(Little-endian)

  • 낮은 주소에 데이터의 낮은 바이트(LSB: Least Significant Byte)를 저장
  • 숫자의 하위 바이트가 메모리의 최하위 주소에 저장되고 상위 바이트가 최상위 주소에 저장됨을 의미
  • 평소 사람이 숫자를 사용하는 선형 방식과 반대로 거꾸로 읽어야 함
    • 123F 데이터가 있으면, 3F 12 처럼 한 바이트씩 끊어서 역순으로 순서 바뀌는 것

 

저장할 32bit 크기의 정수

0x12345678
// 16진수는 한 자리당 4비트 (2^4=16)

 

4개의 byte(4byte == 32bit)로 나뉨

0x12, 0x34, 0x56, 0x78

 

빅 엔디안 vs 리틀 엔디안

  • x86 아키텍처(인텔)가 리틀 엔디안을 쓰기 때문에 오늘날 x86 아키텍처를 사용하는 대부분의 데스크톱 컴퓨터는 리틀 엔디안 방식 사용
    • 인텔 cpu 기반 리눅스가 대세 → 대부분 리틀 엔디안
    • 전통적인 os는 빅 엔디안
  • 네트워크에서는 주소를 주로 빅 엔디안으로 씀
    • 역사적으로 라우팅이 전화를 거는 식으로 접두 부호로 이루어졌기 때문
    • → 주소의 앞부분이 더 중요한 정보

 

네트워크 전송 시 엔디안이 다를 경우?

데이터 해설 순서가 달려져서 값이 이상하게 바뀜 → 상호 간 표준처럼 엔디안 통일하자!

⇒ 네트워크로 전송되는 모든 데이터는 빅엔디안으로 쓰자고 국제표준으로 결정함

⇒ inet_pton 사용

 

inet_pton

  • 사람이 알아보기 쉬운 텍스트(human-readable text) 형태의 IPv4와 IPv6 주소를 binary 형태로 변환하는 기능
  • “네트워크 패킷으로 이상한 데이터를 주네?”가 없으려면 inet_pton으로 네트워크 바이트 오더(빅 엔디안)에 맞춰 이진 형식으로 변환
    • 기존에 빅 엔디안: 비어 있음
    • 기존에 리틀 엔디안: 바이트 순서 바꿔주는게 구현되어 있음
#include <arpa/inet.h>
 
int inet_pton(int af, const char *src, void *dst);
// int inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr);
  • af [input] -  address family를 지정
    • IPv4 주소: AF_INET
    • IPv6 주소: AF_INET6
  • src [input] - 문자열 형태의 IP주소를 넣음
  • dst : [output] - src를 binary 형태로 변환 후 복사된 메모리의 포인터

 

[반환값 (Return value)]

  • 1: 네트워크 주소가 성공적으로 변환되었음
  • 0: src의 문자열이 나타내는 네트워크 주소가 af에 명시된 address family의 유효한 값이 아닌 경우
  • -1: af가 적절한 address family값이 아닌 경우

※ 서로 리틀 엔디안이라는 것이 확실하면 변환하지 않고 바로 전송하기도 함

→ 변환에는 오버헤드가 들어가니까

 

connect는 TCP에서만 사용

  • TCP는 connection인데, UDP는 connectionless이기 때문
  • connection 되고 나면 fd가 매우 중요한 개념

 

Reference

https://code-lab1.tistory.com/179

 

[컴퓨터 아키텍처] 리틀 엔디안(Little-endian) 과 빅 엔디안(Big -endian)이란?

바이트 저장 순서 컴퓨터는 데이터를 메모리에 저장할 때 Byte 단위로 나눠서 저장한다. 따라서 연속되는 바이트를 순서대로 저장해야 하는데, 이것을 바이트 저장 순서(Byte Order)라고 한다. 이때

code-lab1.tistory.com

 

'CS' 카테고리의 다른 글

프로세스 & 스레드  (0) 2024.10.24
[c언어] TCP/IP Socket 통신 흐름  (0) 2024.10.07
Transport Layer - TCP  (0) 2024.10.07
Linux Kernel & Process Management  (1) 2024.10.07
Linux Kernel & Program Execution  (0) 2024.10.07
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유