2013-06-21 1 views
1

2001 : 0DB8 ::/32 범위의 사람들에게 IPv6 주소를 할당하고 싶다고합시다. 대부분은 순차적으로 제공되지만 일부는 순차적이지 않습니다. 이 DB 테이블은 이미 할당 된 주소를 보여줍니다.다음 사용 가능한 IP 주소와의 거리 계산

+-----------------------------------------+ 
|     Address     | 
+-----------------------------------------+ 
| 2001:0DB8:0000:0000:0000:0000:0000:0001 | 
| 2001:0DB8:0000:0000:0000:0000:0000:0002 | 
| 2001:0DB8:0000:0000:0000:0000:0000:0003 | 
| 2001:0DB8:0000:0000:0000:0000:0000:0009 | 
| 2001:0DB8:0000:0000:0000:0000:0F00:0001 | 
| 2001:0DB8:0000:0000:0000:0000:0F00:0002 | 
+-----------------------------------------+ 

이 부족하게 채워져 있음을주의 - 처음 3는 촬영 후 다음 중 하나가 수행 될 때까지 다음 다른 전에 수백만 주소의 차이가 촬영 5 개 사용 가능한 주소가 있습니다.

내가하고 싶은 일은 인 서브넷의 시작 부분부터 다음 번에 사용 가능한 주소를 할당하는 것입니다. 이 경우 처음부터 시작하기에 충분히 쉬우 며, 2001 : 0DB8 :: 4에 대한 레코드가 아직 없음을 발견하고이를 사용하십시오. 그러나 결국 사용 가능한 다음 주소는 서브넷 시작부터 수천 또는 수백만 단계 떨어져있을 수 있습니다. 한 번에 한 주소 씩 데이터베이스를 걷는 것은 좋지 않은 아이디어입니다. 각 주소는 자체 목록에서 다음 중 하나 사이에 얼마나 많은 사용 가능한 주소 가리 키도록

나는 테이블에 다른 필드를 추가 생각 :

+-----------------------------------------+--------------------+ 
|     Address     | Steps to next addr | 
+-----------------------------------------+--------------------+ 
| 2001:0DB8:0000:0000:0000:0000:0000:0001 |     1 | 
| 2001:0DB8:0000:0000:0000:0000:0000:0002 |     1 | 
| 2001:0DB8:0000:0000:0000:0000:0000:0003 |     6 | 
| 2001:0DB8:0000:0000:0000:0000:0000:0009 |   15728632 | 
| 2001:0DB8:0000:0000:0000:0000:0F00:0001 |     2 | 
| 2001:0DB8:0000:0000:0000:0000:0F00:0003 |     | 
+-----------------------------------------+--------------------+ 

하지만 난 그 날 도움이 확실하지 않다 . IP 주소가 스파 스 섹션의 중간에 할당 된 경우 해당 주소에서 다음 단계까지의 단계가 몇 개인 지 계산 한 다음 새 주소 앞에 할당 된 주소로 돌아가야합니다. "next addr"단계를 수정하십시오. 아직도 느린 과정처럼 보입니다.

더 좋은 방법이 있나요?

+2

이 IPv6의 시작 주소를 할당하는 끔찍한 방법은 거의 확실하다. 나는 단지 (잘못 생각한) 숙제 임에 틀림 없다. –

+0

@MichaelHampton 나는 주소 할당 알고리즘을 생각해내는 데 진정으로 관심이있다. 아마도이 질문에 대한 답변으로 화제가 될 수도 있지만 (기존 IPAM 데이터베이스를 보완하는 내용을 다루기 때문에) 새로운 질문에 대한 답변으로 기대됩니다. –

+0

@JeremyVisser 그건 DHCP가 무엇을위한거야 ... –

답변

1

여기에 접근 방식을 약간 조정하면 해결할 수 있습니다. 여기에 사용되지 않은 간격을 채우려는 이유는 기존 데이터베이스가 부족하여 더 잘 활용하고 싶다고 가정하기 때문입니다.

원래 테이블을 유지하고 next_address 필드 (예 : Settings 테이블)를 별도로 저장하십시오. 코드를 처음 배포 할 때 next_address2001:db8::1으로 시작합니다.

귀하의 get_next_address() 기능은 다음과 같이 보일 것입니다 :

def initialise_settings(): 
    if not Settings.exists('next_address'): 
     Settings.set('next_address', IPv6('2001:db8::1')) 

def get_next_address(): 

    next = Settings.get('next_address') 

    # Check for already filled rows -- breaks loop upon finding gap 
    while Database.row_exists({'Address': next}): 
     next += 1 

    Settings.set('next_address', next + 1) 
    return next 

get_next_address() # 2001:db8::4 
get_next_address() # 2001:db8::5 
get_next_address() # 2001:db8::6 
# ... 
get_next_address() # 2001:db8::f00:0 
get_next_address() # 2001:db8::f00:2 
get_next_address() # 2001:db8::f00:4 
get_next_address() # 2001:db8::f00:5 
+0

예, 할당 전략이 다른 DB를 상속 받았습니다. 다음으로 사용 가능한 IP 주소가 가장 많이 사용되는 경우가 많지만 기기의 MAC 주소 등과 같은 요소를 기반으로 주소의 덩어리가 이미 할당되어 있습니다. 나는 당신의 해결책을 이해하고 있다고 생각합니다. 다음 주소로 단계보다 -하지만 두 개의 할당 된 주소 사이에 몇 백만 개의 주소의 차이가 있다면 next_address 계산은 여전히 ​​큰 둔화가되지 않을까요? 하지만 적어도 초기 실행에는 어쩔 수없는 일입니다. –

+0

이미 실행중인 할당 된 주소의 큰 블록이 있고 그 다음에 예를 통해 반복하는 데 시간이 걸립니다.그러나 알고리즘의 단순성이 단점보다 중요하다고 생각합니다. 결국 당신은 거기에 도착할 것이고, 이해하기가 상대적으로 쉽습니다. 이해의 용이함은 그것으로 본질적인 신뢰성을 지닙니다. :-) –