NDN - Repo-Tools
Tools
repo tools 는 command line 을 사용하여 repo 의 동작을 지시합니다.
1. ndnputfile
데이터를 repo 에 insert 하는데 사용됩니다.
$ ndnputfile <command> repo-prefix ndn-name filename
지금까지 지원되는 명령 목록은 다음과 같습니다:
$ ndnputfile -h
-u: unversioned: 버전 구성 요소를 추가하지 말 것
-s: single: 버전 또는 세그먼트 구성 요소를 추가하지 말 것, -u 내용 참조
-D: DigestSha256 signing method 사용
-i: Data 서명을 위한 ID 지정
-I: Command 서명에 사용되는 ID 지정
-x: FreshnessPeriod (milliseconds)
-l: 각 Command 의 InterestLifetime (milliseconds)
-w: 전체 프로세스에 대한 timeout (milliseconds; default unlimited)
-v: be verbose
다음은 이러한 명령을 하나씩 소개합니다.
1.1 ndnputfile command List
ndn-name 다음에 수동으로 버전 번호를 추가하려면 -u 를 사용하여 지정할 수 있습니다. 그렇지 않으면 ndnputfile 은 자동으로 현재 시간에 따라 버전 번호를 추가합니다. 예를들어
$ ndnputfile -u /example/repo/1 /example/data/1/%FD%00%00%01G%F0%C8%AD- test.txt
$ ndnputfile /example/repo/1 /example/data/1/ test.txt
두 경우 모두 real ndn-name 은 /example/data/1/%FD%00%00%01G%F0%C8%AD- 입니다.
정확히 하나의 데이터를 사용하여 파일을 저장하려면 -s 를 사용하여 지정할 수 있습니다. 그렇지 않으면 파일 내용이 여러 개의 세그먼트 데이터로 분리됩니다.
$ ndnputfile -s /example/repo/1 /example/data/1/ test.txt
이 방법으로 모든 콘텐츠는 하나의 데이터 패킷에 저장되며 세그먼트 번호는 추가되지 않습니다. 위 예에서 실제 NDN 이름은 /example/data/1/%FD%00%00%01G%F0%C8%AD- 입니다.
파일이 충분히 크고 하나의 데이터 패킷에 저장할 수 없는 경우 -s 를 지정하면 안됩니다. 이런 식으로, ndnputfile 은 자동으로 데이터 내용을 분리하고 세그먼트 번호를 사용하여 다른 세그먼트를 식별합니다.
$ ndnputfile /example/repo/1 /example/data/1/ test.jpg
이 경우 데이터는 세그먼트화되고 세그먼트 번호는 0부터 시작합니다. 실제 NDN 이름은 /example/data/1/%FD%00%00%01G%F0%C8%AD-/%00%00 입니다.
주의: 세그먼트 데이터를 insert 하기 위해 데이터가 충분히 크지 않을 경우 -s 는 하나의 세그먼트만 생성합니다. 실제 NDN 이름에는 세그먼트 번호 /%00%00 이 포함됩니다.
-D 를 지정하여 데이터 패킷 및 명령 관련 서명 방법으로 DigestSha256 을 선택할 수 있습니다.
$ ndnputfile -D /example/repo/1 /example/data/1/ test.txt
-I 및 -i 를 각각 사용하여 command interest 또는 데이터 서명을 위한 ID 를 지정할 수 있습니다.
$ ndnputfile -I /ndn/test/alice /example/repo/1 /example/data/1 test.txt
$ ndnputfile -i /ndn/test/bob /example/repo/1 /example/data/1 test.txt
-x 를 사용하여 데이터 freshness 시간을 설정할 수 있습니다. 시간은 밀리 초 단위로 측정됩니다. 예 :
$ ndnputfile -x 4000 /ndn/test/alice /example/repo/1 /example/data/1 test.txt
interest life-time 을 지정하려면 -l 을 사용하여 interest time out 값을 설정할 수 있습니다. 예:
$ ndnputfile -l 1000 /ndn/test/alice /example/repo/1 /example/data/1 test.txt
-w 를 사용하여 전체 insert 프로세스의 시간 초과를 설정할 수 있습니다. 시간이 만료되면 프로세스가 중지됩니다.
-v 를 지정하여 로그 정보를 인쇄 할 수 있습니다.
2. ndngetfile
데이터를 repo 에서 get 하는데 사용됩니다.
$ ndngetfile <command> ndn-name
지금까지 지원되는 명령 목록은 다음과 같습니다:
$ ndngetfile -h
-v: be verbose
-s: only get single data packet
-u: versioned: ndn-name 에는 버전 component.if -u 가 포함되어 있지 않습니다.이 명령은 prefix 의 가장 오른쪽에 있는 자식을 반환
-l: InterestLifetime (milliseconds)
-w: 전체 프로세스에 대한 timeout (milliseconds; default unlimited)
-o: stdout 대신 local file name 작성
다음은 이러한 명령을 하나씩 소개합니다.
2.1 ndngetfile command List
-s 가 지정되면 하나의 데이터만 get 합니다. 이 명령은 데이터가 ndnputfile -s 에 의해 insert 될 때만 사용해야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다. 세그먼트 번호가 없는 단일 데이터만 이 명령으로 가져올 수 있습니다. 예:
$ ndngetfile -s /example/data/1
반환된 데이터는 예를들어 /example/data/1/%FD%00%00%01G%F0%C8%AD- 일 수 있습니다. /example/data/1/%FD%00%00%01G%F0%C8%AD-/%00%00 데이터는 가져 (fetch) 올 수 없습니다. -s 가 지정되지 않으면, ndngetfile 은 동일한 prefix 를 가진 모든 세그먼트 데이터를 가지고 (fetch) 오려고 시도합니다.
ndn-name 다음에 수동으로 버전 번호를 추가하려면 -u 를 지정하여 특정 버전의 데이터를 선택할 수 있습니다. 예 :
$ ndngetfile -u /example/data/1/%FD%00%00%01G%F0%C8%AD-
-u 를 지정하지 않으면 최신 버전 번호 (맨 오른쪽 자식) 가 있는 데이터가 반입됩니다.
-o 를 지정하여 로컬 파일에 쓰기를 선택할 수 있습니다. 그렇지 않으면, ndngetfile 은 stdout 을 사용합니다. 예 :
$ ndngetfile -o result.txt /example/data/1
내용은 result.txt 에 기록됩니다.
-w, -l, -v 명령은 ndnputfile 과 유사합니다.
NDN - Repo-Software-Structure
Software Structure
1. Major Modules
- Database Handle: read, insert, update, delete 를 포함한 데이터베이스 관련 작업 처리를 위한 기본 인터페이스; interest 의 selector 에 따라 NDN 패킷에서 작동; 이 모듈은 storage-handle directory 에 위치
- Command Echo: 각 echo module 은 서로 다른 기능의 interest 및 command 를 별도로 처리할 수 있음; read-echo 를 통한 read, write-echo 를 통한 insert 및 insert progress check 그리고 delete-echo 를 통한 삭제
- Helpers: repo command parameter, response 및 repo TLV 포멧 정의
- Server: starting repo 프로세스는 reading configuration file, initiating database, registration prefix 를 포함하여 정의; repo 의 주요 기능 포함
- Test: Unit Test
2. Module Relation Graph
--------------------------------
| |
| Repo Server |
| |
--------------------------------
||
|| contains
\/
--------------------------------
| |
| Interest and Command Echo |
| Read, Insert and Delete |
| |
--------------------------------
||
|| uses
\/
--------------------------------
| |
| Database Handle |
| |
--------------------------------
NDN - Repo-Database-Design
Database Design
1. Lists of Tables
- NDN_REPO
2. Specifics of Tables
2.1 NDN_REPO
2.1.1 Columns
- name: TLV 데이터 패킷의 블록 이름 (BLOB PRIMARY KEY)
- data: 전체 TLV 포멧의 데이터 패킷 (BLOB)
- parentName: name length 가 ‘name - 1’ 인 TLV 포멧의 prefix (BLOB)
- 예) name 이 /a/b/c/ 이면 parentName 은 /a/b
- root name 이 / 인 경우 parentName 은 null
- nChildren: name 의 direct children 수 (INTEGER)
- 예) raw name: /a/b, /a/b/c, /a/b/d, /a/b/c/d (/a/b 의 children: 2, /a/b/c 의 children: 1, /a/b/d 및 /a/b/c/d 의 children: 0)
2.1.2 Note
name 및 pname 을 사용하여 테이블은 prefix tree 를 작성합니다.
NDN - Repo-Deletion-Protocol
Repo Deletion Protocol
Repo deletion protocol 은 Repo Command 를 사용합니다. 특정 prefix 내의 단일 콘텐츠 객체 또는 콘텐츠 객체 삭제는 모두 repo 사양 (specification) 에서 지원됩니다. Selector 는 여러 콘텐츠 객체를 선택하는데 사용됩니다. 이러한 selector 는 기존의 interest 패킷 selectors 와 다릅니다. 기존 interest selector 는 하나의 repo 데이터 패킷을 선택합니다. delete command Selectors 는 이 selector 에 적용되는 모든 데이터 패킷을 반환합니다. 세그먼트 데이터의 삭제도 지원됩니다.
1. Basic operations
1.1 Deletion command interest semantics
Command verb: delete
Deletion command interest 는 repo command 포멧을 따릅니다. 예:
/ucla/cs/repo/delete/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
2. Formats
2.1 Deletion Command RepoCommandParameter
deletion command 의 포멧 RepoCommandParameter 는 Repo Command 를 따릅니다. Name, Selector, StartBlockId, EndBlockId, ProcessId 는 RepoCommandParameter 를 생성하는 데 사용됩니다.
Name 은 repo가 삭제할 데이터의 name 또는 prefix 입니다.
Selector 는 데이터를 선택하는데 사용됩니다. ChildSelector 는 삭제 명령에서 지원되지 않습니다.
StartBlockId 및 EndBlockId 는 세그먼트 데이터를 삭제하는데 사용됩니다. StartBlockId 와 EndBlockId 사이의 세그먼트 ID 데이터는 repo 에 의해 삭제됩니다.
ProcessId 는 클라이언트가 삭제 프로세스를 나타내기 위해 생성한 난수입니다. Repo 는 ProcessId 를 삭제 프로세스와 일치시킵니다.
2.2 Deletion Command Selectors
Deletion command selector 는 repo command selectors 다음에 옵니다.
2.3 Deletion status check
deletion progress 동안 requester 는 deletion status check command 를 전송하여 deletion progress 상태를 확인할 수 있습니다. status check command 는 signed interest 입니다. deletion status check command 는 repo command 형식을 따릅니다. <command verb>
는 check 를 삭제하는 것과 같습니다. 예:
/ucla/cs/repo/delete/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>
2.4 Deletion status check RepoCommandParameter
Name 및 ProcessId 는 특정 삭제 프로세스를 나타내는데 사용됩니다. Repo 는 Name 과 ProcessId 를 사용하여 특정 삭제 프로세스를 일치시킵니다. 일치하면 repo 가 삭제 진행 상황에 응답합니다. Name 또는 ProcessId 중 하나만 일치하면 실패합니다.
2.5 Deletion Check Command Selectors
Selectors 는 지원되지 않습니다. Repo 는 deletion status check command 를 처리 할 때 selectors 를 무시합니다.
2.6 Deletion status response
Deletion status 응답은 repo deletion command 및 repo deletion check command 의 응답으로 사용됩니다.
Name, StatusCode, Selector, StartBlockId, EndBlockId, ProcessId, DeleteNum 은 삭제 상태 응답에 사용됩니다. Name, ProcessId, Selector 는 delete 명령과 동일합니다. StatusCode 는 삭제 상태를 나타냅니다. DeleteNum 은 삭제 된 데이터 패킷 수를 나타냅니다.
Repo Deletion Command 에서 StartBlockId 가 나타나면 EndBlockId 가 Repo 가 보유한 가장 큰 세그먼트 ID 일 수 있습니다. EndBlockId 가 나타나면 StartBlockId 가 0 으로 설정됩니다.
StatusCode Definition:
StatusCode | Description |
---|---|
200 | 모든 데이터 삭제 |
300 | 삭제가 진행 중 |
401 | 삭제 또는 삭제 검사 무효화 |
402 | Selectors 또는 BlockId 없음 |
403 | Malformed Command |
404 | 삭제 작업 이상 |
3. Protocol process
- command authorize 시작; 승인이 실패하지 않으면 3 단계로 이동
- authorization failure 응답을 보내고 단계를 중단하고 삭제 프로세스 종료 (StatusCode : 401)
- 동일한 RepoCommandParameter 의 삭제 프로세스가 삭제 프로세스를 기다리는지 여부 확인
- Selector 와 StartBlockId 및 EndBlockId 중 하나가 표시되면 응답을 보내고 단계를 중단하고 삭제 프로세스 종료 (StatusCode: 402)
- Selector 가 있는 경우; 8 단계로 이동
- StartBlockId 또는 EndBlockId 가 나타나는지 확인; StartBlockId 가 EndBlockId 보다 크면 부정적 응답을 반환하고 삭제 프로세스를 종료; (StatusCode : 403) 또는 9 단계 이동
- StartBlockId, EndBlockId 및 Selector 가 모두 누락 된 경우 10 단계로 이동
- name 과 selector 를 준수하는 모든 데이터를 삭제하고 11 단계로 이동
- StartBlockId 와 EndBlockId 사이의 세그먼트 ID의 모든 데이터 패킷을 삭제; StartBlockId 가 없으면 StartBlockId 는 0 으로 설정; EndBlockId 가 누락 된 경우 EndBlockId 는 repo 가 보유하는 가장 큰 세그먼트 ID 로 설정; 11 단계로 이동
- name 과 같은 prefix 가 있는 모든 데이터를 삭제; 11 단계로 이동
- interest 가 만료되지 않으면 긍정적인 상태 코드의 상태 응답 반환; interest 기간이 만료된 경우 동일한 RepoCommandParameter 에 대한 interest 를 기다리고 상태 응답을 반환; 삭제 프로세스 종료 (StatusCode : 200)
클라이언트는 deletion command 를 설정합니다. lifetime 이 만료되면 클라이언트는 명령을 다시 표현합니다. (re-express)
구현은 삭제 진행에 대한 상태 통지를 발표 할 수 있습니다. 상태 확인 프로세스는 다음과 같습니다.
- delete status command authorize 시작
- authorization failure 응답을 보내고 단계를 중단 (StatusCode: 401)
- command 에 데이터 이름을 사용하여 삭제 진행 상황을 점검하기 시작; progress 상황이 발견되지 않으면 4 단계로 이동하거나 5 단계로 이동
- 응답 코드 404 (상태 코드: 404)
- 삭제 상태 확인 (상태 코드 : 300)
3.1 Protocol diagram:
Requester Repo
| |
| |
+---+ Delete command +---+
| | --------------------> | |
+---+ +---+
| |
| |
| |
+---+ Status interest +---+
| | --------------------> | |
+---+ | |
| | |
+---+ Status response | |
| | <==================== | |
+---+ +---+
| |
| |
| |
+---+ Confirm Deletion +---+
| | <==================== | |
+---+ Reject command +---+
| (with status code) |
| |
NDN - Tcp-Bulk-Insert-Repo-Insertion-Protocol
Tcp Bulk Insert Repo Insertion Protocol
Tcp Bulk Insert Repo Insert 프로토콜은 repo Insert 프로토콜의 특별한 부분입니다.
Repo 와 producer 가 동일한 호스트에서 실행될 때 TCP bulk 를 사용하여 Repo storage 에 직접 데이터를 insert 할 수 있습니다.
1. Basic operations
1.1 Listen
Listen 은 초기 repo operation 입니다. Repo는 먼저 listen() 을 invoke 하여 TCP 소켓에서 listen 합니다. 호스트 및 포트 번호 정보는 parameter 로 전달됩니다. 전체 insert 는 비동기 프로세스이며 메인 스레드는 다른 자식 스레드에 작업을 listening 및 할당 (assigning) 합니다.
1.2 Handle
Handle 은 다음 2 가지 operations 이 포함됩니다: handleAccept, handleReceive. HandleAccept() 는 listen() 의 콜백 함수입니다. 소켓에서 연결을 수락하고 프로세스 후 다음 연결을 수락할 준비를 합니다. 연결이 끝나면 데이터 패키지를 분석하기 위해 HandleReceive 가 호출됩니다.
1.3 StartReceive
handleReceive 함수를 시작하고 비동기 수신을 준비하십시오.
ProcessId 는 클라이언트가 삭제 프로세스를 진행하기 위해 생성한 난수입니다. Repo 는 ProcessId 를 삭제 프로세스와 일치시킵니다.