NDN - Watched-Prefix-Insertion-Protocol
Watched Prefix Insertion Protocol
Watched Prefix는 Repo insert 를 위한 새로운 프로토콜입니다. 이 프로토콜을 사용하여 repo 는 동일한 prefix 로 데이터를 요청하도록 interest 를 계속 전송합니다. 데이터 패킷이 수신되면 repo 는 수신된 데이터를 제외하고 새 데이터를 요청하도록 selector (대부분의 경우 exclude selector) 를 업데이트합니다. Repo 는 전송된 interest 의 총량이 특정 숫자 또는 timeout 에 도달하지 못하도록하는 interest 가 표시 될 때까지 prefix 시청을 중단합니다.
1. Basic operations
1.1 Start watched prefix insertion
Command verb: watch start
name 은 Repo Command 포멧을 따릅니다.
예를 들어, <repo prefix>
를 /ucla/cs/repo 로 지정하면 다음과 같습니다:
/ucla/cs/repo/watch/start/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
이 명령은 다음 parameter 를 사용합니다.
Name
(required)InterestLifetime
(optional)MaxInterestNum
(optional)WatchTimeout
(optional)Selectors
(optional)
parameter 에 대한 세부설명:
Name
: watched prefixInterestLifetime
: 전송 interest 와 수신 데이터 간의 최대 대기 시간; 지속시간이 interest 시간 초과보다 크면 동일한 interest 가 다시 전송; interest timeout 내에 데이터가 수신되면 interest selector 가 업데이트되어 새로운 데이터를 요청; 지정하지 않으면 기본값 (4000 밀리 초) 이 설정MaxInterestNum
: 전송할 수 있는 총 interest 의 최대 값; interest 의 총 수가이 한도에 도달하면 프로세스 중단; 지정하지 않으면 MaxInterestNum 은 0 으로 설정되고 무한대를 의미WatchTimeout
: 프로세스의 지속 시간; Repo 는 시간이 끝날 때까지 prefix 를 계속 watching; WatchTimeout 은 0 으로 설정되며 프로세스는 영원히 계속 실행Selectors
: 수신된 데이터를 제외하고 새 데이터를 요청하는 데 사용
1.2 Watch status check
Command verb: watch check
watched prefix 진행 도중 requester 는 진행 상태를 확인하기 위해 watch status check command 를 보낼 수 있습니다. watch check command 는 Repo Command 입니다. watch check command 의 의미는 다음과 같습니다:
/ucla/cs/repo/watch/check/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
이 command 는 다음 parameter 를 사용합니다:
Name
(required)
parameter 에 대한 자세한 설명:
Name
은 watched prefix 입니다.
1.3 Stop watched prefix insertion
Command verb: watch stop
watched prefix 진행중에 requester 는 watch stop prefix insert 를 중지하기 위해 watch stop command 를 보낼 수 있습니다. stop command 은 Repo Command 입니다.
/ucla/cs/repo/watch/stop/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
command 는 다음 parameter 를 사용합니다:
Name
(required)
parameter 에 대한 자세한 설명:
- Name: watched prefix
2. RepoCommandResponse
이 watch status 데이터 객체는 watch 명령과 watchCheck 명령의 응답 데이터 객체가 될 수 있습니다. repo command 응답 포멧을 따릅니다.
Response 는 두부분이 있습니다: InsertNumber 는 watched prefix 아래의 데이터 패킷이 Repo 에 몇 개 insert 되었는지 나타냅니다; StatusCode 는 프로세스 상태를 나타냅니다.
StatusCode 정의:
StatusCode | Description |
---|---|
100 | command 는 OK; watch the prefix 시작 |
101 | Watched Prefix insert 중지 |
300 | watched prefix Insert 진행중임 |
401 | watch 명령 또는 watchCheck 명령이 무효화 (invalidated) |
402 | BlockId 가 있음. BlockId 는 프로토콜에서 지원되지 않음 |
403 | Malformed Command |
404 | 프로세스가 진행되고 있지 않음 |
3. Protocol Process
3.1 Repo watch start command process:
- command 유효성 검사 (validate) 시작; 유효성이 확인되면 3 단계로 이동, 그렇지 않으면 2 단계로 이동
- validation failure response; 이 단계를 중단하면 프로세스가 종료. (StatusCode: 401)
- Check parameters; interest 추출 할 수 없는 경우 부정적 응답 (StatusCode: 403) 을 보내고 프로세스 중지
- BlockId 가 있으면 부정적 응답 (StatusCode: 402) 을 전송하고 프로세스 중지
- interest 를 구성하려면 interest command 의 parameter 를 사용; Rightmost Child Selector 설정
- interest 보내고 timer 시작; 전송된 interest + 1 (초기 값은 0)
- 데이터를 받은 경우 8 단계로 이동, 시간이 초과되면 17 단계로 이동
- 데이터의 유효성이 확인되면 9 단계로 이동, 그렇지 않으면 15 단계로 이동
- watched prefix insert 실행 중인지 확인; 그렇지 않으면 프로세스 종료
- process times out(exceed watch timeout) 되거나 전송된 interest 의 총 수가 제한에 도달하면 11 단계로 이동, 그렇지 않으면 12 단계로 이동
- 모든 variables (전송된 interest 수, watch timeout, interest lifetime) 를 지우고 (단계를 중단) 프로세스 종료
- 데이터를 repo 에 store
- Update selector 및 수신된 항목을 min 에서 제외하고 업데이트된 selector 를 사용하여 새로운 interest 를 생성
- 신규 interest 와 전송된 interest 수에 1 을 더한 다음 7 단계로 이동
- 9-11 단계를 반복하고 12 단계를 건너뜀
- selector 를 업데이트 하고 수신 된 데이터만 제외 (name 이 작은 다른 데이터가 충족 될 수 있으므로); 14 단계로 이동
- 9-11 단계를 반복하고 12 단계를 건너뜀
- interest 를 보내고 전송된 interest 수에 1 을 더한 다음 7 단계로 이동
3.2 Repo watch check command process:
- check command validate 시작; 유효성이 확인되면 3 단계로 이동하고, 그렇지 않으면 2 단계로 이동
- validation failure 를 나타내는 응답을 보내고 이 단계를 중단하면 프로세스 종료 (StatusCode: 401)
- Check parameter; interest 에서 추출 할 수 없거나 checked 할 name 이 없는 경우 부정적인 응답 (StatusCode: 403) 을 보냄
- 해당 프로세스가 존재하는지 확인; 그렇다면 5 단계로 이동, 그렇지 않은 경우 부정 응답을 보냄 (StatusCode: 404)
- processId 를 사용하여 응답을 찾고 응답을 되돌려 보냄
3.3 Repo watch stop command process:
- stop command validate 시작; 유효성이 확인되면 3 단계로 이동, 그렇지 않으면 2 단계로 이동
- validation failure 를 나타내는 응답을 보내고 이 단계를 중단하면 프로세스 종료 (StatusCode: 401)
- Check parameter; interest 추출 할 수 없는 경우 부정 응답을 보냄 (StatusCode: 403)
- 프로세스를 중지하고 부정적인 응답을 보냄 (StatusCode: 101)
NDN - Basic-Repo-Insertion-Protocol
Basic Repo Insertion Protocol
기본 Repo insert 프로토콜은 Repo Command 를 사용합니다.
Repo insert command 는 Repo 가 내용을 검색 (retrieve) 하고 저장 (store) 하도록 요청합니다. 이 command interest 는 signed interest 이며 repo 에 의해 정의된 액세스 제어 정책으로 유효성 (validate) 이 검사됩니다. Interest 유효성이 확인되고 데이터의 name 이 repo 에 존재하지 않는 경우 저장소는 OK status 가 포함된 데이터 객체로 응답하고 insert 데이터를 가져올 interest 를 보내기 시작합니다.
세그먼트 데이터 insert 는 insert 프로토콜에서 지원됩니다. 분할 정보는 RepoCommandParameter 에 정의됩니다. 콘텐츠가 세그먼트화 되면 최종 세그먼트 ID 가 블록에 인코딩 됩니다.
Forwarding hint 는 대규모 NDN 네트워크에서 mobility 지원을 위한 내용입니다. Repo 는 insert 프로토콜에서 Forwarding hint 메소드를 지원합니다. 정기적인 interest 가 라우팅 불가 (unroutable) 면 사용자는 목적지 범위 (destination region) 가 포함된 링크 객체를 사용하여 interest 를 보냅니다. interest 가 사용자 범위 (region) 에지 (edge) 에 도달하면 라우터는 위임 정보를 선택합니다. 중계 라우터 (Intermediate router) 는 이 위임을 통해 interest 를 전달합니다. interest 가 생산자 (producer) 범위 (region) 에지 (edge) 에 도달하면 라우터는 원래 name 으로 interest 를 전달합니다.
1. Basic operations
1.1 Insert data
Command verb: insert
name semantics 는 insert
라는 repo command 포멧을 따릅니다.
예를들어 <repo prefix>
를 /ucla/cs/repo 로 지정하면 다음과 같습니다:
/ucla/cs/repo/insert/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
1.2 Insertion status check
Command verb: insert check
insert 진행 중에 요청자 (requester) 는 insert 진행 상태를 확인하기 위해 insert status check command 를 보낼 수 있습니다. 이 status check command 는 signed interest 형식입니다. insert status check 명령의 의미는 다음과 같습니다:
insert check 와 같습니다. 예:
/ucla/cs/repo/insert check/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
2. Formats
2.1 RepoCommandParameter
insert 및 insert check command 의 RepoCommandParameter 는 Repo Command 페이지에 있습니다. Name, StartBlockId, EndBlockId 는 insert 에 사용됩니다. Name과 ProcessId 는 insert check command 에 사용됩니다.
insert command 에서 Name 은 repo 가 가져올 (fetch) 데이터의 name 또는 prefix 를 나타냅니다. StartBlockId 또는 EndBlockId 가 설정된 경우 Repo 는 StartBlockId 와 EndBlockId 사이의 세그먼트 번호가 있는 세그먼트 데이터를 검색합니다.
insert check command 에서 Name 은 가져올 (fetch) Repo 에 대한 데이터의 name 또는 prefix 를 나타냅니다. ProcessId 는 지정된 프로세스를 나타내기 위해 RepoCommandResponse 에 의해 설정됩니다.
2.2 Insertion status response
이 insert status 데이터 오브젝트는 insert command 와 insert check command 모두의 응답 데이터 오브젝트 일 수 있습니다. repo command response 포멧을 따릅니다.
StatusCode 는 insert status 를 나타냅니다. InsertNum 은 repo interest 의 데이터 수를 나타냅니다. StartBlockId 및 EndBlockId 는 insert 된 데이터의 시작 및 끝 세그먼트 ID 입니다. InsertNum 은 insert 된 데이터 세그먼트의 수 입니다. ProcessId 는 프로세스의 ID 로 repo 에 의해 생성된 임의의 번호를 나타냅니다.
insert command 의 경우 아래 정의에 따라 상태 코드가 설정되며 insert command 에 따라 StartBlockId 및 EndBlockId 가 설정됩니다. RepoCommandParameter 의 StartBlockId 가 누락되면 응답으로 0 이 설정됩니다. EndBlockId 가 누락되면 설정되지 않습니다.
insert check command 의 경우 아래의 정의에 따라 상태 코드가 설정되며 StartBlockId 와 EndBlockId 는 Repo 가 사용하는 StartBlockId 와 EndBlockId 에 따라 설정되고 InsertNum 은 insert 진행에 따라 설정됩니다. ProcessId 는 확인된 프로세스의 ID 에 따라 설정됩니다. EndBlockId 가 결정되지 않은 경우이 EndBlockId 는 응답으로 설정되지 않습니다.
StatusCode 정의:
StatusCode | Description |
---|---|
100 | command 는 OK, 데이터를 가져올 (fetch) 수 있습니다 |
200 | 모든 데이터가 insert 되었습니다 |
300 | insert 작업이 진행 중입니다 |
401 | insert command 또는 insert check command 가 무효화되었습니다 |
403 | 잘못된 (Malformed) command 입니다 |
404 | insert 작업이 진행 중입니다 |
405 | EndBlockId Missing Timeout |
2.3 EndBlockId Missing Timeout
StartBlockId 가 있지만 EndBlockId 가 없고 반환 데이터 패킷에 FinalBlockId 가 없으면 Repo 는 데이터를 계속 가져옵 (fetch) 니다. 이 경우를 막기 위해 EndBlockId missing timeout 이 설정됩니다. Repo 는 StartBlockId 가 있지만 EndBlockId 가없는 경우 타이머를 시작합니다. Timeout 이 발생하면 Repo 는 데이터를 가져 (fetch) 와서 insert 프로세스를 저장 (store) 하고 종료합니다. insert 프로세스 중에 insert check command 가 도착하면 타이머 시간은 0 으로 설정됩니다. FinalBlockId 가 포함 된 데이터 패킷이 도착하면 timeout 이해제됩니다.
3. Protocol Process
- command 의 authorize 시작; 승인 실패가 나지 않으면 3 번으로 이동
- 승인 실패인 경우 authorization failure 를 나타내는 응답을 보내고 요청을 중단하고 insert process (StatusCode: 401) 적용
- StartBlockId 및 EndBlockId 가 모두 누락된 경우 7 번으로 이동
- StartBlockId 와 EndBlockId 가 모두 있고 StartBlockId 가 EndBlockId 보다 작거나 같으면 7 번으로 이동
- malformed command 인 응답을 보내고 단계를 중단하고 insert process (StatusCode: 403) 적용
- 승인 완료까지 대기
- 인증이 실패하면 2 번 (StatusCode : 401) 으로 이동
- insert 진행중임을 나타내는 응답 전송 (StatusCode : 200)
- StartBlockId 또는 EndBlockId 가 있는 경우 16 번으로 이동
- insert command 에서 Name 검색 (retrieve) 시작
- 검색 완료까지 대기
- 검색에 실패하면 26 번으로 이동
- 검색된 데이터 패킷 저장
- 단계를 중단하고 insert 프로세스 종료
- StartBlockId 가 없으면 StartBlockId 를 0으로 설정; EndBlockId 가 누락 된 경우 데이터 패킷에 FinalBlockId 가 표시되지 않으면 EndBlockId 가 누락; EndBlockId Missing Timeout timer 시작
- Name 에 StartBlockId 추가
- Name 검색 (retrieve) 시작
- 검색 완료까지 대기
- 검색에 실패하면 26 번으로 이동
- 검색된 (retrieved) 데이터 패킷 저장 (store)
- 데이터 패킷에 FinalBlockId 가 포함되어 있고 FinalBlockId 가 EndBlockId 보다 작거나 EndBlockId 가 없는 경우 EndBlockId 를 FinalBlockId 로 설정
- Name 의 마지막 구성 요소가 EndBlockId 보다 크거나 같으면이 단계를 중단하고 insert 프로세스 종료
- Name의 마지막 컴포넌트를 증가
- 17 번으로 이동
- 이 데이터로 2 번 중복하여 데이터 검색; 이러한 2 검색 모두 실패하면 단계를 중단; 성공하면 21 번으로 이동
- 이 데이터로 2 번 중복하여 데이터 검색; 이러한 2 검색 모두 실패하면 단계를 중단; 성공하면 14 번으로 이동
EndBlockId Missing Timeout 타이머가 시작되면 Repo 는 17 ~ 26 단계에서 타이머를 모니터링합니다. Timeout 이 발생하면 즉시 insert command process 를 중단합니다.
3.1 Repo insert check command progress
구현은 insert 진행 상황에 대한 상태 알림 (notification) 을 게시 (publish) 할 수 있습니다. status check 프로세스는 다음과 같습니다.
- insert status command 에 대한 authorize 시작; 실패하면 2번으로, 성공하면 3 번으로 이동
- 승인 실패인 경우 authorization failure 를 나타내는 응답을 보내고 요청을 중단하고 insert process (StatusCode: 401) 적용
- command 에서 데이터 이름으로 insert 진행 점검; 4 번 또는 5 번으로 이동
- status code 가 있는 response status; 검사 (check) 프로세스 종료 (StatusCode: 404)
- insert 상태 확인; insert 진행 상태 반환; EndBlockId Missing Timeout 타이머가 실행중인 경우 타이머를 0 으로 설정; 검사 (check) 프로세스 중단 (StatusCode : 300)
3.2 Protocol diagram:
Requester Repo Data producer
| | |
| | |
+---+ Insert command +---+ |
| | --------------------> | | |
+---+ | | |
| | | |
+---+ Confirm start | | |
| | <==================== | | |
+---+ Reject command +---+ |
| (with status code) | |
| +---+ Interest for Data +---+
| | | --------------------------> | |
| +---+ | |
| | | |
| +---+ Data segment | |
| | | <========================== | |
| +---+ +---+
| | |
| ~ ~
| ~ ~
| | |
| +---+ Interest for Data +---+
| | | --------------------------> | |
| +---+ | |
| | | |
| +---+ Data segment | |
| | | <========================== | |
| +---+ +---+
| | |
| | |
| ~ ~
| ~ ~
| | |
| | |
| | |
+---+ Status interest +---+ |
| | --------------------> | | |
+---+ | | |
| | | |
+---+ Status response | | |
| | <==================== | | |
+---+ +---+ |
| | |
| | |
NDN - Repo-Command
Repo Command
repo 의 insert, delete 및 기타 작업의 Command 는 Signed Interests 형식으로 인코딩됩니다.
/<repo-prefix>/<command-verb>/................./.........................................
\______ _______/ \__________________ ___________________/
\/ \/
RepoCommandParameter Signed Interest additional components
repo command interest 의 의미는 다음과 같습니다:
name 의미 (semantics) 는 다음과 같은 컴포넌트로 정의됩니다:
<repo prefix>
: 특정 prefix 인 repo 가 수신대기 (listening) 를 나타냅니다.<command verb>
: command name 을 나타냅니다.<RepoCommandParameter>
: repo command 의 parameters 를 나타냅니다.
다음 컴포넌트는 액세스 제어를 위한 singed interest 컴포넌트 입니다.
<timestamp>
<random-value>
<SignatureInfo>
<SignatureValue>
repo 의 prefix 인 /ucla/cs/repo/ 는 다음과 같이 정의됩니다:
/ucla/cs/repo/<command verb>/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
1. RepoCommandParameter
RepoCommandParameter ::= REPOCOMMANDPARAMETER-TYPE TLV-LENGTH
Name?
StartBlockId?
EndBlockId?
ProcessId?
InterestLifetime?
ForwardingHint?
Name ::= NAME-TYPE TLV-LENGTH NameComponent*
NameComponent ::= NAME-COMPONENT-TYPE TLV-LENGTH BYTE+
StartBlockId ::= STARTBLOCKID-TYPE TLV-LENGTH
nonNegativeInteger
EndBlockId ::= ENDBLOCKID-TYPE TLV-LENGTH
nonNegativeInteger
ProcessId ::= PROCESSID-TYPE TLV-LENGTH
nonNegativeInteger
InterestLifetime ::= INTEREST-LIFETIME-TYPE TLV-LENGTH
nonNegativeInteger
ForwardingHint ::= FORWARDING-HINT-TYPE TLV-LENGTH
Delegation+
1.1 StartBlockId, EndBlockId
StartBlockId 및 EndBlockId 는 세그먼트 데이터를 처리하는 데 사용됩니다. StartBlockId 는 첫 번째 세그먼트 번호를 나타내고 EndBlockId 는 마지막 세그먼트 번호를 나타냅니다. Repo 는 StartBlockId 와 EndBlockId 사이의 세그먼트 ID를 가진 세그먼트 데이터를 처리합니다. StartBlockId 가 없으면 repo 프로세스의 첫 번째 세그먼트 ID 는 0 입니다. EndBlockId 가 없는 시나리오는 Repo Insertion Command 섹션과 Repo Deletion Command 섹션의 특정 프로세스에 설명되어 있습니다.
1.2 Conflict of Selectors and StartBlockId, EndBlockId
Repo 는 RepoCommandParameter 에서 Selector 및 StartBlockId, EndBlockId 와 함께 명령을 처리 할 수 없습니다. RepoCommandParameter 가 둘 다 전달되면 Repo 는 이 명령을 무시하고 오류 코드 405를 반환합니다.
1.3 ProcessId
ProcessId 는 insert 및 delect 확인 명령에 사용되어 특정 insert 및 delete 프로세스를 나타냅니다. ProcessId 는 insert 및 delete 명령의 repo 명령 응답에 의해 가져오기 (fetch) 됩니다.
1.4 InterestLifetime
InterestLifetime 은 전송 된 interest 와 수신 된 데이터 간의 최대 대기 시간입니다. InterestLifetime 후에 수신 된 데이터가 없으면 interest 시간이 초과됩니다. InterestLifetime 은 선택 사항이며 지정되지 않으면 기본값이 설정됩니다.
1.5 ForwardingHint
ForwardingHint 요소는 Link Object 섹션에 정의된 name 위임 (delegation) 목록을 포함합니다. 각 위임은 요청 된 데이터 패킷이 위임 경로를 따라 interest 를 전달함으로써 검색 될 수 있음을 의미합니다. ForwardingHint 의 interest 에 대한 forwarding logic 의 특성은 별도의 문서로 정의됩니다.
2. Repo Command Response
Repo command 의 응답 (response) 은 Repo command interest 에 대한 응답 데이터 패킷입니다. 응답에는 명령 프로세스 및 기타 정보의 상태를 나타내는 상태 코드가 포함됩니다. RepoCommandResponse 라는 TLV 인코딩 블록은 데이터 패킷의 내용으로 인코딩됩니다.
RepoCommandResponse ::= INSERTSTATUS-TYPE TLV-LENGTH
ProcessId?
StatusCode
StartBlockId?
EndBlockId?
InsertNum?
DeleteNum?
ProcessId ::= PROCESSID-TYPE TLV-LENGTH
nonNegativeInteger
StatusCode ::= STATUSCODE-TYPE TLV-LENGTH
nonNegativeInteger
StartBlockId ::= STARTBLOCKID-TYPE TLV-LENGTH
nonNegativeInteger
EndBlockId ::= ENDBLOCKID-TYPE TLV-LENGTH
nonNegativeInteger
InsertNum ::= INSERTNUM-TYPE TLV-LENGTH
nonNegativeInteger
DeleteNum ::= DELETENUM-TYPE TLV-LENGTH
nonNegativeInteger
2.1 Name
name 은 repo command 의 RepoCommandResponse 에 있는 name 을 나타냅니다.
2.2 ProcessId
ProcessId 는 command 프로세스 번호를 나타내기 위해 repo 가 생성하는 난수입니다. 클라이언트는 이 ProcessId 를 사용하여 특정 command 의 상태를 확인할 수 있습니다.
2.3 StatusCode
StatusCode 는 repo command 프로세스의 상태를 나타냅니다.
2.4 StartBlockId, EndBlockId
StartBlockId 및 EndBlockId 는 RepoCommandParameter 와 동일합니다. RepoCommandParameter 중 하나가 누락 된 경우 repo 는 현재 알려진 Id 로 설정합니다. 예를 들어 RepoCommandParameter 에 StartBlockId 가 없으면 응답의 StartBlockId 가 0 으로 설정됩니다. RepoCommandParameter에 EndBlockId 가 없으면 Repo 가 데이터 패킷에 FinalBlockId 를 가져올 때까지 EndBlockId 가 null 로 설정됩니다. 반환 된 데이터 패킷의 FinalBlockId 가 EndBlockId 보다 작으면 EndBlockId 가 FinalBlockId 로 설정됩니다.
2.5 InsertNum, DeleteNum
InsertNum 은 얼마나 많은 데이터 패킷이 repo 에 성공적으로 insert 되었는지 나타내는 지표이며 insertion status check 의 응답에 사용됩니다. DeleteNum 은 delete 명령 및 deletion check 명령에 대한 응답으로 사용됩니다. DeleteNum 은 얼마나 많은 데이터 패킷이 repo 에서 성공적으로 삭제되었는지 나타냅니다.
3. Repo TLV Type Encoding Number
Type | Number |
---|---|
RepoCommandParameter | 201 |
StartBlockId | 204 |
EndBlockId | 205 |
ProcessId | 206 |
RepoCommandResponse | 207 |
StatusCode | 208 |
InsertNum | 209 |
DeleteNum | 210 |
InterestLifetime | 214 |
4. Repo Trust Model
repo 의 신뢰 모델은 PKI 와 같은 repo 서비스를 배포하는 사람들에 따라 다릅니다. Repo 는 자체 verification policies 를 지정할 수 있으며 데이터 소비자는 자체 신뢰 앵커를 지정할 수 있습니다. NDN FAQ 는 어떻게 NDN trust managment 가 작동하는지 보여줍니다.
NDN - Repo Protocol Specification
Repo Protocol Specification
Repo 는 콘텐츠를 보존하고 보유한 콘텐츠를 요청하는 interest 에 응답하는 것으로 네트워크를 지원합니다. 어떤 노드에서도 Repo 가 존재할 수 있는데 특히 해당 노드의 응용 프로그램이 데이터를 보존해야 하는 경우 권장됩니다. NDN repo protocol 이란 repo 에서 데이터 객체 (Data Object) 에 대한 read, insert, delete 사양 (specification) 입니다.
Repo 의미는 NDN 의 name 끝에 서명된 객체 (signed components) Signed Interests 와 basic common semantic 을 기반으로 합니다.
데이터 객체의 insert 및 delete 를 포함하는 repo 의 일부 동작이 요구 될 때 command interest 가 전송됩니다. command interest 는 insert 및 delete 명령으로서의 interest 이며 액세스 제어를 위한 command interest 형식으로 서명됩니다. repo 는 데이터 객체를 사용하여 command 에 응답합니다.
repo protocol 은 데이터 패킷 검색 및 관리의 두 부분으로 분류할 수 있습니다. Repo-ng 는 다양항 방식으로 데이터를 insert 하고 delete 하는 일련의 repo 관리 프로토콜 (management protocol) 을 구현하고 있습니다.
1. Repo Management Protocols
아래 내용은 repo-ng 포스팅의 Repo 관리 프로토콜의 내용입니다.
- Repo Command 는 repo 에 데이터를 insert 하거나 remove 할 수 있는 요청 및 응답에 대한 포멧, 이러한 command 를 서명하고 인증하는 방법을 정의합니다.
- Basic Repo Insertion Protocol 은 데이터 패킷의 insert 형식을 정의합니다. repo-ng 는 기본 프로토콜 외에도 몇가지 다른 insert 프로토콜을 구현할 수 있습니다.
- Watched Prefix Insertion Protocol : 지속적으로 생성된 데이터를 insert 하는 프로토콜을 정의합니다.
- Tcp Bulk Insert Repo Insertion Protocol : 대량의 데이터 패킷 (예: 동일 호스트에서 생성된) 을 insert 하는 간단한 TCP 기반 프로토콜을 정의합니다.
- Repo Deletion Protocol 은 특정 prefix 아래에서 데이터 패킷에 대한 delete 포멧을 정의합니다.
2. Data packet retrieval from repo
Repo 는 보유하고있는 데이터 객체의 prefix 를 NDN forwarding daemon 에 등록하고 Repo 는 해당 prefix 로 응답합니다.
standard interest 는 repo 에서 콘텐츠를 가지고 오는데 사용됩니다. NFD 에 등록된 prefix 와 interest 의 name 이 일치하면 Repo 가 응답합니다. repo 의 콘텐츠가 interest 와 일치하면 데이터 객체로 응답합니다. interest 가 일치하지 않으면 응답하지 않습니다.
프로토콜은 다음과 같습니다.
일치하는 데이터 객체가 있는 경우:
Requester Repo
| |
| |
| Interest |
t1 |-------------------------->|
| |
| Data Object |
t2 |<==========================|
| |
| |
| |
일치하는 데이터 객체가 없는 경우:
Requester Repo
| |
| |
| Interest |
t1 |-------------------------->|
| |
| |
| |
2.1 About Freshness
repo 로 freshness (신선도?) 를 처리하는 솔루션은 명확하게 정의되지 않았으므로 생산자 (producer) 는 repo 에 콘텐츠를 담을 때 freshness 를 관리 (쓸모없는 콘텐츠 삭제) 하여야 합니다. MustBeFresh selector 는 repo 에서 콘텐츠를 가지고 오거나 (fetching), repo command 를 처리할 때 무시 (ignored) 됩니다.
NDN - repo-ng
Repo protocol and repo-ng
1. Repo protocol
Repo protocol 은 NDN 영구 스토리지 노드 (persistent storage node) 로서의 의미 및 운영 프로세스를 의미합니다. NDN repo 의 동작은 NDN Repository 노드에서 데이터 객체 (Data Object) 에 대한 read, insert, delete 를 수행하는 것 입니다.
Repo protocol 은 운영 및 제어를 위한 Repo Protocol Specification 을 준수하며 아래의 Repo 관리 프로토콜을 포함합니다:
- Repo Command 는 repo 에 데이터를 insert 하거나 remove 할 수 있는 요청 및 응답에 대한 포멧, 이러한 command 를 서명하고 인증하는 방법을 정의합니다.
- Basic Repo Insertion Protocol 은 데이터 패킷의 insert 형식을 정의합니다. repo-ng 는 기본 프로토콜 외에도 몇가지 다른 insert 프로토콜을 구현할 수 있습니다.
- Watched Prefix Insertion Protocol: 지속적으로 생성된 데이터를 insert 하는 프로토콜을 정의합니다.
- Tcp Bulk Insert Repo Insertion Protocol: 대량의 데이터 패킷 (예: 동일 호스트에서 생성된) 을 insert 하는 간단한 TCP 기반 프로토콜을 정의합니다.
- Repo Deletion Protocol 은 특정 prefix 의 데이터 패킷에 대한 delete 포멧을 정의합니다.
2. repo-ng
repo-ng (repo-new generation) 는 Repo protocol 을 준수하는 NDN 영구(NDN persistent) 인-네트워크 스토리지 (in-network storage) 의 구현체를 의미합니다. NDN 클라이언트 라이브러리로 ndn-cxx
를 사용하고 기본 스토리지로 sqlite3
데이터베이스를 사용합니다.
2.1 platform and libraries
- C++11, code style guidelines
- Boost >=1.48.0, we use a limited set of Boost libraries
- Boost Unit Test Framework, more information on unit testing
- ndn-cxx, Extended version of NDN C++ client library
- waf build system
- sqlite3
2.2 specific design
2.3 current supported functions
프로토콜의 대부분은 repo-ng 에서 지원됩니다. 하지만 아래의 사양은 현재 버전에서 지원되지 않습니다.
- delete command 에서, RepoCommandParameter 의 EndBlockId 가 null 인 경우 repo 는 StartBlockId 의 모든 세그먼트 데이터에 응답 할 수 없습니다.
- delete 진행 과정을 체크하는 command 는 지원하지 않습니다.
command 검증 (validation) 및 액세스 제어 (access control) 에 대한 신뢰 모델 (Trust model) 이 설계되지 않았습니다. 모든 command 는 현재 버전에서 유효하며 통과할 수 있습니다.