엔디안이란?
- 데이터에 여러 바이트가 있는 경우 바이트 순서를 정하는 규칙
- 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 |