QR kodların gerçekten ne taşıdığı.
Son güncelleme: 2026-05-01
transfqr tek-yönlü bir protokol: gönderici ekranı QR kareleri yanıp söner; alıcı kamerası yakalayabildiklerini toplar. Geri-kanal yok — Bluetooth handshake yok, WebRTC negotiation yok, geri yönde acknowledgement yok. İşi yürüten numara fountain kodlama. Alınan K + ε kare dosyayı yeniden kurar, hangilerini kaçırdığın fark etmez.
Hedefler
- Tek-yönlü. Gönderici ekranı → alıcı kamerası. Geri-kanal yok.
- Kayba dayanıklı. Alınan herhangi K + ε kare dosyayı çözer. ACK yok.
- Kendini-tanımlayan. Akışın ortasında katılan alıcı baştan başlamadan senkronize olabilir.
- Bütünlük-kontrollü. Meta frame'e gömülü SHA-256 hash, alıcı dosyayı teslim etmeden önce decode edilen payload ile eşleşmek zorunda.
Frame zarfı (18-bayt başlık)
Her QR kod bir frame taşır. Frame ikili bir blob, base45 ile (RFC 9285) encode ediliyor — bu sayede QR encoder yoğun alphanumeric modu seçiyor; byte-mode base64 alternatifine göre QR başına ~%60 daha fazla bayt taşıyor. Tüm tamsayılar little-endian.
| Bayt | Alan | Tip | Notlar |
|---|---|---|---|
| 0..1 | magic | u16 | 0x5451 ('TQ') |
| 2 | version | u8 | şu an 1 |
| 3 | packetType | u8 | 0x01 = meta, 0x02 = data |
| 4..7 | fileId | u32 | oturum başına rastgele; uyumsuz olunca alıcı atar |
| 8..11 | totalChunks | u32 | K = kaynak blok sayısı |
| 12..13 | blockSize | u16 | kaynak blok başına bayt |
| 14..17 | seed | u32 | LT PRNG seed (sadece data; meta 0'a set eder) |
| 18.. | payload | — | tipe özel |
Paket türleri
Meta (0x01)
Gönderici tarafından periyodik olarak (her 10'uncu kare) yollanır ki akışın ortasında katılan alıcı bootstrap yapabilsin. Meta paketi şunu taşır:
fileNameLen u8
fileName utf-8 bytes
mimeLen u8
mimeType utf-8 bytes
originalSize u64 (8 bytes LE)
sha256 32 bytes (post-decompression checksum)
flags u8 (bit 0 = compressed) Data (0x02)
LT-encoded data sembolü. Payload tam olarak blockSize bayt. Başlıktaki seed alıcıya hangi kaynak blokların XOR'lanarak bu sembolün üretildiğini söyler. Aynı seed → iki tarafta aynı kombinasyon; LT degree dağılımı belief propagation'ı mümkün kılar.
Gönderici döngüsü
- Boyut threshold üstüyse kaynak baytları sıkıştır (pako üzerinden DEFLATE).
- Sıkıştırılmış (sıfır pad'lenmiş) payload'un SHA-256'sını hesapla.
- blockSize'lık K bloğa böl.
- Bu K blok üzerinde bir LT (Luby Transform) encoder kur.
- Sonsuz döngü: her 10'uncu tick'te meta paket çiz; aksi halde taze rastgele seed seç, bir LT sembol encode et, çıkan baytları QR olarak çiz.
- Kullanıcı iptal edince dur.
Alıcı döngüsü
- Kamerayı aç, sürekli QR tara.
- Decode edilen her frame için: magic + version doğrula, gördüğün ilk fileId'ye kilitlen, farklı olanları at.
- Meta ise ve henüz meta görmediysen: fileName, mime, size, sha256, flags sakla. Data ise: (seed, payload)'ı LT decoder'a besle.
- İlerlemeyi recovered / K olarak takip et.
- Decoder tamamlanınca: yeniden kur, SHA-256'yı doğrula, compressed flag set ise aç, dosyayı OS'a teslim et (kaydet / paylaş).
QR çizimi
Frame'ler error correction level L (~%7 redundancy) ile çiziliyor — fountain kodu zaten devasa uçtan-uca redundancy sağlıyor, QR'a daha fazla ECC bit'i harcamak per-frame payload'u küçültmekten başka işe yaramıyor. Quiet zone: 1 modül. Gönderici tempo: ~12-13 frame/saniye (80ms tick); alıcı kamera bazılarını kaçırır, fountain kodu kurtarır.
Bu protokol şunlar değil
- Şifrelenmiş değil. v1 frame'leri ekranına kamera tutan herkese açık. Gizlilik gerekiyorsa dosyayı göndermeden önce şifrele. Protokolün v3'ü opsiyonel passphrase-türetimli session key ekleyecek.
- Authenticated değil. Herkes senden geliyormuş gibi bir frame oluşturabilir. Pratikte: transfer sırasında ekranına kim QR spoof'layacak? Gerçek bir tehdit modeli ortaya çıkarsa ileride sürümler imza ekleyebilir.
- Yüksek-bandwidth değil. Frame başına 768 bayt × 12.5 fps ≈ etkili 9 KB/s throughput. 1 MB dosya ~110 saniye, 5 MB yaklaşık 9 dakika. Dokümanlar, fotoğraflar, ses notları için yeterli. Filmler için değil. 50 MB hard cap'i var.
Yol haritası
- v2: RaptorQ erasure coding (RFC 6330), LT'nin yerine — özellikle küçük K'lerde marjinal kapasitede daha düşük decode failure rate.
- v3: Opsiyonel uçtan-uca şifreleme — passphrase'den session key türetilir; meta ve payload LT-encode edilmeden önce şifrelenir.
Bir fikrin mi var ya da bir hata mı buldun? protocol@transfqr.com.