Oracle

IPv6 범위 검색, 마스크 검색

라미로 2018. 3. 7. 23:51

 

1. 범위 검색

- 애초에 이런 쿼리로 만들어서 하는방법이 있다.

BETWEEN  TO_NUMBER('20014430000000000000000000000000', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
            and      
              TO_NUMBER('20014430ffffffffffffffffffffffff', 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')

 

- 이 범위가 부담되면, 64진수로 바꿔쓰면 줄어들기야 하겠지만, 어차피 ipv6 범위검색을 많이 하지는 않으니까 크게 의미는 없는듯.

 

 

2. 마스크 검색

- 이게 좀 까다롭다.  2001:4430::/32 를 예로 들면, 저기 앞에있는 숫자 하나가 4byte 라서,

확장주소로 변환해봤자 2001:4430:000000000000000000000000 즉 32자리기 때문에 /128 마스크를 감당할수없다.

방법이 있다며 2진수로 128비트까지 확장시켜야하고, 그 상태에서 BETWEEN 검색을....

 

일단,  내가 찾은 방법은 그런방법은 아니다.

문제가 되는 부분은 /32 같이 4의 배수로 떨어지는게 문제가 아니라, /33, /34, /35 같은 4로 떨어지지 않는게 문제인것이다.

/33을 예시로 들어보면,

 

STEP 1. 마스크를 4로 나눈 나머지값 계산

-> 33%4 = 3 

어차피 결과는 4의 배수면 범위계산이 쉽게 때문에 의미가 없고, 1,2,3 3개의 경우의 수만 생각하면 된다.

그리고 16진수 기반의 IPv6 주소의 한자리가 4비트이므로, 위의 경우의 수에 대입하면 아래와 같은 결과가 나온다

     1 : 1000
     2 : 1100
     3 : 1110
     4 : 1111 < 4의 배수이므로 의미가없음

 

즉, 하나의 문자가 4bit 이므로 1000의 경우의 수는
    1000 = 8(0x8)
    1100 = 12(0xC)
    1110 = 14(0xE) 가 되고,

 

/33의 의 4 나머지는 1이므로 8 이고, 그러므로 범위는 아래와 같다.

    2001:4430:800000000000000000000000  ~
    2001:4430:fffffffffffffffffffffffff

 

만약 /34였다면?
    - 4의 배수가 아니라서, 마찬가지로 계산 -> 1100 (0xC) 이므로 범위는 아래와같음
           2001:4430:C00000000000000000000000  ~
    2001:4430:fffffffffffffffffffffffff