2017-03-06 10 views
0

나는 넷 블럭과 그 안에 할당 된 목록이 주어진 CIDR 넷 블럭 내에서 "프리 픽스 (free prefixes)"를 결정하는 방법을 찾으려고합니다.CIDR 넷 블럭 내에서 프리픽스 찾기

예를 들어

:

하자 netblock = 10.0.0.0/22 ​​

하자 할당 = {10.0.0.0/24, 10.0.1.0/24}

가장 효율적인 계산이 될 것입니다 무엇 10.0.0.0/22에서 '무료'넷 블록을 파악하는 방법은 무엇입니까? 위 예제의 경우 10.0.2.0/23을 출력해야합니다.

나는 연구를 시도했으며 대부분 비어있었습니다. IP를 확장 일반적인 IP를에

  • 매치> 목록과 목록
  • 에서 제거 -

    1. CIDR : 내 마음에 (아마도 네트워크 프로그래밍 내 경험 부족에) 오는 유일한 방법입니다 수정 된 목록을 다시 CIDR 표기법으로 변환하십시오.

    그러나 이것은 상당히 비효율적 인 것으로들합니다. (나는 그것을 "bruteforce"접근이라고 부릅니다.)

    저는 일반적인 알고리즘으로 문제가 없지만 Java 관련 답변 일 필요는 없습니다.

    감사합니다. :)

  • +0

    예제는 부모 블록의 시작 부분에 할당되어 있고 비트 경계에 따라 잘 정렬되어 있으므로 "완벽한 경우"이지만 "10.0.2.111/30"과 같은 값을 가질 수도 있습니다. 리스트의 경우 10.0.0.0-10.0.2.110을 커버하기 위해 하나의 연속 블록을 정의 할 수 없으며 10.0.0.0-10.0.2.107과 M 개의 출력 블록을 포함하는 N 개의 출력 블록을 정의해야합니다 10.0.2.112-10.0.3.255를 커버하십시오. 그래도 여전히 할 수 있지만 더 어려운 작업입니다 (적어도 N과 M을 가능한 한 작게 유지하면서 최적의 솔루션을 찾고 싶다면). – zeppelin

    +0

    @zeppelin 참으로. 내 경우에는 할당 크기가 적어도 항상/24로 보장되지만, 당신이 말하는 것을 이해합니다. –

    답변

    0

    주소 x/y가 주어지면 주소 집합에서 주소를 빼면 집합의 주소는 < x이고 집합의 주소는 b/y, 여기서 b> x

    예에서 10.0.0.0/24에서 10.0.0.0/24를 빼면 10.0.1-3.0/24가됩니다.

    10.0.0.0/22에 주소 x/24가 없는데 x < 10.0.0.0입니다. 10.0.0.0/22에서 y> 10.0.0.0 인 주소 y/24는 10.0.1.0/24, 10.0.2.0/24 및 10.0.3.0/24 또는 10.0.1-3.0/24입니다.

    또 다른 방법은 그것을 볼 수 있습니다 : 당신이 그 첫 번째 24 비트 10.0.0

    있습니다 그래서 먼저 24 비트 더 큰 모든 주소를 남긴다 모든 주소, 그리고 그의 첫 번째 24 비트 작은 모든 주소를 제거합니다. 이들 각각은 범위로 표현 될 수 있습니다.

    이 과정을 반복해서 반복하면됩니다.

    +0

    이들 각각은 범위로 표현 될 수 있습니다. 항상 그런 것은 아닙니다. 원본 블록이 10.0.0.0/21이고 10.0.5.0/24가 제거 된 경우 맨 아래쪽에있는 것은 10.0.0.0-1.0.4입니다.255는 CIDR 표기법에서 단일 범위로 기록 할 수 없습니다. – zeppelin