Network Byte Ordering

프로그래밍 2022. 6. 23. 09:29

앞서 posting한 DICOM에서의 Transfer Syntax에서도 Little Endian, Big Endian 에 관한 내용이 있습니다.

DICOM 뿐만 아니라 일반적인 Socket programming 에서도 항상 byte order를 신경써야 합니다.

그런데 이건 도대체 왜 필요한 것일까요? CPU에 따라서 사용되는 Order가 다르다는 것은 대부분 알고 있을 테지만 도대체 무슨 의미 일까요?

 

저장소에 있는 File을 network을 통해 전송하는 경우를 생각해 보겠습니다. File 의 종류마다 Header가 각각 있을테니, 어떤 파일이 아래의 그림과 같다고 가정해 보겠습니다.

 

File Loading

보통 Storage에 들어 있는 File data가 Memory에 올라 오려면 CPU 의 register를 거치게 됩니다. CPU에 의해서 한 번 처리된 data가 memory에 올라오는 것이지요.

 

그런데 여기서 각 CPU 제조사들 마다 register에 올라온 data를 처리하는 방식이 달라집니다.

Intel, AMD 계열과 IBM, ARM, Motorola 계열이 다른 것이지요.

1 byte 짜리 data를 처리하는 데에는 아무런 조작이 필요 없습니다만... 2 bytes 짜리 이상의 data type을 처리할 때에 byte의 순서가 달라집니다. 여기서 주의해야 할 것은 이 data가 Type이 있는 경우만 byte order 가 달라집니다.

 

예를 들어 File Header data를 network으로 전송한다고 가정해 봅시다.

Header의 정보 중에 File Size 부분이 2 bytes type으로 정의되어 있다면...

그것을 Intel CPU가 Register를 거쳐 메모리에 저장한 data 를 그대로 전송하고 IBM CPU가 이것을 받아서 register에 올려서 처리한다면 이것은 File Size 값이 완전히 다르게 전달되는 것입니다.

 

File의 Contents 부분이 그냥 Binary data이고 Type 같은 것은 없다고 가정해 보면.... Contents 영역의 data를 보낼 때에는 byte 순서를 고민할 필요가 없습니다.

 

내가 만약 Contents 부분을 2bytes 씩 잘라서 전송하려고 한다.....면 byte order는 신경쓸 필요가 없습니다. Type이 있는 data의 경우만 고민해야 하니까요.

 

 

Network Byte Order

Socket 통신을 할때에 Little, Big Endian 이 달라지는 문제를 해결하기 위하여 2bytes 이상의 Type이 있는 data는 Network byte order를 따르게 되어 있습니다. 공통된 규칙을 만들어 버린 것이지요.

 

Network byte order로 변환하는 방법은 인터넷에 많이 있으니 생략 합니다.

 

 

728x90
반응형
admin