12.2. Empat lapisan¶
Pustaka protokol dibangun sebagai tumpukan empat lapisan, masing-masing menyelesaikan satu masalah dan dibangun di atas lapisan di bawahnya. Sisa bab ini menelusuri tumpukan dari bawah ke atas.
12.2.1. Transport¶
Di bagian bawah adalah pipa byte antara cam dan host. Pustaka protokol tidak peduli mana yang membawa byte:
USB-CDC melalui port USB tempat cam dicolokkan. Pilihan default dan bandwidth tertinggi untuk setiap cam.
UART melalui sepasang pin GPIO pada cam yang terhubung ke adapter serial di host. Berguna untuk deployment headless di mana port USB sibuk atau tidak dapat diakses secara fisik.
Satu-satunya tugas transport adalah "byte masuk, byte keluar, secara berurutan". Semua yang di atas lapisan ini mengasumsikan bahwa transport mengirimkan byte dalam urutan penulisannya, tetapi memperbolehkan byte itu sendiri rusak atau tautan putus sepenuhnya. Ledakan lossy (beberapa byte hilang) dan putus bersih (seluruh tautan hilang sebentar, lalu kembali) keduanya ditangani di lapisan yang lebih tinggi.
12.2.2. Framing¶
Lapisan berikutnya ke atas memaksakan struktur pada stream byte. Setiap pesan menjadi paket -- header 10-byte diikuti oleh payload diikuti oleh trailer 4-byte. Header membawa:
Kata sinkronisasi 2-byte (
0xD5AA) yang memungkinkan penerima menemukan kembali awal paket setelah desync.Nomor urutan 1-byte yang digunakan oleh lapisan keandalan.
ID channel 1-byte yang menentukan stream logis mana paket tersebut berasal.
Field flag 1-byte untuk bit ACK / NAK / fragment / event.
Opcode 1-byte yang membedakan perintah protokol, perintah sistem, dan perintah channel.
Panjang payload 2-byte.
CRC 2-byte atas delapan byte header sebelumnya.
Payload menyusul, kemudian CRC 4-byte atas payload itu sendiri. Kedua CRC mendeteksi korupsi secara independen: bit yang dibalik di header membatalkan CRC header, dan penerima dapat membuang paket tanpa perlu membaca payload.
12.2.3. Keandalan¶
Lapisan keandalan mengubah "paket yang mungkin tiba" menjadi "paket yang telah tiba." Lapisan ini melacak nomor urutan dalam header, meminta sisi lain untuk mengirimkan acknowledgement untuk setiap paket yang memerlukannya, dan melakukan retransmit ketika acknowledgement tidak tiba dalam timeout. Secara default timeout retransmit dimulai dari 500 ms dan berlipat ganda pada setiap percobaan ulang, dengan tiga percobaan ulang sebelum menyerah.
Masing-masing perilaku tersebut dapat dikonfigurasi dalam panggilan protocol.init(): ACK dapat dimatikan untuk stream satu arah, validasi CRC dapat dilewati pada transport yang benar-benar bersih, dan parameter retransmit dapat disetel untuk tautan lambat atau latensi tinggi.
12.2.4. Channel¶
Lapisan teratas adalah yang dilihat oleh kode aplikasi. Sebuah channel adalah stream logis bernama yang diidentifikasi oleh ID channel dari 0 hingga 31. Hingga 32 channel dapat hidup berdampingan pada satu transport; masing-masing independen dari yang lain, dialamatkan oleh ID-nya di header setiap paket. Cam boot dengan empat channel bawaan -- stdin, stdout, stream, dan profile -- dan kode aplikasi mendaftarkan lebih banyak di atasnya dengan memanggil protocol.register() dengan kelas Python.
Keempat lapisan tidak mencampurkan perhatian. Framing tidak mengetahui tentang channel; keandalan tidak mengetahui tentang konten paket; lapisan channel tidak mengetahui bagaimana byte tiba. Pemisahan itulah mengapa penggantian transport (USB ke UART, misalnya) tidak menyebar ke kode channel, dan itulah yang membuat sisa bab ini dapat ditelusuri satu lapisan sekaligus.