DRT(분산 라우팅 테이블)는 각 노드가 DRT API를 사용하는 애플리케이션의 인스턴스인 협력 노드의 메시로 존재합니다. 키를 게시하는 노드는 다른 노드에서 키를 게시하고 확인하는 데 도움을 줍니다. 노드는 피어를 지원할 필요가 없는 "해결 전용" 방식으로 참여할 수도 있습니다. DRT 프로토콜은 UDP/IPv6 전송을 통해 실행됩니다.
키를 게시하는 노드는 메시에 있는 다른 노드의 로컬 라우팅 테이블을 빌드하고 유지 관리합니다. 이 라우팅 테이블은 노드가 로컬 라우팅 테이블에서 직접 키를 찾거나 대상에 숫자적으로 가까운 키를 게시하는 다른 노드에 요청하여 메시에서 특정 키를 빠르게 찾을 수 있도록 최적화되어 있습니다. 이 작업은 필요한 키를 찾거나 노드에서 해당 키가 없는 것으로 판단될 때까지 반복됩니다.
DRT 키는 부호 없는 256비트 정수입니다. 키 간의 근접성은 키 간의 숫자 차이에 의해 정의됩니다. DRT 키스페이스는 원형으로 간주됩니다. 예를 들어 가능한 첫 번째 키 값과 마지막 가능한 키 값은 인접 항목으로 간주됩니다.
보안 DRT에서 노드는 게시하는 키를 인증해야 합니다. DRT가 초기화될 때 노드가 DRT API를 사용하여 키를 인증하는 메커니즘을 설정해야 합니다. 이 작업은 DRT에 대한 보안 공급자를 선택하여 수행됩니다. 보안 공급자는 키를 인증하는 데 사용되는 토큰을 생성하고 다른 노드에서 생성된 토큰을 확인할 수 있는 모듈입니다. 이 설명서에 정의된 보안 공급자 인터페이스를 구현해야 합니다. Windows 7 DRT는 Windows 애플리케이션을 빌드하는 데 사용할 수 있는 완전히 구현된 두 개의 보안 공급자와 함께 제공합니다.
초기화 중에 애플리케이션은 DRT에 부트스트랩 공급자를 제공해야 합니다. 부트스트랩 공급자는 DRT 메시에 이미 있는 노드의 네트워크 엔드포인트를 검색할 수 있는 모듈이며 새 노드가 설정되면 DRT에 의해 호출됩니다. 보안 공급자 모듈과 마찬가지로 부트스트랩 공급자는 잘 정의된 인터페이스를 구현해야 합니다. Windows 7 DRT는 완전히 구현된 두 부트스트랩 공급자와 함께 제공됩니다.
DRT는 키의 인접 항목을 특수한 것으로 간주합니다. 게시된 키보다 숫자가 작은 가장 가까운 키 5개와 숫자가 큰 가장 가까운 키 5개가 결합하여 '리프 집합'이라고 불리는 것을 형성합니다. DRT는 DRT API를 통해 키의 리프 집합에 대한 변경 내용을 보고합니다.
DRT 수명 주기 및 상태 전환
애플리케이션은 DrtOpen 함수를 사용하여 로컬 DRT 인스턴스를 초기화할 수 있습니다. 이 함수는 부트스트랩 프로세스를 트리거합니다. 여기서 DRT API는 부트스트랩 공급자를 호출하여 이미 DRT에 참여하고 있는 다른 노드의 키와 네트워크 엔드포인트를 알아봅니다. 부트스트랩 공급자가 하나 이상의 다른 노드를 성공적으로 찾으면 DRT는 DRT_ACTIVE 상태가 됩니다. 이 상태에서 애플리케이션은 다른 노드에서 게시한 키를 검색하고 확인할 수 있는 키를 게시할 수 있습니다. 부트스트랩 공급자가 다른 노드를 찾을 수 없으면 DRT는 DRT_ALONE 상태가 됩니다. DRT는 DRT_ALONE 상태로 유지되며 피어를 찾고 DRT_ACTIVE 상태로 이동하기 위해 주기적으로 부트스트랩을 시도합니다.
노드는 DRT_ACTIVE 상태에서 이러한 상태로 전환할 수 있습니다.
| 수명 주기 상태 | 여건 |
|---|---|
| DRT_ALONE | 로컬 노드가 DRT의 다른 노드를 검색하지 않았습니다. 이 상태에서 노드는 DRT 내의 다른 노드를 계속 수신 대기합니다. 다른 노드가 DRT에 조인하는 경우 로컬 노드는 DRT_ACTIVE 상태로 전환됩니다. 네트워크가 다운되면 DRT_NO_NETWORK 전환됩니다. DRT에 심각한 오류가 발생할 경우 노드는 DRT_FAULTED 상태로 전환됩니다. |
| DRT_NO_NETWORK (네트워크 연결 없음) | 노드가 네트워크 연결을 끊으면 DRT_NO_NETWORK 상태로 전환됩니다. 이 시점에서 애플리케이션은 네트워크 연결이 복원될 때까지 대기하고 DRT를 닫을 수 있습니다. |
| DRT_고장 발생 | 로컬 노드 내에서 심각한 오류가 발생했습니다. 예를 들어 로컬 컴퓨터의 실제 메모리가 부족합니다. 노드가 이 상태로 진입하는 동안 애플리케이션은 DrtClose API를 호출하고, 문제를 수정하고, drtOpenDRT를 다시 초기화해야 합니다. |