개요
이것은 I2P Control Protocol (I2CP)의 사양으로, 클라이언트와 router 간의 저수준 인터페이스입니다. Java 클라이언트는 이 프로토콜을 구현하는 I2CP 클라이언트 API를 사용합니다.
I2CP를 구현하는 클라이언트 측 라이브러리의 Java가 아닌 구현체는 알려진 것이 없습니다. 또한 소켓 지향(스트리밍) 애플리케이션에는 스트리밍 프로토콜의 구현이 필요하지만, 이에 대한 Java가 아닌 라이브러리도 존재하지 않습니다. 따라서 Java가 아닌 클라이언트는 대신 여러 언어로 라이브러리가 존재하는 상위 계층 프로토콜인 SAM SAMv3 를 사용해야 합니다.
이것은 Java I2P router에서 내부적으로와 외부적으로 모두 지원되는 저수준 프로토콜입니다. 클라이언트와 router가 같은 JVM에 있지 않은 경우에만 프로토콜이 직렬화되며, 그렇지 않으면 I2CP 메시지 Java 객체들이 내부 JVM 인터페이스를 통해 전달됩니다. I2CP는 C++ router인 i2pd에서도 외부적으로 지원됩니다.
자세한 정보는 I2CP 개요 페이지 I2CP 에서 확인할 수 있습니다.
세션
이 프로토콜은 단일 TCP 연결을 통해 각각 2바이트 세션 ID를 가진 여러 “세션"을 처리하도록 설계되었지만, 다중 세션은 버전 0.9.21까지 구현되지 않았습니다. 아래의 다중세션 섹션 을 참조하세요. 버전 0.9.21보다 이전 버전의 router에서는 단일 I2CP 연결에서 다중 세션을 사용하려고 시도하지 마세요.
또한 단일 클라이언트가 별도의 연결을 통해 여러 router와 통신할 수 있는 규정이 있는 것으로 보입니다. 이 기능은 아직 테스트되지 않았으며, 아마도 유용하지 않을 것입니다.
연결이 끊긴 후 세션을 유지하거나 다른 I2CP 연결에서 복구할 수 있는 방법은 없습니다. 소켓이 닫히면 세션도 삭제됩니다.
예제 메시지 시퀀스
참고: 아래 예제들은 클라이언트가 router에 처음 연결할 때 보내야 하는 Protocol Byte (0x2a)를 보여주지 않습니다. 연결 초기화에 대한 자세한 정보는 I2CP 개요 페이지 I2CP 에서 확인할 수 있습니다.
표준 세션 설정
Client Router
---------------------> Get Date Message
Set Date Message <---------------------
---------------------> Create Session Message
Session Status Message <---------------------
Request LeaseSet Message <---------------------
---------------------> Create LeaseSet Message
대역폭 제한 가져오기 (단순 세션)
Client Router
---------------------> Get Bandwidth Limits Message
Bandwidth Limits Message <---------------------
목적지 조회 (간단한 세션)
Client Router
---------------------> Dest Lookup Message
Dest Reply Message <---------------------
발신 메시지
기존 세션, i2cp.messageReliability=none 설정
Client Router
---------------------> Send Message Message
기존 세션, i2cp.messageReliability=none 및 0이 아닌 nonce 사용
Client Router
---------------------> Send Message Message
Message Status Message <---------------------
(succeeded)
기존 세션, i2cp.messageReliability=BestEffort 설정
Client Router
---------------------> Send Message Message
Message Status Message <---------------------
(accepted)
Message Status Message <---------------------
(succeeded)
수신 메시지
기존 세션, i2cp.fastReceive=true와 함께 (0.9.4부터)
Client Router
Message Payload Message <---------------------
기존 세션, i2cp.fastReceive=false 사용 (지원 중단됨)
Client Router
Message Status Message <---------------------
(available)
---------------------> Receive Message Begin Message
Message Payload Message <---------------------
---------------------> Receive Message End Message
멀티세션 참고사항
router 버전 0.9.21부터 단일 I2CP 연결에서 다중 세션이 지원됩니다. 생성되는 첫 번째 세션이 “기본 세션"입니다. 추가 세션은 “하위 세션"입니다. 하위 세션은 공통 tunnel 세트를 공유하는 여러 목적지를 지원하는 데 사용됩니다. 초기 애플리케이션은 기본 세션이 ECDSA 서명 키를 사용하고, 하위 세션은 기존 eepsite와의 통신을 위해 DSA 서명 키를 사용하는 것입니다.
서브세션은 기본 세션과 동일한 인바운드 및 아웃바운드 터널 풀을 공유합니다. 서브세션은 기본 세션과 동일한 암호화 키를 사용해야 합니다. 이는 LeaseSet 암호화 키와 (사용되지 않는) Destination 암호화 키 모두에 적용됩니다. 서브세션은 destination에서 다른 서명 키를 사용해야 하므로, destination 해시가 기본 세션과 다릅니다. 서브세션이 기본 세션과 동일한 암호화 키와 터널을 사용하므로, 해당 Destination들이 동일한 router에서 실행되고 있음이 모든 이에게 명백하며, 따라서 일반적인 상관관계 방지 익명성 보장이 적용되지 않습니다.
서브세션은 일반적으로 CreateSession 메시지를 보내고 응답으로 SessionStatus 메시지를 받아 생성됩니다. 서브세션은 기본 세션이 생성된 후에 생성되어야 합니다. SessionStatus 응답에는 성공 시 기본 세션의 ID와 구별되는 고유한 세션 ID가 포함됩니다. CreateSession 메시지는 순서대로 처리되어야 하지만, CreateSession 메시지와 응답을 연관시킬 확실한 방법이 없으므로, 클라이언트는 여러 CreateSession 메시지를 동시에 대기 상태로 두어서는 안 됩니다. 서브세션의 SessionConfig 옵션은 기본 세션과 다를 경우 적용되지 않을 수 있습니다. 특히 서브세션은 기본 세션과 동일한 tunnel pool을 사용하므로 tunnel 옵션은 무시될 수 있습니다.
router는 각 Destination에 대해 별도의 RequestVariableLeaseSet 메시지를 클라이언트에 전송하며, 클라이언트는 각각에 대해 CreateLeaseSet 메시지로 응답해야 합니다. 두 Destination의 lease는 동일한 tunnel pool에서 선택되더라도 반드시 동일하지는 않습니다.
서브세션은 평소와 같이 DestroySession 메시지로 제거할 수 있습니다. 이는 주 세션을 제거하거나 I2CP 연결을 중단하지 않습니다. 하지만 주 세션을 제거하면 모든 서브세션이 제거되고 I2CP 연결이 중단됩니다. Disconnect 메시지는 모든 세션을 제거합니다.
대부분의 I2CP 메시지는 Session ID를 포함하지만 모든 메시지가 그런 것은 아닙니다. Session ID가 없는 메시지의 경우, 클라이언트는 router 응답을 적절히 처리하기 위해 추가 로직이 필요할 수 있습니다. DestLookup과 DestReply는 Session ID를 포함하지 않으므로, 대신 더 최신의 HostLookup과 HostReply를 사용하세요. GetBandwidthLimts와 BandwidthLimits는 session ID를 포함하지 않지만, 응답이 세션별로 특정되지는 않습니다.
버전 노트
클라이언트가 보내는 초기 프로토콜 버전 바이트(0x2a)는 변경될 것으로 예상되지 않습니다. 0.8.7 릴리스 이전에는 router의 버전 정보가 클라이언트에서 사용할 수 없어서 새로운 클라이언트가 오래된 router와 작동하지 못했습니다. 0.8.7 릴리스부터는 양측의 프로토콜 버전 문자열이 Get/Set Date Messages에서 교환됩니다. 앞으로 클라이언트는 이 정보를 사용하여 오래된 router와 올바르게 통신할 수 있습니다. 클라이언트와 router는 상대방이 지원하지 않는 메시지를 보내지 않아야 합니다. 일반적으로 지원되지 않는 메시지를 수신하면 세션을 끊기 때문입니다.
교환되는 버전 정보는 “코어” API 버전 또는 I2CP 프로토콜 버전이며, 반드시 router 버전과 일치하지는 않습니다.
I2CP 프로토콜 버전의 기본 요약은 다음과 같습니다. 자세한 내용은 아래를 참조하세요.
| Version | Required I2CP Features |
|---|---|
| 0.9.67 | PQ Hybrid ML-KEM (enc types 5-7) supported in LS |
| 0.9.66 | Host lookup/reply extensions (see proposal 167) |
| 0.9.62 | MessageStatus message Loopback error code |
| 0.9.46 | X25519 (enc type 4) supported in LS |
| 0.9.43 | BlindingInfo message supported; Additional HostReply message failure codes |
| 0.9.41 | EncryptedLeaseSet options; MessageStatus message Meta LS error code |
| 0.9.39 | CreateLeaseSet2 message and options supported; Dest/LS key certs w/ RedDSA Ed25519 sig type supported |
| 0.9.38 | Preliminary CreateLeaseSet2 message supported (abandoned) |
| 0.9.21 | Multiple sessions on a single I2CP connection supported |
| 0.9.20 | Additional SetDate messages may be sent to the client at any time |
| 0.9.16 | Authentication, if enabled, is required via GetDate before all other messages |
| 0.9.15 | Dest/LS key certs w/ EdDSA Ed25519 sig type supported |
| 0.9.14 | Per-message override of messageReliability=none with nonzero nonce |
| 0.9.12 | Dest/LS key certs w/ ECDSA P-256, P-384, and P-521 sig types supported; RSA sig types also supported but currently unused |
| 0.9.11 | Host Lookup and Host Reply messages supported; Authentication mapping in Get Date message supported |
| 0.9.7 | Request Variable Lease Set message supported |
| 0.9.5 | Additional Message Status codes defined |
| 0.9.4 | Send Message nonce=0 allowed; Fast receive mode is the default |
| 0.9.2 | Send Message Expires flag tag bits supported |
| 0.9 | Supports up to 16 leases in a lease set (6 previously) |
| 0.8.7 | Get Date and Set Date version strings included. If not present, the client or router is version 0.8.6 or older. |
| 0.8.4 | Send Message Expires flag bits supported |
| 0.8.3 | Dest Lookup and Get Bandwidth messages supported in standard session; Concurrent Dest Lookup messages supported |
| 0.8.1 | i2cp.messageReliability=none supported |
| 0.7.2 | Get Bandwidth Limits and Bandwidth Limits messages supported |
| 0.7.1 | Send Message Expires message supported; Reconfigure Session message supported; Ports and protocol numbers in gzip header |
| 0.7 | Dest Lookup and Dest Reply messages supported |
| 0.6.5 or lower | All messages and features not listed above |
I2CP 메시지 헤더
설명
메시지 길이와 메시지 유형을 포함하는 모든 I2CP 메시지의 공통 헤더입니다.
목차
참고사항
실제 메시지 길이 제한은 약 64 KB입니다.
메시지 ID
설명
특정 시점에 특정 router에서 대기 중인 메시지를 고유하게 식별합니다. 이는 항상 router에 의해 생성되며 클라이언트에서 생성한 nonce와는 다릅니다.
목차
- 4 바이트 Integer
참고사항
메시지 ID는 세션 내에서만 고유하며, 전역적으로 고유하지는 않습니다.
페이로드
설명
이 구조는 하나의 Destination에서 다른 Destination으로 전달되는 메시지의 내용입니다.
목차
- 4바이트 Integer 길이
- 그만큼의 바이트
노트
페이로드는 I2CP 개요 페이지 I2CP-FORMAT 에 명시된 gzip 형식입니다.
실제 메시지 길이 제한은 약 64 KB입니다.
세션 설정
설명
특정 클라이언트 세션에 대한 구성 옵션을 정의합니다.
목차
- Destination
- 옵션의 Mapping
- 생성 Date
- 이전 3개 필드의 Signature , SigningPrivateKey 로 서명됨
참고사항
- 옵션들은 I2CP 개요 페이지 I2CP-OPTIONS 에 명시되어 있습니다.
- Mapping 은 router에서 서명이 올바르게 검증될 수 있도록 키별로 정렬되어야 합니다.
- 생성 날짜는 router에서 처리될 때 현재 시간의 +/- 30초 이내여야 하며, 그렇지 않으면 설정이 거부됩니다.
오프라인 서명
- Destination 이 오프라인 서명된 경우, Mapping 에는 세 개의 옵션인 i2cp.leaseSetOfflineExpiration, i2cp.leaseSetTransientPublicKey, 그리고 i2cp.leaseSetOfflineSignature가 포함되어야 합니다. Signature 는 임시 SigningPrivateKey 에 의해 생성되고, i2cp.leaseSetTransientPublicKey에 지정된 SigningPublicKey 로 검증됩니다. 자세한 내용은 I2CP-OPTIONS 를 참조하십시오.
세션 ID
설명
특정 시점에서 특정 router의 세션을 고유하게 식별합니다.
목차
- 2바이트 Integer
참고사항
세션 ID 0xffff는 “세션 없음"을 나타내는 데 사용되며, 예를 들어 호스트명 조회 시에 사용됩니다.
메시지
I2CP Javadocs 도 참조하세요.
메시지 유형
| Message | Direction | Type | Since |
|---|---|---|---|
| BandwidthLimitsMessage | R -> C | 23 | 0.7.2 |
| BlindingInfoMessage | C -> R | 42 | 0.9.43 |
| CreateLeaseSetMessage | C -> R | 4 | deprecated |
| CreateLeaseSet2Message | C -> R | 41 | 0.9.39 |
| CreateSessionMessage | C -> R | 1 | |
| DestLookupMessage | C -> R | 34 | 0.7 |
| DestReplyMessage | R -> C | 35 | 0.7 |
| DestroySessionMessage | C -> R | 3 | |
| DisconnectMessage | bidir. | 30 | |
| GetBandwidthLimitsMessage | C -> R | 8 | 0.7.2 |
| GetDateMessage | C -> R | 32 | |
| HostLookupMessage | C -> R | 38 | 0.9.11 |
| HostReplyMessage | R -> C | 39 | 0.9.11 |
| MessagePayloadMessage | R -> C | 31 | |
| MessageStatusMessage | R -> C | 22 | |
| ReceiveMessageBeginMessage | C -> R | 6 | deprecated |
| ReceiveMessageEndMessage | C -> R | 7 | deprecated |
| ReconfigureSessionMessage | C -> R | 2 | 0.7.1 |
| ReportAbuseMessage | bidir. | 29 | deprecated |
| RequestLeaseSetMessage | R -> C | 21 | deprecated |
| RequestVariableLeaseSetMessage | R -> C | 37 | 0.9.7 |
| SendMessageMessage | C -> R | 5 | |
| SendMessageExpiresMessage | C -> R | 36 | 0.7.1 |
| SessionStatusMessage | R -> C | 20 | |
| SetDateMessage | R -> C | 33 |
설명
클라이언트에게 대역폭 제한이 무엇인지 알려주세요.
GetBandwidthLimitsMessage 에 대한 응답으로 Router에서 Client로 전송됩니다.
목차
- 4 byte Integer 클라이언트 인바운드 제한 (KBps)
- 4 byte Integer 클라이언트 아웃바운드 제한 (KBps)
- 4 byte Integer Router 인바운드 제한 (KBps)
- 4 byte Integer Router 인바운드 버스트 제한 (KBps)
- 4 byte Integer Router 아웃바운드 제한 (KBps)
- 4 byte Integer Router 아웃바운드 버스트 제한 (KBps)
- 4 byte Integer Router 버스트 시간 (초)
- 9개의 4-byte Integer (정의되지 않음)
참고사항
클라이언트 제한은 설정된 유일한 값일 수 있으며, 실제 router 제한이거나 router 제한의 백분율이거나 특정 클라이언트에 특화된 값일 수 있습니다. 이는 구현에 따라 다릅니다. router 제한으로 표시된 모든 값들은 구현에 따라 0일 수 있습니다. 릴리즈 0.7.2 기준입니다.
BlindingInfoMessage
설명
Destination이 blinded 상태임을 router에 알리며, 선택적으로 조회 비밀번호와 복호화를 위한 개인 키를 포함할 수 있습니다. 자세한 내용은 제안서 123 및 149를 참조하십시오.
router는 목적지가 블라인드되어 있는지 알아야 합니다. 만약 블라인드되어 있고 비밀 또는 클라이언트별 인증을 사용한다면, 해당 정보도 가지고 있어야 합니다.
새로운 형식의 b32 주소(“b33”)에 대한 Host Lookup은 router에게 해당 주소가 블라인드되어 있음을 알려주지만, Host Lookup 메시지에서 비밀 키나 개인 키를 router에 전달할 메커니즘이 없습니다. Host Lookup 메시지를 확장하여 해당 정보를 추가할 수도 있지만, 새로운 메시지를 정의하는 것이 더 깔끔합니다.
이 메시지는 클라이언트가 router에게 알려주는 프로그래밍 방식을 제공합니다. 그렇지 않으면 사용자가 각 목적지를 수동으로 구성해야 합니다.
사용법
클라이언트가 blinded destination으로 메시지를 보내기 전에, Host Lookup 메시지에서 “b33"를 조회하거나 Blinding Info 메시지를 보내야 합니다. blinded destination이 비밀 정보나 클라이언트별 인증을 요구하는 경우, 클라이언트는 Blinding Info 메시지를 보내야 합니다.
router는 이 메시지에 대한 응답을 보내지 않습니다. Client에서 Router로 전송됩니다.
목차
- Session ID
- 1바이트 Integer 플래그
- 비트 순서: 76543210 > - 비트 0: 모든 클라이언트는 0, 클라이언트별은 1 > - 비트 3-1: 인증 방식, 비트 0이 클라이언트별로 1로 설정된 경우, > 그렇지 않으면 000 > - 000: DH 클라이언트 인증 (또는 클라이언트별 인증 없음) > - 001: PSK 클라이언트 인증 > - 비트 4: 비밀 키가 필요하면 1, 비밀 키가 필요하지 않으면 0 > - 비트 7-5: 사용하지 않음, 향후 호환성을 위해 0으로 설정
- 1바이트 Integer 엔드포인트 타입
- Type 0은 Hash 입니다 > - Type 1은 hostname String 입니다 > - Type 2는 Destination 입니다 > - Type 3은 Sig Type과 > SigningPublicKey 입니다
- 타입 0: 32바이트 Hash > > - 타입 1: 호스트 이름 String > > - 타입 2: 바이너리 Destination > > > > - 타입 3: 2바이트 Integer 서명 타입, 그 뒤에 > > - SigningPublicKey (서명 타입에 따른 > 길이)
- PrivateKey 복호화 키 플래그 비트 0이 1로 설정된 경우에만 존재합니다. 32바이트 ECIES_X25519 개인 키, 리틀 엔디안
- String 조회 비밀번호 플래그 비트 4가 1로 설정된 경우에만 존재합니다.
참고사항
- 릴리스 0.9.43 기준.
- Hash 엔드포인트 유형은 router가 주소록에서 역방향 조회를 수행하여 Destination을 얻을 수 있는 경우가 아니라면 유용하지 않을 것입니다.
- 호스트명 엔드포인트 유형은 router가 주소록에서 조회를 수행하여 Destination을 얻을 수 있는 경우가 아니라면 유용하지 않을 것입니다.
CreateLeaseSetMessage
더 이상 사용되지 않습니다. LeaseSet2, 오프라인 키, 비ElGamal 암호화 유형, 다중 암호화 유형 또는 암호화된 LeaseSet에는 사용할 수 없습니다. 0.9.39 이상의 모든 router에서 CreateLeaseSet2Message를 사용하세요.
설명
이 메시지는 RequestLeaseSetMessage 또는 RequestVariableLeaseSetMessage 에 대한 응답으로 전송되며, I2NP Network Database에 게시되어야 하는 모든 Lease 구조를 포함합니다.
클라이언트에서 router로 전송됨.
목차
- Session ID
- DSA SigningPrivateKey 또는 20바이트 무시됨
- PrivateKey
- LeaseSet
참고사항
SigningPrivateKey는 signing key 유형이 DSA인 경우에만 LeaseSet 내의 SigningPublicKey 와 일치합니다. 이는 LeaseSet 취소를 위한 것으로, 구현되지 않았으며 향후 구현될 가능성도 낮습니다. signing key 유형이 DSA가 아닌 경우, 이 필드는 20바이트의 랜덤 데이터를 포함합니다. 이 필드의 길이는 항상 20바이트이며, DSA가 아닌 signing private key의 길이와 같아지는 경우는 없습니다.
PrivateKey는 LeaseSet의 PublicKey 와 일치합니다. PrivateKey는 garlic 라우팅된 메시지를 복호화하는 데 필요합니다.
해지(Revocation)는 구현되지 않았습니다. 여러 router에 대한 연결은 어떤 클라이언트 라이브러리에서도 구현되지 않았습니다.
CreateLeaseSet2Message
설명
이 메시지는 RequestLeaseSetMessage 또는 RequestVariableLeaseSetMessage 에 대한 응답으로 전송되며, I2NP Network Database에 게시되어야 하는 모든 Lease 구조체들을 포함합니다.
클라이언트에서 라우터로 전송됩니다. 릴리스 0.9.39부터 지원됩니다. EncryptedLeaseSet에 대한 클라이언트별 인증은 0.9.41부터 지원됩니다. MetaLeaseSet은 아직 I2CP를 통해 지원되지 않습니다. 자세한 정보는 제안서 123을 참조하세요.
목차
- Session ID
- 뒤따를 leaseSet 타입의 1바이트.
- Type 1은 LeaseSet (deprecated) > - Type 3은 LeaseSet2 > - Type 5는 EncryptedLeaseSet > - Type 7은 MetaLeaseSet
- LeaseSet 또는 LeaseSet2 또는 EncryptedLeaseSet 또는 MetaLeaseSet
- 뒤따를 개인키 개수를 나타내는 1바이트 숫자.
- PrivateKey 목록. lease set의 각 공개키에 대해 하나씩, 동일한 순서로. (Meta LS2에는 없음)
- 암호화 타입 (2바이트 Integer )
- 암호화 키 길이 (2바이트 Integer )
- 암호화 PrivateKey (지정된 바이트 수)
참고사항
PrivateKeys는 LeaseSet의 각 PublicKey 와 일치합니다. PrivateKeys는 garlic 라우팅된 메시지를 복호화하는 데 필요합니다.
Encrypted LeaseSet에 대한 자세한 정보는 제안서 123을 참조하세요.
MetaLeaseSet의 내용과 형식은 예비적이며 변경될 수 있습니다. 여러 router의 관리에 대한 프로토콜은 지정되어 있지 않습니다. 자세한 정보는 제안서 123을 참조하십시오.
이전에 취소용으로 정의되었지만 사용되지 않은 서명 개인 키는 LS2에 존재하지 않습니다.
메시지 타입 40을 사용한 예비 버전이 0.9.38에 있었지만 형식이 변경되었습니다. 타입 40은 폐기되었으며 지원되지 않습니다. 타입 41은 0.9.39까지 유효하지 않습니다.
CreateSessionMessage
설명
이 메시지는 클라이언트에서 세션을 시작하기 위해 전송되며, 여기서 세션은 단일 Destination의 네트워크 연결로 정의됩니다. 해당 Destination에 대한 모든 메시지가 전달되고, 해당 Destination이 다른 모든 Destination으로 보내는 모든 메시지가 이를 통해 전송됩니다.
클라이언트에서 라우터로 전송됩니다. 라우터는 SessionStatusMessage 로 응답합니다.
목차
참고사항
- 이것은 클라이언트가 보내는 두 번째 메시지입니다. 이전에 클라이언트는 GetDateMessage 를 보내고 SetDateMessage 응답을 받았습니다.
- Session Config의 Date가 router의 현재 시간과 너무 차이가 날 경우 (+/- 30초 초과), 세션은 거부됩니다.
- 이 Destination에 대해 router에 이미 세션이 있는 경우, 세션은 거부됩니다.
- Session Config의 Mapping 은 router에서 서명이 올바르게 검증될 수 있도록 키로 정렬되어야 합니다.
DestLookupMessage
설명
클라이언트에서 router로 전송됩니다. router는 DestReplyMessage 로 응답합니다.
목차
- SHA-256 Hash
참고사항
릴리스 0.7 기준.
릴리스 0.8.3부터 여러 개의 미해결 조회가 지원되며, I2PSimpleSession과 표준 세션 모두에서 조회가 지원됩니다.
HostLookupMessage 는 0.9.11 릴리스부터 권장됩니다.
DestReplyMessage
설명
DestLookupMessage 에 대한 응답으로 Router에서 Client로 전송됩니다.
목차
- 성공 시 Destination , 또는 실패 시 Hash
참고사항
릴리스 0.7 기준.
릴리스 0.8.3부터는 조회가 실패한 경우에도 요청된 Hash가 반환되므로, 클라이언트가 여러 조회를 진행 중일 때 응답과 조회를 연관시킬 수 있습니다. Destination 응답을 요청과 연관시키려면 Destination의 Hash를 사용하세요. 릴리스 0.8.3 이전에는 실패 시 응답이 비어있었습니다.
DestroySessionMessage
설명
이 메시지는 세션을 종료하기 위해 클라이언트에서 전송됩니다.
클라이언트에서 router로 전송됩니다. router는 SessionStatusMessage (Destroyed)로 응답해야 합니다. 그러나 아래의 중요한 참고사항을 확인하세요.
목차
참고사항
이 시점에서 router는 세션과 관련된 모든 리소스를 해제해야 합니다.
API 0.9.66을 통해, Java I2P router와 클라이언트 라이브러리는 이 명세서에서 상당히 벗어납니다. router는 SessionStatus(Destroyed) 응답을 절대 보내지 않습니다. 남은 세션이 없으면 DisconnectMessage 를 보냅니다. 하위 세션이나 기본 세션이 남아있으면 응답하지 않습니다.
Java 클라이언트 라이브러리는 SessionStatus 메시지에 대해 모든 세션을 종료하고 재연결하는 방식으로 응답합니다.
여러 세션이 있는 연결에서 개별 하위 세션을 삭제하는 것은 다양한 router 및 클라이언트 구현에서 완전히 테스트되지 않았거나 작동하지 않을 수 있습니다. 주의하여 사용하세요.
구현체들은 primary session에 대한 destroy를 모든 subsession에 대한 destroy로 처리해야 하지만, 단일 subsession에 대한 destroy는 허용하고 연결을 열린 상태로 유지해야 합니다. 하지만 Java I2P는 현재 그렇게 하지 않습니다. Java I2P의 동작이 후속 릴리스에서 변경되면 여기에 문서화될 것입니다.
DisconnectMessage
설명
다른 쪽에 문제가 있으며 현재 연결이 곧 종료될 것임을 알립니다. 이는 해당 연결의 모든 세션을 종료합니다. 소켓은 곧 닫힐 것입니다. router에서 클라이언트로 또는 클라이언트에서 router로 전송됩니다.
목차
- 이유 String
참고사항
적어도 Java I2P에서는 router에서 클라이언트 방향으로만 구현되어 있습니다.
GetBandwidthLimitsMessage
설명
router가 현재 대역폭 제한이 무엇인지 상태를 요청합니다.
클라이언트에서 router로 전송됩니다. router는 BandwidthLimitsMessage 로 응답합니다.
목차
없음
참고사항
릴리스 0.7.2 기준.
릴리스 0.8.3부터 I2PSimpleSession과 표준 세션 모두에서 지원됩니다.
GetDateMessage
설명
클라이언트에서 router로 전송됩니다. router는 SetDateMessage 로 응답합니다.
목차
노트
- 일반적으로 프로토콜 버전 바이트를 전송한 후 클라이언트가 보내는 첫 번째 메시지입니다.
- 버전 문자열은 릴리스 0.8.7부터 포함됩니다. 이는 클라이언트와 router가 같은 JVM에 있지 않은 경우에만 유용합니다. 버전 문자열이 없다면, 클라이언트는 버전 0.8.6 이하입니다.
- 릴리스 0.9.11부터 인증 Mapping 이 i2cp.username 및 i2cp.password 키와 함께 포함될 수 있습니다. 이 메시지는 서명되지 않으므로 Mapping을 정렬할 필요가 없습니다. 0.9.10 이전 및 포함하여, 인증은 Session Config Mapping에 포함되며, GetDateMessage , GetBandwidthLimitsMessage , 또는 DestLookupMessage 에 대해서는 인증이 강제되지 않습니다. 활성화된 경우, 릴리스 0.9.16부터 다른 모든 메시지보다 먼저 GetDateMessage 를 통한 인증이 필요합니다. 이는 router 컨텍스트 외부에서만 유용합니다. 이는 호환되지 않는 변경사항이지만, 인증이 있는 router 컨텍스트 외부의 세션에만 영향을 미치므로 드물 것입니다.
HostLookupMessage
설명
클라이언트에서 router로 전송됩니다. router는 HostReplyMessage 로 응답합니다.
이는 DestLookupMessage 를 대체하고 요청 ID, 타임아웃, 호스트 이름 조회 지원을 추가합니다. Hash 조회도 지원하므로, router가 이를 지원한다면 모든 조회에 사용할 수 있습니다. 호스트 이름 조회의 경우, router는 자체 컨텍스트의 네이밍 서비스를 쿼리합니다. 이는 클라이언트가 router의 컨텍스트 외부에 있을 때만 유용합니다. router 컨텍스트 내부에서는 클라이언트가 네이밍 서비스를 직접 쿼리해야 하며, 이것이 훨씬 더 효율적입니다.
목차
- Session ID
- 4 바이트 Integer 요청 ID
- 4 바이트 Integer 타임아웃 (ms)
- 1 바이트 Integer 요청 타입
- SHA-256 Hash 또는 호스트명 String 또는 Destination
요청 유형:
| Type | Lookup key (item 5) | As of |
|---|---|---|
| 0 | Hash | |
| 1 | host name String | |
| 2 | Hash | 0.9.66 |
| 3 | host name String | 0.9.66 |
| 4 | Destination | 0.9.66 |
참고사항
- 릴리스 0.9.11부터 적용됩니다. 이전 router에서는 DestLookupMessage 를 사용하세요.
- 세션 ID와 요청 ID는 HostReplyMessage 에서 반환됩니다. 세션이 없는 경우 세션 ID로 0xFFFF를 사용하세요.
- 타임아웃은 해시 조회에 유용합니다. 권장 최소값은 10,000 (10초)입니다. 향후 원격 이름 서비스 조회에도 유용할 수 있습니다. 이 값은 빠르게 처리되어야 하는 로컬 호스트 이름 조회에서는 적용되지 않을 수 있습니다.
- Base 32 호스트 이름 조회가 지원되지만 먼저 해시로 변환하는 것이 선호됩니다.
HostReplyMessage
설명
HostLookupMessage 에 대한 응답으로 Router에서 Client로 전송됩니다.
목차
- Session ID
- 4 바이트 Integer 요청 ID
- 1 바이트 Integer 결과 코드
- 0: 성공 > - 1: 실패 > - 2: 조회 비밀번호 필요 (0.9.43부터) > - 3: 개인키 필요 (0.9.43부터) > - 4: 조회 비밀번호 및 개인키 필요 (0.9.43부터) > - 5: leaseSet 복호화 실패 (0.9.43부터) > - 6: leaseSet 조회 실패 (0.9.66부터) > - 7: 조회 유형 지원되지 않음 (0.9.66부터)
- Destination , 결과 코드가 0일 때만 존재하며, 조회 타입 2-4에서도 반환될 수 있습니다. 아래를 참조하세요.
- Mapping , 결과 코드가 0일 때만 존재하며, 조회 타입 2-4에서만 반환됩니다. 0.9.66부터 적용. 아래를 참조하세요.
조회 유형 2-4에 대한 응답
Proposal 167은 leaseset에서 모든 옵션을 반환하는 추가 조회 유형을 정의합니다(존재하는 경우). 조회 유형 2-4의 경우, 조회 키가 주소록에 있더라도 router는 leaseset을 가져와야 합니다.
성공하면 HostReply는 leaseset의 옵션 Mapping을 포함하며, 목적지 이후 항목 5로 포함됩니다. Mapping에 옵션이 없거나 leaseset이 버전 1인 경우에도 빈 Mapping(2바이트: 0 0)으로 포함됩니다. 서비스 레코드 옵션뿐만 아니라 leaseset의 모든 옵션이 포함됩니다. 예를 들어, 향후 정의될 매개변수에 대한 옵션도 존재할 수 있습니다. 반환되는 Mapping은 구현에 따라 정렬되거나 정렬되지 않을 수 있습니다.
leaseSet 조회 실패 시, 응답에는 새로운 오류 코드 6(leaseSet 조회 실패)이 포함되며 매핑은 포함되지 않습니다. 오류 코드 6이 반환될 때, Destination 필드는 있을 수도 있고 없을 수도 있습니다. 주소록에서 호스트명 조회가 성공했거나, 이전 조회가 성공하여 결과가 캐시되었거나, 조회 메시지에 Destination이 포함되어 있었던 경우(조회 유형 4)에는 Destination 필드가 존재할 것입니다.
조회 유형이 지원되지 않는 경우, 응답에는 새로운 오류 코드 7 (조회 유형 지원되지 않음)이 포함됩니다.
주의사항
- 릴리즈 0.9.11부터 적용. HostLookupMessage 참고사항을 확인하세요.
- 세션 ID와 요청 ID는 HostLookupMessage 의 것과 동일합니다.
- 결과 코드는 성공 시 0, 실패 시 1-255입니다. 1은 일반적인 실패를 나타냅니다. 0.9.43부터 “b33” 조회에 대한 확장 오류를 지원하기 위해 추가 실패 코드 2-5가 정의되었습니다. 자세한 내용은 제안서 123과 149를 참조하세요. 0.9.66부터 타입 2-4 조회에 대한 확장 오류를 지원하기 위해 추가 실패 코드 6-7이 정의되었습니다. 자세한 내용은 제안서 167을 참조하세요.
MessagePayloadMessage
설명
메시지의 페이로드를 클라이언트에 전달합니다.
Router에서 Client로 전송됩니다. i2cp.fastReceive=true인 경우(기본값이 아님), 클라이언트는 ReceiveMessageEndMessage 로 응답합니다.
목차
노트
MessageStatusMessage
설명
들어오거나 나가는 메시지의 전달 상태를 클라이언트에게 알립니다. Router에서 Client로 전송됩니다. 이 메시지가 들어오는 메시지가 사용 가능함을 나타내는 경우, 클라이언트는 ReceiveMessageBeginMessage 로 응답합니다. 나가는 메시지의 경우, 이는 SendMessageMessage 또는 SendMessageExpiresMessage 에 대한 응답입니다.
목차
- Session ID
- router가 생성한 Message ID
- 1바이트 Integer 상태
- 4바이트 Integer 크기
- 클라이언트가 이전에 생성한 4바이트 Integer nonce
참고사항
버전 0.9.4까지 알려진 상태 값은 0은 메시지 사용 가능, 1은 수락됨, 2는 최선 노력 성공, 3은 최선 노력 실패, 4는 보장됨 성공, 5는 보장됨 실패입니다. 크기 Integer는 사용 가능한 메시지의 크기를 지정하며 status = 0일 때만 관련이 있습니다. 보장됨이 구현되지 않았음에도 불구하고 (최선 노력이 유일한 서비스), 현재 router 구현에서는 최선 노력 코드가 아닌 보장됨 상태 코드를 사용합니다.
router 버전 0.9.5부터 추가 상태 코드가 정의되었지만, 반드시 구현된 것은 아닙니다. 자세한 내용은 MessageStatusMessage Javadocs 를 참조하세요. 발신 메시지의 경우 코드 1, 2, 4, 6은 성공을 나타내며, 그 외의 모든 코드는 실패를 의미합니다. 반환되는 실패 코드는 다를 수 있으며 구현에 따라 다릅니다.
모든 상태 코드:
| Status Code | As Of Release | Name | Description |
|---|---|---|---|
| 0 | Available | DEPRECATED. For incoming messages only. All other status codes below are for outgoing messages. The included size is the size in bytes of the available message. This is unused in "fast receive" mode, which is the default as of release 0.9.4. | |
| 1 | Accepted | Outgoing message accepted by the local router for delivery. The included nonce matches the nonce in the SendMessageMessage, and the included Message ID will be used for subsequent success or failure notification. | |
| 2 | Best Effort Success | Probable success (unused) | |
| 3 | Best Effort Failure | Probable failure | |
| 4 | Guaranteed Success | Probable success | |
| 5 | Guaranteed Failure | Generic failure, specific cause unknown. May not really be a guaranteed failure. | |
| 6 | 0.9.5 | Local Success | Local delivery successful. The destination was another client on the same router. |
| 7 | 0.9.5 | Local Failure | Local delivery failure. The destination was another client on the same router. |
| 8 | 0.9.5 | Router Failure | The local router is not ready, has shut down, or has major problems. This is a guaranteed failure. |
| 9 | 0.9.5 | Network Failure | The local computer apparently has no network connectivity at all. This is a guaranteed failure. |
| 10 | 0.9.5 | Bad Session | The I2CP session is invalid or closed. This is a guaranteed failure. |
| 11 | 0.9.5 | Bad Message | The message payload is invalid or zero-length or too big. This is a guaranteed failure. |
| 12 | 0.9.5 | Bad Options | Something is invalid in the message options, or the expiration is in the past or too far in the future. This is a guaranteed failure. |
| 13 | 0.9.5 | Overflow Failure | Some queue or buffer in the router is full and the message was dropped. This is a guaranteed failure. |
| 14 | 0.9.5 | Message Expired | The message expired before it could be sent. This is a guaranteed failure. |
| 15 | 0.9.5 | Bad Local Leaseset | The client has not yet signed a LeaseSet, or the local keys are invalid, or it has expired, or it does not have any tunnels in it. This is a guaranteed failure. |
| 16 | 0.9.5 | No Local Tunnels | Local problems. No outbound tunnel to send through, or no inbound tunnel if a reply is required. This is a guaranteed failure. |
| 17 | 0.9.5 | Unsupported Encryption | The certs or options in the Destination or its LeaseSet indicate that it uses an encryption format that we don't support, so we can't talk to it. This is a guaranteed failure. |
| 18 | 0.9.5 | Bad Destination | Something is wrong with the far-end Destination. Bad format, unsupported options, certificates, etc. This is a guaranteed failure. |
| 19 | 0.9.5 | Bad Leaseset | We got the far-end LeaseSet but something strange is wrong with it. Unsupported options or certificates, no tunnels, etc. This is a guaranteed failure. |
| 20 | 0.9.5 | Expired Leaseset | We got the far-end LeaseSet but it's expired and we can't get a new one. This is a guaranteed failure. |
| 21 | 0.9.5 | No Leaseset | Could not find the far-end LeaseSet. This is a common failure, equivalent to a DNS lookup failure. This is a guaranteed failure. |
| 22 | 0.9.41 | Meta Leaseset | The far-end destination's lease set was a meta lease set, and cannot be sent to. The client should request the meta lease set's contents with a HostLookupMessage, and select one of the hashes contained within to look up and send to. This is a guaranteed failure. |
| 23 | 0.9.62 | Loopback Denied | The message was attempted to be sent from and to the same destination or session. This is a guaranteed failure. |
ReceiveMessageBeginMessage
사용 중단됨. i2pd에서 지원되지 않음.
설명
router가 이전에 통지받은 메시지를 전달하도록 요청합니다. Client에서 Router로 전송됩니다. router는 MessagePayloadMessage 로 응답합니다.
목차
참고 사항
ReceiveMessageBeginMessage 는 새로운 메시지가 수신 가능하다는 MessageStatusMessage 에 대한 응답으로 전송됩니다. ReceiveMessageBeginMessage 에 지정된 메시지 ID가 유효하지 않거나 올바르지 않은 경우, router는 단순히 응답하지 않거나 DisconnectMessage 를 다시 보낼 수 있습니다.
이는 릴리스 0.9.4부터 기본값인 “fast receive” 모드에서는 사용되지 않습니다.
ReceiveMessageEndMessage
더 이상 사용되지 않음. i2pd에서 지원되지 않음.
설명
메시지가 성공적으로 전달되었으며 router가 메시지를 폐기할 수 있음을 알립니다.
클라이언트에서 Router로 전송됨.
목차
참고사항
ReceiveMessageEndMessage 는 MessagePayloadMessage 가 메시지의 페이로드를 완전히 전달한 후에 전송됩니다.
이는 릴리스 0.9.4부터 기본값인 “fast receive” 모드에서는 사용되지 않습니다.
ReconfigureSessionMessage
설명
클라이언트에서 router로 전송되어 세션 구성을 업데이트합니다. router는 SessionStatusMessage 로 응답합니다.
목차
주의사항
- 릴리스 0.7.1 기준입니다.
- Session Config의 Date가 router의 현재 시간과 너무 많이 차이날 경우 (+/- 30초 초과), 세션이 거부됩니다.
- Session Config의 Mapping 은 키별로 정렬되어야 router에서 서명이 올바르게 검증됩니다.
- 일부 구성 옵션은 CreateSessionMessage 에서만 설정할 수 있으며, 여기서의 변경 사항은 router에서 인식되지 않습니다. tunnel 옵션 inbound.* 및 outbound.*에 대한 변경 사항은 항상 인식됩니다.
- 일반적으로 router는 업데이트된 구성을 현재 구성과 병합해야 하므로, 업데이트된 구성에는 새로운 옵션이나 변경된 옵션만 포함하면 됩니다. 하지만 병합으로 인해 이 방식으로는 옵션을 제거할 수 없으며, 원하는 기본값으로 명시적으로 설정해야 합니다.
ReportAbuseMessage
사용 중단됨, 사용되지 않음, 지원되지 않음
설명
상대방(클라이언트 또는 router)에게 공격을 받고 있음을 알리며, 특정 MessageId를 참조할 수 있습니다. router가 공격을 받고 있다면 클라이언트는 다른 router로 이전하기로 결정할 수 있고, 클라이언트가 공격을 받고 있다면 router는 자신의 router들을 재구축하거나 공격 메시지를 전달한 일부 피어들을 차단 목록에 추가할 수 있습니다.
router에서 클라이언트로 또는 클라이언트에서 router로 전송됩니다.
목차
- Session ID
- 1 바이트 Integer 남용 심각도 (0은 최소 남용, 255는 극도로 남용)
- 이유 String
- Message ID
참고사항
사용되지 않음. 완전히 구현되지 않았음. router와 클라이언트 모두 ReportAbuseMessage 를 생성할 수 있지만, 메시지를 수신했을 때 이를 처리하는 핸들러가 없음.
RequestLeaseSetMessage
더 이상 사용되지 않습니다. i2pd에서 지원되지 않습니다. Java I2P에서 버전 0.9.7 이상의 클라이언트에게는 전송되지 않습니다 (2013-07). RequestVariableLeaseSetMessage를 사용하세요.
설명
클라이언트에게 특정 inbound tunnel 집합의 포함을 승인하도록 요청합니다. Router에서 Client로 전송됩니다. 클라이언트는 CreateLeaseSetMessage 로 응답합니다.
세션에서 전송되는 이러한 메시지 중 첫 번째는 tunnel이 구축되어 트래픽을 처리할 준비가 되었다는 신호를 클라이언트에 보내는 것입니다. router는 최소한 하나의 인바운드 tunnel과 하나의 아웃바운드 tunnel이 구축될 때까지 이 첫 번째 메시지를 보내서는 안 됩니다. 클라이언트는 일정 시간이 지나도 첫 번째 메시지를 받지 못하면 타임아웃하고 세션을 종료해야 합니다 (권장: 5분 이상).
목차
- Session ID
- 1 바이트 Integer tunnel 수
- 다음 쌍들을 그 수만큼:
- 종료 Date
참고사항
이는 모든 Lease 항목이 동시에 만료되도록 설정된 LeaseSet 을 요청합니다. 클라이언트 버전 0.9.7 이상의 경우 RequestVariableLeaseSetMessage 가 사용됩니다.
RequestVariableLeaseSetMessage
설명
클라이언트가 특정 인바운드 터널 세트의 포함을 승인하도록 요청합니다.
Router에서 Client로 전송됩니다. 클라이언트는 CreateLeaseSetMessage 또는 CreateLeaseSet2Message 로 응답합니다.
세션에서 전송되는 이러한 메시지 중 첫 번째는 tunnel이 구축되어 트래픽을 처리할 준비가 되었다는 신호를 클라이언트에게 보내는 것입니다. router는 최소한 하나의 인바운드 tunnel과 하나의 아웃바운드 tunnel이 구축될 때까지 이러한 메시지 중 첫 번째를 보내서는 안 됩니다. 클라이언트는 일정 시간 후에도 이러한 메시지 중 첫 번째를 받지 못하면 타임아웃하고 세션을 종료해야 합니다 (권장: 5분 이상).
목차
- Session ID
- 1바이트 Integer tunnel 수
- 그만큼의 Lease 항목들
참고 사항
이는 각 Lease 에 대해 개별 만료 시간을 가진 LeaseSet 을 요청합니다.
릴리즈 0.9.7부터 적용됩니다. 해당 릴리즈 이전의 클라이언트는 RequestLeaseSetMessage 를 사용하세요.
SendMessageMessage
설명
클라이언트가 Destination 에 메시지(페이로드)를 보내는 방법입니다. router는 기본 만료 시간을 사용합니다.
클라이언트에서 router로 전송됩니다. router는 MessageStatusMessage 로 응답합니다.
목차
- Session ID
- Destination
- Payload
- 4바이트 Integer nonce
참고사항
SendMessageMessage 가 완전히 온전하게 도착하자마자, router는 전송을 위해 수락되었다는 MessageStatusMessage 를 반환해야 합니다. 해당 메시지는 여기서 전송된 것과 동일한 nonce를 포함할 것입니다. 나중에 세션 구성의 전송 보장에 따라, router는 상태를 업데이트하는 추가적인 MessageStatusMessage 를 다시 전송할 수도 있습니다.
릴리스 0.8.1부터 router는 i2cp.messageReliability=none인 경우 MessageStatusMessage 를 전송하지 않습니다.
릴리스 0.9.4 이전에는 nonce 값 0이 허용되지 않았습니다. 릴리스 0.9.4부터는 nonce 값 0이 허용되며, 이는 router에게 MessageStatusMessage 를 전송하지 말라고 지시합니다. 즉, 해당 메시지에 대해서만 i2cp.messageReliability=none으로 작동하는 것과 같습니다.
릴리스 0.9.14 이전에는 i2cp.messageReliability=none으로 설정된 세션에서 메시지별로 이를 재정의할 수 없었습니다. 릴리스 0.9.14부터는 i2cp.messageReliability=none으로 설정된 세션에서 클라이언트가 nonce를 0이 아닌 값으로 설정하여 배송 성공 또는 실패에 대한 MessageStatusMessage 전달을 요청할 수 있습니다. router는 “accepted” MessageStatusMessage 는 보내지 않지만, 나중에 동일한 nonce와 성공 또는 실패 값을 포함한 MessageStatusMessage 를 클라이언트에게 보냅니다.
SendMessageExpiresMessage
설명
클라이언트에서 router로 전송됩니다. SendMessageMessage 와 동일하지만 만료 시간과 옵션이 포함됩니다.
목차
- Session ID
- Destination
- Payload
- 4바이트 Integer nonce
- 2바이트 플래그 (옵션)
- 만료 Date (8바이트에서 6바이트로 단축)
참고 사항
릴리스 0.7.1 기준.
“최선 노력” 모드에서는 SendMessageExpiresMessage가 완전히 온전하게 도착하자마자 router가 배송을 위해 수락되었다는 MessageStatusMessage를 반환해야 합니다. 해당 메시지에는 여기서 보낸 것과 동일한 nonce가 포함됩니다. 나중에 세션 구성의 배송 보장에 따라 router는 상태를 업데이트하는 또 다른 MessageStatusMessage를 추가로 다시 보낼 수 있습니다.
릴리스 0.8.1부터, router는 i2cp.messageReliability=none인 경우 Message Status Message를 전송하지 않습니다.
릴리스 0.9.4 이전에는 nonce 값이 0인 것이 허용되지 않았습니다. 릴리스 0.9.4부터는 nonce 값이 0인 것이 허용되며, 이는 router에게 Message Status Message를 전송하지 말라고 지시합니다. 즉, 해당 메시지에 대해서만 i2cp.messageReliability=none으로 설정된 것처럼 동작합니다.
릴리스 0.9.14 이전에는 i2cp.messageReliability=none으로 설정된 세션에서 메시지별로 이를 재정의할 수 없었습니다. 릴리스 0.9.14부터는 i2cp.messageReliability=none으로 설정된 세션에서 클라이언트가 nonce를 0이 아닌 값으로 설정하여 전송 성공 또는 실패에 대한 Message Status Message 전달을 요청할 수 있습니다. router는 “accepted” Message Status Message를 보내지 않지만, 나중에 동일한 nonce와 성공 또는 실패 값을 포함한 Message Status Message를 클라이언트에게 보냅니다.
플래그 필드
릴리스 0.8.4부터 Date의 상위 2바이트는 플래그를 포함하도록 재정의되었습니다. 플래그는 하위 호환성을 위해 기본적으로 모두 0이어야 합니다. Date는 10889년까지 플래그 필드를 침범하지 않습니다. 플래그는 애플리케이션에서 LeaseSet 및/또는 ElGamal/AES Session Tags가 메시지와 함께 전달되어야 하는지에 대한 힌트를 router에 제공하는 데 사용할 수 있습니다. 이 설정은 프로토콜 오버헤드의 양과 메시지 전달의 신뢰성에 크게 영향을 미칩니다. 개별 플래그 비트는 릴리스 0.9.2부터 다음과 같이 정의됩니다. 정의는 변경될 수 있습니다. 플래그를 구성하려면 SendMessageOptions 클래스를 사용하십시오.
비트 순서: 15…0
- 비트 15-11
사용되지 않음, 반드시 0이어야 함
- 비트 10-9
메시지 신뢰성 오버라이드 (구현되지 않음, 제거 예정).
| Field value | Description |
|---|---|
| 00 | Use session setting i2cp.messageReliability (default) |
| 01 | Use "best effort" message reliability for this message, overriding the session setting. The router will send one or more MessageStatusMessages in response. Unused. Use a nonzero nonce value to override a session setting of "none". |
| 10 | Use "guaranteed" message reliability for this message, overriding the session setting. The router will send one or more MessageStatusMessages in response. Unused. Use a nonzero nonce value to override a session setting of "none". |
| 11 | Unused. Use a nonce value of 0 to force "none" and override a session setting of "best effort" or "guaranteed". |
: 1이면, 이 메시지와 함께 garlic에 leaseSet을 묶지 않습니다. 만약
0, the router may bundle a lease set at its discretion.
- 비트 7-4
낮은 태그 임계값. 사용 가능한 태그가 이 수보다 적으면,
send more. This is advisory and does not force tags to be delivered. For ElGamal only. Ignored for ECIES-Ratchet.
| Field value | Tag threshold |
|---|---|
| 0000 | Use session key manager settings |
| 0001 | 2 |
| 0010 | 3 |
| 0011 | 6 |
| 0100 | 9 |
| 0101 | 14 |
| 0110 | 20 |
| 0111 | 27 |
| 1000 | 35 |
| 1001 | 45 |
| 1010 | 57 |
| 1011 | 72 |
| 1100 | 92 |
| 1101 | 117 |
| 1110 | 147 |
| 1111 | 192 |
: 필요한 경우 전송할 태그 수입니다. 이는 권고사항이며 강제사항이 아닙니다
force tags to be delivered. For ElGamal only. Ignored for
ECIES-Ratchet.
| Field value | Tags to send |
|---|---|
| 0000 | Use session key manager settings |
| 0001 | 2 |
| 0010 | 4 |
| 0011 | 6 |
| 0100 | 8 |
| 0101 | 12 |
| 0110 | 16 |
| 0111 | 24 |
| 1000 | 32 |
| 1001 | 40 |
| 1010 | 51 |
| 1011 | 64 |
| 1100 | 80 |
| 1101 | 100 |
| 1110 | 125 |
| 1111 | 160 |
설명
클라이언트에게 세션 상태를 알려줍니다.
Router에서 Client로 전송되며, CreateSessionMessage , ReconfigureSessionMessage , 또는 DestroySessionMessage 에 대한 응답입니다. CreateSessionMessage 에 대한 응답을 포함하여 모든 경우에, router는 즉시 응답해야 합니다 (tunnel이 구축될 때까지 기다리지 마세요).
목차
- Session ID
- 1 바이트 Integer 상태
| Status | Since | Name | Definition |
|---|---|---|---|
| 0 | Destroyed | The session with the given ID is terminated. May be a response to a DestroySessionMessage. | |
| 1 | Created | In response to a CreateSessionMessage, a new session with the given ID is now active. | |
| 2 | Updated | In response to a ReconfigureSessionMessage, an existing session with the given ID has been reconfigured. | |
| 3 | Invalid | In response to a CreateSessionMessage, the configuration is invalid. The included session ID should be ignored. In response to a ReconfigureSessionMessage, the new configuration is invalid for the session with the given ID. | |
| 4 | 0.9.12 | Refused | In response to a CreateSessionMessage, the router was unable to create the session, perhaps due to limits being exceeded. The included session ID should be ignored. |
상태 값은 위에서 정의됩니다. 상태가 Created인 경우, Session ID는 나머지 세션에서 사용될 식별자입니다.
SetDateMessage
설명
현재 날짜와 시간. 초기 핸드셰이크의 일부로 Router에서 Client로 전송됩니다. 릴리스 0.9.20부터는 핸드셰이크 이후 언제든지 클라이언트에게 시계 변화를 알리기 위해 전송될 수도 있습니다.
목차
참고사항
이것은 일반적으로 router가 보내는 첫 번째 메시지입니다. 버전 문자열은 릴리스 0.8.7부터 포함되었습니다. 이는 클라이언트와 router가 동일한 JVM에 있지 않은 경우에만 유용합니다. 존재하지 않는다면, router는 버전 0.8.6 또는 이전 버전입니다.
동일한 JVM의 클라이언트에게는 추가 SetDate 메시지가 전송되지 않습니다.