Bu çeviri makine öğrenimi kullanılarak oluşturulmuştur ve %100 doğru olmayabilir. İngilizce versiyonu görüntüle

Akış Protokolü Spesifikasyonu

TCP benzeri güvenilir aktarım sağlayan I2P streaming protokolü spesifikasyonu

Genel Bakış

Streaming protokolüne genel bakış için Streaming Library bölümüne bakın.

Protokol Sürümleri

Streaming protokolü bir sürüm alanı içermez. Aşağıda listelenen sürümler Java I2P içindir. Implementasyonlar ve gerçek kripto desteği değişiklik gösterebilir. Uzak ucun belirli bir sürümü veya özelliği destekleyip desteklemediğini belirlemenin bir yolu yoktur. Aşağıdaki tablo, çeşitli özelliklerin yayın tarihleri hakkında genel rehberlik sağlamak içindir.

Aşağıda listelenen özellikler protokolün kendisi içindir. Çeşitli yapılandırma seçenekleri, uygulandıkları Java I2P sürümü ile birlikte Streaming Library içinde belgelenmiştir.

Router VersionStreaming Features
0.9.58Bob's hash in NACKs field of SYN packet
0.9.39OFFLINE_SIGNATURE option
0.9.36I2CP protocol number enforced
0.9.20FROM_INCLUDED no longer required in RESET
0.9.18PINGs and PONGs may include a payload
0.9.15EdDSA Ed25519 sig type
0.9.12ECDSA P-256, P-384, and P-521 sig types
0.9.11Variable-length signatures
0.7.1Protocol numbers defined in I2CP
## Protokol Spesifikasyonu

Paket Formatı

Streaming protokolünde tek bir paketin formatı aşağıda gösterilmiştir. NACK’ler veya seçenek verileri olmadan minimum başlık boyutu 22 bayttır.

Streaming protokolünde uzunluk alanı bulunmamaktadır. Çerçeveleme alt katmanlar tarafından sağlanır - I2CP ve I2NP.

+----+----+----+----+----+----+----+----+
| send Stream ID    | rcv Stream ID     |
+----+----+----+----+----+----+----+----+
| sequence  Num     | ack Through       |
+----+----+----+----+----+----+----+----+
| nc |  nc*4 bytes of NACKs (optional)
+----+----+----+----+----+----+----+----+
     | rd |  flags  | opt size| opt data
+----+----+----+----+----+----+----+----+
   ...  (optional, see below)           |
+----+----+----+----+----+----+----+----+
|   payload ...
+----+----+----+-//

sendStreamId :: 4 byte Integer : İlk SYN yanıt paketini göndermeden önce paket alıcısı tarafından seçilen rastgele sayı ve bağlantının ömrü boyunca sabit, sıfırdan büyük. Bağlantı başlatıcısı tarafından gönderilen SYN mesajında 0, ve sonraki mesajlarda karşı tarafın stream ID’sini içeren bir SYN yanıtı alınana kadar 0.

receiveStreamId :: 4 bayt Integer : Paket göndereni tarafından ilk SYN paketi gönderilmeden önce seçilen ve bağlantının ömrü boyunca sabit olan, sıfırdan büyük rastgele sayı. Bilinmiyorsa, örneğin bir RESET paketinde olduğu gibi, 0 olabilir.

sequenceNum :: 4 bayt Integer : Bu mesaj için sıra numarası, SYN mesajında 0’dan başlar ve düz ACK’ler ve yeniden gönderimler dışında her mesajda 1 artırılır. sequenceNum 0 ise ve SYN bayrağı ayarlanmamışsa, bu ACK’lenmemesi gereken düz bir ACK paketidir.

ackThrough :: 4 byte Integer : receiveStreamId üzerinde alınan en yüksek paket sıra numarası. Bu alan, ilk bağlantı paketinde (receiveStreamId bilinmeyen id olduğunda) veya NO_ACK bayrağı ayarlanmışsa göz ardı edilir. Bu sıra numarasına kadar ve bu numara dahil olmak üzere tüm paketler ACK edilir, aşağıdaki NACK’lerde listelenenler HARİÇ.

NACK sayısı :: 1 byte Integer : Sonraki alandaki 4-byte NACK’ların sayısı, veya 0.9.58 sürümü itibariyle tekrar oynatma önlenmesi için SYNCHRONIZE ile birlikte kullanıldığında 8; aşağıya bakın.

NACKs :: nc * 4 byte Integer : ackThrough’dan küçük ancak henüz alınmamış sıra numaraları. Bir paketin iki NACK’ı, o paketin ‘hızlı yeniden iletimi’ için bir istektir. Ayrıca 0.9.58 sürümünden itibaren replay önleme için SYNCHRONIZE ile birlikte kullanılır; aşağıya bakın.

resendDelay :: 1 byte Integer : Bu paketin yaratıcısı, paketi yeniden göndermeden önce ne kadar bekleyecek (eğer henüz ACK edilmediyse). Değer, paketin oluşturulmasından bu yana geçen saniyedir. Şu anda alımda göz ardı ediliyor.

flags :: 2 bayt değeri : Aşağıya bakın.

option size :: 2 bayt Integer : Sonraki alandaki bayt sayısı

seçenek verisi :: 0 veya daha fazla bayt : Bayraklar tarafından belirtildiği gibi. Aşağıya bakın.

payload :: kalan paket boyutu

Bayraklar ve Seçenek Veri Alanları

Yukarıdaki flags alanı, paket hakkında bazı metadata belirtir ve bu da belirli ek verilerin dahil edilmesini gerektirebilir. Flags’lar aşağıdaki gibidir. Belirtilen herhangi bir veri yapısı, options alanına verilen sırada eklenmelidir.

Bit sırası: 15….0 (15 MSB’dir)

BitFlagOption OrderOption DataFunction
0SYNCHRONIZE----Similar to TCP SYN. Set in the initial packet and in the first response. FROM_INCLUDED and SIGNATURE_INCLUDED must also be set.
1CLOSE----Similar to TCP FIN. If the response to a SYNCHRONIZE fits in a single message, the response will contain both SYNCHRONIZE and CLOSE. SIGNATURE_INCLUDED must also be set.
2RESET----Abnormal close. SIGNATURE_INCLUDED must also be set. Prior to release 0.9.20, due to a bug, FROM_INCLUDED must also be set.
3SIGNATURE_INCLUDED5variable length SignatureCurrently sent only with SYNCHRONIZE, CLOSE, and RESET, where it is required, and with ECHO, where it is required for a ping. The signature uses the Destination's SigningPrivateKey to sign the entire header and payload with the space in the option data field for the signature being set to all zeroes. Prior to release 0.9.11, the signature was always 40 bytes. As of release 0.9.11, the signature may be variable-length, see below for details.
4SIGNATURE_REQUESTED----Unused. Requests every packet in the other direction to have SIGNATURE_INCLUDED
5FROM_INCLUDED2387+ byte DestinationCurrently sent only with SYNCHRONIZE, where it is required, and with ECHO, where it is required for a ping. Prior to release 0.9.20, due to a bug, must also be sent with RESET.
6DELAY_REQUESTED12 byte IntegerOptional delay. How many milliseconds the sender of this packet wants the recipient to wait before sending any more data. A value greater than 60000 indicates choking. A value of 0 requests an immediate ack.
7MAX_PACKET_SIZE_INCLUDED32 byte IntegerThe maximum length of the payload. Send with SYNCHRONIZE.
8PROFILE_INTERACTIVE----Unused or ignored; the interactive profile is unimplemented.
9ECHO----Unused except by ping programs. If set, most other options are ignored. See the streaming docs.
10NO_ACK----This flag simply tells the recipient to ignore the ackThrough field in the header. Currently set in the initial SYN packet, otherwise the ackThrough field is always valid. Note that this does not save any space, the ackThrough field is before the flags and is always present.
11OFFLINE_SIGNATURE4variable length OfflineSigContains the offline signature section from LS2. See proposal 123 and the common structures specification. FROM_INCLUDED must also be set. Contains an OfflineSig: 1) Expires timestamp (4 bytes, seconds since epoch, rolls over in 2106) 2) Transient sig type (2 bytes) 3) Transient SigningPublicKey (length as implied by sig type) 4) Signature of expires timestamp, transient sig type, and public key, by the destination public key. Length of sig as implied by the destination public key sig type.
12-15unusedSet to zero for compatibility with future uses.
### Değişken Uzunluklu İmza Notları

0.9.11 sürümünden önce, seçenek alanındaki imza her zaman 40 bayt idi.

0.9.11 sürümünden itibaren, imza değişken uzunluktadır. İmza türü ve uzunluğu, FROM_INCLUDED seçeneğinde kullanılan anahtar türünden ve İmza belgelerinden çıkarılır.

0.9.39 sürümü itibariyle, OFFLINE_SIGNATURE seçeneği desteklenmektedir. Bu seçenek mevcut ise, geçici SigningPublicKey imzalanmış paketleri doğrulamak için kullanılır ve imza uzunluğu ile türü seçenekteki geçici SigningPublicKey’den çıkarılır.

  • Bir paket hem FROM_INCLUDED hem de SIGNATURE_INCLUDED içerdiğinde (SYNCHRONIZE’da olduğu gibi), çıkarım doğrudan yapılabilir.

  • Bir paket FROM_INCLUDED içermediğinde, çıkarım önceki bir SYNCHRONIZE paketinden yapılmalıdır.

  • Bir paket FROM_INCLUDED içermediğinde ve önceki bir SYNCHRONIZE paketi bulunmadığında (örneğin başıboş bir CLOSE veya RESET paketi), çıkarım kalan seçeneklerin uzunluğundan yapılabilir (SIGNATURE_INCLUDED son seçenek olduğundan), ancak imzayı doğrulamak için kullanılabilir FROM bulunmadığından paket muhtemelen yine de atılacaktır. Gelecekte daha fazla seçenek alanı tanımlanırsa, bunlar da hesaba katılmalıdır.

Tekrar Oynatma Önleme

Bob’un Alice’den aldığı geçerli bir imzalı SYNCHRONIZE paketini saklayarak daha sonra kurban Charlie’ye göndererek replay saldırısı yapmasını önlemek için, Alice’in SYNCHRONIZE paketine Bob’un destination hash’ini aşağıdaki gibi dahil etmesi gerekir:

Set NACK count field to 8
Set the NACKs field to Bob's 32-byte destination hash

Bir SYNCHRONIZE alındığında, NACK count alanı 8 ise, Bob NACK’ler alanını 32-byte’lık bir hedef hash’i olarak yorumlamalı ve bunun kendi hedef hash’i ile eşleştiğini doğrulamalıdır. Ayrıca, NACK count ve NACK’ler alanları dahil olmak üzere tüm paketi kapsadığı için, paketin imzasını her zamanki gibi doğrulamalıdır. Eğer NACK count 8 ise ve NACK’ler alanı eşleşmiyorsa, Bob paketi düşürmelidir.

Bu, 0.9.58 ve üzeri sürümler için gereklidir. Bu, eski sürümlerle geriye dönük uyumludur çünkü SYNCHRONIZE paketinde NACK’ler beklenmez. Destination’lar karşı tarafın hangi sürümü çalıştırdığını bilmez ve bilemez.

Bob’dan Alice’e gönderilen SYNCHRONIZE ACK paketi için herhangi bir değişiklik gerekli değildir; bu pakete NACK’ları dahil etmeyin.

Kaynaklar

Was this page helpful?