상세 컨텐츠

본문 제목

NBO와 HBO

TOOLS/TIPS

by koharin 2020. 7. 13. 18:18

본문

728x90
반응형
nibble byte의 절반. 4bit 0x0 ~ 0xF
(0~15)
byte  memory addressing 단위. 8bit 0x00 ~ 0xFF
(0~255)

 

Network Byte Order 실습

 

- 우분투 18.04 wireshark 실습 (sudo wireshark)

 

- 먼저 빨간색 버튼을 눌러 패킷을 멈추고, 톱니바퀴를 눌러서 가장 많이 보이는 포트의 브라우저의로부터의 패킷을 차단하기 위해 해당 브라우저의 UDP port를 입력한다. (특정 브라우저로부터의 패킷을 확인하기 위해)

=> not udp port 4660

 

- 차단 후 http 입력. 다시 브라우저를 새로고침하면 원하는 브라우저로부터의 패킷 확인 가능

 

- TCP 헤더의 Dest port에 4660이 아닌 hex 값 0x1234를 넣고 패킷을 보낸다. 보낼 때는 0x1234로 보낸다.

이것을 네트워크 바이트 오더(Network Byte Order)라고 한다.

 

 

하지만 이를 메모리에 넣을 때는 little endian 방식으로 들어간다.

0x1234는 0x3412로 메모리에 들어가는 것이다. 

이는 Host Byte Order(호스트 바이트 오더)로 변환됐다고 한다.

 

따라서 NBO(Network Byte Order)와 HBO(Host Byte Order) 변환하는 방법을 알고있어야 한다.

 

먼저 4660이라는 숫자가 메모리  상에 어떻게 존재하는지 확인해보자.

 

16bit의 경우와 32bit 경우가 다르다.

 

16bit 실습

 

- AABB가 있으면 AA00, BB00으로 먼저 나눈다. (byte 단위로)

- bit mask 필요: 오버헤드를 줄이기 위해 사용. 있으면 1, 없으면 0으로 표현,

 

uint16_t my_ntohs(uint16_t n)
{
        uint16_t n1 = (n & 0xFF00); // 0x1200
        uint16_t n2 = (n & 0x00FF); // 0x0034
        uint16_t n3;

        printf("%04x\n", n1);
        printf("%04x\n", n2);

        n1 = n1 >> 8; //0x12
        n2 = n2 << 8; //0x3400

        printf("%04x\n", n1);
        printf("%04x\n", n2);
        n3 = n1|n2;
        printf("%04x\n", n3);
        return (n1 | n2);

}

 

32bit 실습

 

- 그냥 출력 시 0x78563412로 출력되는데, little endian으로 메모리에 넣어서 0x12345678이 출력되도록 한다.

 

uint32_t my_ntohl(uint32_t n)
{
        uint32_t n1 = (n & 0xFF000000); //0x12000000
        uint32_t n2 = n & 0x00FF0000; //0x340000
        uint32_t n3 = n & 0x0000FF00; //0x5600
        uint32_t n4 = n & 0x000000FF; //0x78

        uint32_t n5;

        printf("%x %x %x %x\n", n1, n2, n3, n4);

        n1 = n1 >> 24; // 0x12
        n2 = n2 >> 8; // 0x3400
        n3 = n3 << 8; // 0x560000
        n4 = n4 << 24; // 0x78000000
        n5 = n1|n2|n3|n4;
        printf("0x%x 0x%x 0x%x 0x%x\n", n1, n2, n3, n4);
        printf("0x%x\n", n1|n2|n3|n4);
}

- 메모리 상 위치를 확인해보면 스택이 작은 주소로 자라므로 n4 | n3 | n2 | n1 각각에 0x78, 0x56, 0x34, 0x12가 잘 들어가 있다.

 

 

 

16bit 숫자 입력 + 출력 실습

 

void  write_0x1234() {
        uint8_t network_buffer[] = { 0x12, 0x34 };
        uint16_t* p = reinterpret_cast<uint16_t*>(network_buffer);
        //uint16_t n = my_ntohs(*p); // TODO
        uint16_t a;
        scanf("%hx", &a);
        //uint16_t n = ntohs(*p);
        uint16_t n = ntohs(a);
        printf("16 bit number=0x%x\n", n);
}

화살표한 부분이 입력인데, 3412로 입력을 할 경우, 1234로 출력된다.


728x90
반응형

관련글 더보기