바이트 순서


바이트 순서는 해당하는 OS 시스템이 내부적으로 데이터를 표현하는 방법을 의미한다.

그렇기 때문에 모든 시스템의 데이터 표현방식이 같지 않다.


표현방식에는 2가지 방식이 존재한다.






Little Endian, Big Endian


시스템이 내부적으로 데이터를 처리하는데 Big-Endian을 사용하느냐 Little-endian을 쓰느냐는 시스템의 CPU에 따라 달라진다.

이것을 호스트 바이트 순서라고 한다.



Little Endian 

Big Endian 

 intel x86

 IBM

 AMD

 ARM

 EDC

 Motorola




0x12345678 의 32비트 데이터를 표현



Big Endian : 0x12 0x34 0x56 0x78


낮은 주소 -> 높은 주소




Little Endian : 0x78 0x56 0x34 012


낮은 주소 -> 높은 주소





그렇기 때문에 빅 엔디안을 쓰는 CPU와 리틀엔디안을 사용하는 CPU가 데이터 통신을 하게 되면 문제가 발생할 수 있다.




네트워크 바이트 순서


네트워크 바이트 순서는 Big Endian 방식만을 사용한다.

따라서 Little Endian을 사용하는 경우  Big Endian 방식으로 데이터를 변경해서 전송해야 하며 수신한 데이터에 대해서 역순으로 조합해야 한다.

또한 포트와 주소는 항상 네트워크 바이트 순서 규칙을 사용하여 소켓 함수를 호출 할 때 지정된다.






바이트 순서 전환


h : host byte order

n : network byte order

l : long(32bit)

s : short(16bit)



일반적으로 4byte의 long  타입은 IP 변환에 사용되며, 2byte의 short 타입은 포트 변환에 사용된다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket
 
 
host_port = 0x3456
host_ip = 0x12345678
 
network_ip_order = socket.htonl(host_ip)
network_port_order = socket.htons(host_port)
 
print("CPU is Intel")
print("Host %x" %(host_ip))
print("Network Byte Order %x" %(network_ip_order))
print("Port %x" %(host_port))
print("Network Byte Order %x" %(network_port_order))
 
cs



>>CPU is Intel

>>Host 12345678

>>Network Byte Order 78563412

>>Port 3456

>>Network Byte Order 5634








JAVA


자바에서는 기본적으로 부호없는 정수 (Unsigned int)는 존재하지 않으며 정수를 표현할 때 빅 엔디안을 따른다.


그렇기 때문에 다른 플랫폼에서 사용한 데이터의 네트워크 바이트 순서 전환없이 리틀 엔디안의 데이터를 받는다면, 빅 엔디안으로 변경할 필요가 있다.


(애초에 네트워크 바이트 순서의 빅 엔디안으로 사용하는 것이 좋을 것이다.)


1
2
3
4
5
6
7
8
public static int getBigEndian(byte[] v)throws Exception{
int[] arr = new int[4];
for(int i=0;i<4;i++){
arr[i] = (int)(v[3-i] & 0xFF);
}
return ((arr[0<< 24+ (arr[1<< 16+ (arr[2<< 8+ (arr[3<< 0));
}
}
cs








참고 : http://iblog.or.kr/hungi/it/server/network/2056

'System > Network ' 카테고리의 다른 글

AWS 네트워크 정리 - VPC, Subnet, Routing Table ..  (0) 2020.01.17
브릿지(Bridge)  (0) 2018.09.17
TCP 3-way Handshake vs 4-way Handshake  (0) 2018.05.19
TCP Header 구조체 분석  (0) 2018.05.09
TCP/IP , OSI 7 Layer  (0) 2018.04.01

+ Recent posts