Apakah WebRTC menggunakan SCTP?
Menggunakan saluran data WebRTC
Ringkasan
Dalam panduan ini, kami akan memeriksa cara menambahkan saluran data ke koneksi peer, yang kemudian dapat digunakan untuk bertukar data sewenang -wenang dengan aman. Kami akan melihat cara membuat saluran data dan mendiskusikan opsi untuk negosiasi otomatis dan manual.
Poin -poin penting
1. Transportasi SCTP digunakan untuk mentransmisikan dan menerima data untuk rtcdatachannels pada koneksi sebaya.
2. Antarmuka RTCPeerConnection memiliki properti read-only yang disebut SCTP, yang mengembalikan objek RTCSCTPTransport yang menggambarkan transportasi SCTP yang digunakan.
3. Metode createdatachannel () pada antarmuka RTCPeerConnection digunakan untuk membuat saluran data baru.
4. Negosiasi otomatis memungkinkan RTCPeerConnection untuk menangani negosiasi dan pembuatan saluran data.
5. Negosiasi manual melibatkan pembuatan objek RTCDataChannel dengan properti yang dinegosiasikan ditetapkan ke true, dan kemudian menegosiasikan koneksi di luar band.
6. Ukuran pesan maksimum yang dapat dikirim melalui saluran data dapat ditentukan dengan menggunakan properti maxmessageze dari objek rtcsctptransport.
7. Komponen WebRTC menggunakan enkripsi untuk mengamankan data yang dikirimkan melalui rtcdatachannel.
8. Spesifikasi untuk saluran data WEBRTC dapat ditemukan di WebRTC: komunikasi real-time dalam spesifikasi browser.
9. Kompatibilitas saluran data WEBRTC bervariasi di seluruh browser.
10. Sumber daya dan opsi tambahan untuk mengedit atau melaporkan masalah dengan halaman dapat ditemukan di bagian “Lihat juga”.
Pertanyaan dan jawaban
- Apa tujuan blok ACK di saluran data WebRTC?
Blok ack digunakan untuk memberi tahu pengirim bahwa paket tertentu tidak perlu dibenci, bahkan jika ada celah dalam paket yang dikirim. Misalnya, jika data potongan dengan TSNS 100, 102, 103, dan 104 dikirimkan, tetapi TSN ACK kumulatif adalah 100, blok ACK dapat digunakan untuk menunjukkan bahwa TSNS 102, 103, dan 104 tidak perlu dibenci. - Apa properti sctp dari pengembalian antarmuka rtcpeerconnection?
Properti SCTP mengembalikan objek RTCSCTPTransport yang menjelaskan transportasi SCTP yang digunakan untuk mengirimkan dan menerima data untuk rtcdatachannels pada koneksi peer. Jika SCTP belum dinegosiasikan, nilainya nol. - Bagaimana saluran data dapat dibuat di WebRTC?
Saluran data dapat dibuat menggunakan metode createdatachannel () pada antarmuka RTCPeerConnection. Metode ini mengembalikan objek rtcdatachannel yang mewakili saluran data yang baru dibuat. - Apa perbedaan antara negosiasi otomatis dan negosiasi manual?
Dalam negosiasi otomatis, RTCPeerConnection menangani negosiasi dan pembuatan saluran data. Metode createdatachannel () dipanggil tanpa menentukan nilai untuk properti yang dinegosiasikan atau dengan nilai false. Dalam negosiasi manual, saluran data dibuat dengan properti yang dinegosiasikan ditetapkan ke true, dan negosiasi dilakukan di luar band menggunakan server web atau cara lain. - Bagaimana ukuran pesan maksimum yang dapat dikirim melalui saluran data ditentukan?
Ukuran pesan maksimum dapat ditentukan dengan mengakses properti maxmessageze dari objek rtcsctptransport, yang mewakili transportasi sct yang digunakan oleh rtcpeerconnection. - Apakah data yang dikirimkan pada rtcdatachannel secara otomatis diamankan?
Ya, semua data yang dikirimkan pada RTCDataChannel secara otomatis diamankan menggunakan Datagram Transport Layer Security (DTLS). Komponen WebRTC diperlukan untuk menggunakan enkripsi untuk memastikan keamanan data. - Di mana spesifikasi untuk saluran data WEBRTC dapat ditemukan?
Spesifikasi untuk saluran data WEBRTC dapat ditemukan di WebRTC: komunikasi waktu nyata dalam spesifikasi browser, khususnya bagian DOM-RTCPeerConnection-SCTP. - Apa kompatibilitas saluran data WEBRTC di seluruh browser?
Kompatibilitas saluran data WEBRTC dapat bervariasi di berbagai browser. Penting untuk menguji dan memastikan kompatibilitas untuk browser dan versi target. - Apa saja sumber daya tambahan yang terkait dengan saluran data WebRTC?
Anda dapat mengedit halaman di github, melaporkan masalah konten, atau melihat kode sumber di github. Opsi ini dapat ditemukan di bagian “Lihat juga” di bawah ini.Menggunakan saluran data WebRTC
ACK memblokir TSN yang telah diterima setelah TSN kumulatif ACK . Ini digunakan jika ada celah dalam paket yang dikirimkan. Membiarkan’S mengatakan potongan data dengan TSNS 100, 102, 103 dan 104 dikirimkan. TSN kumulatif ACK akan menjadi 100, tetapi blok ACK dapat digunakan untuk memberi tahu pengirimnya’t perlu mengirim ulang 102, 103 atau 104 .
RTCPeerConnection: Properti SCTP
Hanya baca sctp Properti pada antarmuka RTCPeerConnection mengembalikan RTCSCTPTransport yang menggambarkan transportasi SCTP di mana data SCTP sedang dikirim dan diterima. Jika SCTP belum dinegosiasikan, nilai ini nol .
Transportasi SCTP digunakan untuk mentransmisikan dan menerima data untuk setiap dan semua rtcdatachannel S pada koneksi sebaya.
Nilai
Objek RTCSCTPTransport yang menggambarkan transportasi SCTP yang digunakan oleh RTCPeerConnection untuk mentransmisikan dan menerima di saluran data, atau nol jika negosiasi SCTP belum terjadi.
Contoh
const Peerconnection = baru RtcpeerConnection(); const saluran = Peerconnection.Createdatachannel("Data saya"); saluran.Onopen = (peristiwa) => saluran.mengirim("Mengirim pesan"); >; saluran.onMessage = (peristiwa) => menghibur.catatan(peristiwa.data); >; // Tentukan ukuran pesan terbesar yang dapat dikirim const sctp = Peerconnection.sctp; const MaxMessageSize = sctp.MaxMessageSize;
Spesifikasi
Spesifikasi WEBRTC: Komunikasi real-time di browser
# dom-rtcpeerConnection-sctpKompatibilitas browser
Tabel BCD hanya memuat di browser
Lihat juga
Menemukan masalah konten dengan halaman ini?
- Edit halaman di github.
- Laporkan masalah konten.
- Lihat sumbernya di GitHub.
Halaman ini terakhir dimodifikasi pada 25 Apr 2023 oleh kontributor MDN.
Cetak biru Anda untuk internet yang lebih baik.
Menggunakan saluran data WebRTC
Dalam panduan ini, kami akan memeriksa cara menambahkan saluran data ke koneksi rekan, yang kemudian dapat digunakan untuk bertukar data sewenang -wenang dengan aman; yaitu, segala jenis data yang kami inginkan, dalam format apa pun yang kami pilih.
Catatan: Karena semua komponen WEBRTC diperlukan untuk menggunakan enkripsi, data apa pun yang dikirimkan pada rtcdatachannel secara otomatis diamankan menggunakan Datagram Transport Layer Security (DTLS). Lihat Keamanan di bawah untuk informasi lebih lanjut.
Membuat Saluran Data
Transportasi data yang mendasari yang digunakan oleh RTCDataChannel dapat dibuat dalam salah satu dari dua cara:
- Biarkan WebRTC membuat transportasi dan mengumumkannya ke rekan jarak jauh untuk Anda (dengan menyebabkannya menerima acara Datachannel). Ini adalah cara yang mudah, dan berfungsi untuk berbagai kasus penggunaan, tetapi mungkin tidak cukup fleksibel untuk kebutuhan Anda.
- Tulis kode Anda sendiri untuk menegosiasikan transportasi data dan tulis kode Anda sendiri untuk memberi sinyal kepada rekan lain yang perlu terhubung ke saluran baru.
Mari kita lihat masing -masing kasus ini, dimulai dengan yang pertama, yang paling umum.
Negosiasi otomatis
Seringkali, Anda dapat mengizinkan koneksi rekan untuk menangani negosiasi koneksi rtcdatachannel untuk Anda. Untuk melakukan ini, hubungi
CreateDatachannel () tanpa menentukan nilai untuk properti yang dinegosiasikan, atau menentukan properti dengan nilai false . Ini akan secara otomatis memicu RTCPeerConnection untuk menangani negosiasi untuk Anda, menyebabkan rekan jarak jauh membuat saluran data dan menghubungkan keduanya bersama -sama di seluruh jaringan.
Objek RTCDataChannel dikembalikan segera oleh CreateDatachannel (); Anda dapat mengetahui kapan koneksi telah dibuat dengan sukses dengan menonton acara terbuka untuk dikirim ke rtcdatachannel .
membiarkan Datachannel = PC.Createdatachannel("Saluran MyApp"); Datachannel.AddEventListener("membuka", (peristiwa) => Awal Transmisi(Datachannel); >);
Negosiasi manual
Untuk menegosiasikan koneksi saluran data secara manual, Anda harus terlebih dahulu membuat objek RTCDataChannel baru menggunakan metode createdatachannel () pada RTCPeerConnection, menentukan dalam opsi properti yang dinegosiasikan yang ditetapkan ke True . Ini menandakan koneksi rekan untuk tidak mencoba menegosiasikan saluran atas nama Anda.
Kemudian negosiasikan koneksi di luar band, menggunakan server web atau cara lain. Proses ini harus memberi sinyal kepada rekan jarak jauh bahwa ia harus membuat rtcdatachannel sendiri dengan properti yang dinegosiasikan juga diatur ke true, menggunakan ID yang sama . Ini akan menautkan kedua objek di seluruh RTCPeerConnection .
membiarkan Datachannel = PC.Createdatachannel("Saluran MyApp", dinegosiasikan: BENAR, >); Datachannel.AddEventListener("membuka", (peristiwa) => Awal Transmisi(Datachannel); >); requestRemotechannel(Datachannel.pengenal);
Dalam cuplikan kode ini, saluran dibuat dengan set yang dinegosiasikan ke true, kemudian fungsi yang disebut requestRemotechannel () digunakan untuk memicu negosiasi, untuk membuat saluran jarak jauh dengan ID yang sama dengan saluran lokal.
Melakukan ini memungkinkan Anda membuat saluran data dengan masing -masing rekan menggunakan properti yang berbeda, dan untuk membuat saluran secara deklaratif dengan menggunakan nilai yang sama untuk ID .
Buffering
Saluran Data WebRTC mendukung buffering data keluar. Ini ditangani secara otomatis. Meskipun tidak ada cara untuk mengontrol ukuran buffer, Anda dapat mempelajari berapa banyak data yang saat ini buffered, dan Anda dapat memilih untuk diberitahu oleh suatu peristiwa ketika buffer mulai berjalan rendah pada data antrian. Ini membuatnya mudah untuk menulis rutinitas yang efisien yang memastikan selalu ada data yang siap dikirim tanpa menggunakan memori secara berlebihan atau membanjiri saluran sepenuhnya.
Memahami Batas Ukuran Pesan
Untuk data apa pun yang ditransmisikan melalui jaringan, ada batasan ukuran. Pada tingkat fundamental, paket jaringan individual tidak dapat lebih besar dari nilai tertentu (angka yang tepat tergantung pada jaringan dan lapisan transportasi yang digunakan). Pada tingkat aplikasi – yaitu, di dalam implementasi WebRTC agen pengguna di mana kode Anda berjalan – implementasi WEBRTC mengimplementasikan fitur untuk mendukung pesan yang lebih besar dari ukuran paket maksimum pada lapisan transportasi jaringan jaringan jaringan jaringan jaringan jaringan jaringan jaringan jaringan jaringan.
Ini dapat memperumit hal -hal, karena Anda tidak perlu tahu berapa batas ukuran untuk berbagai agen pengguna, dan bagaimana mereka merespons ketika pesan yang lebih besar dikirim atau diterima. Bahkan ketika agen pengguna berbagi pustaka yang mendasari yang sama untuk menangani data Protokol Transmisi Stream Control (SCTP), masih ada variasi karena bagaimana perpustakaan digunakan. Misalnya, baik Firefox dan Google Chrome menggunakan pustaka USRSCTP untuk mengimplementasikan SCTP, tetapi masih ada situasi di mana transfer data pada rtcdatachannel dapat gagal karena perbedaan dalam cara mereka memanggil perpustakaan dan bereaksi terhadap kesalahan yang dikembalikannya.
Ketika dua pengguna yang menjalankan Firefox berkomunikasi pada saluran data, batas ukuran pesan jauh lebih besar daripada ketika Firefox dan Chrome berkomunikasi karena Firefox mengimplementasikan teknik yang sekarang sudah usang untuk mengirim pesan besar dalam beberapa pesan SCTP, yang tidak dimiliki Chrome yang tidak dikeluarkan Chrome. Chrome sebaliknya akan melihat serangkaian pesan yang menurutnya lengkap, dan akan mengirimkannya ke rtcdatachannel penerima sebagai banyak pesan.
Pesan yang lebih kecil dari 16 kib dapat dikirim tanpa perhatian, karena semua agen pengguna utama menanganinya dengan cara yang sama. Di luar itu, segalanya menjadi lebih rumit.
Kekhawatiran dengan pesan besar
Saat ini, tidak praktis untuk menggunakan rtcdatachannel untuk pesan yang lebih besar dari 64 kib (16 kib jika Anda ingin mendukung pertukaran data lintas-browser). Masalah muncul dari fakta bahwa SCTP – protokol yang digunakan untuk mengirim dan menerima data pada rtcdatachannel – awalnya dirancang untuk digunakan sebagai protokol pensinyalan. Diharapkan bahwa pesan akan relatif kecil. Dukungan untuk pesan yang lebih besar dari MTU Lapisan Jaringan ditambahkan hampir sebagai renungan, jika pesan pensinyalan yang diperlukan lebih besar dari MTU. Fitur ini mensyaratkan bahwa setiap bagian dari pesan memiliki nomor urutan berurutan, jadi mereka harus ditransmisikan satu demi satu, tanpa data lain yang diselingi di antara mereka.
Ini akhirnya menjadi masalah. Seiring waktu, berbagai aplikasi (termasuk yang mengimplementasikan WebRTC) mulai menggunakan SCTP untuk mengirimkan pesan yang lebih besar dan lebih besar. Akhirnya disadari bahwa ketika pesan menjadi terlalu besar, dimungkinkan untuk transmisi pesan besar untuk memblokir semua transfer data lainnya pada saluran data itu – termasuk pesan pensinyalan kritis.
Ini akan menjadi masalah ketika browser dengan benar mendukung standar saat ini untuk mendukung pesan yang lebih besar-bendera akhir-catatan (EOR) yang menunjukkan kapan pesan adalah yang terakhir dalam seri yang harus diperlakukan sebagai muatan tunggal tunggal. Ini diimplementasikan dalam Firefox 57, tetapi belum diterapkan dalam Chrome (lihat Chromium Bug 7774). Dengan dukungan EOR di tempat, muatan RTCDataChannel bisa jauh lebih besar (secara resmi hingga 256 kib, tetapi implementasi Firefox membatasi mereka dengan 1 GIB). Bahkan di 256 kib, itu cukup besar untuk menyebabkan keterlambatan dalam menangani lalu lintas yang mendesak. Jika Anda menjadi lebih besar, penundaan dapat menjadi tidak dapat dipertahankan kecuali Anda yakin dengan kondisi operasional Anda.
Untuk menyelesaikan masalah ini, sistem baru Penjadwal aliran ;. Proposal ini masih dalam formulir draft IETF, tetapi setelah diimplementasikan, akan memungkinkan untuk mengirim pesan dengan pada dasarnya tanpa batasan ukuran, karena lapisan SCTP akan secara otomatis mengganggu sub-pesan yang mendasarinya untuk memastikan bahwa data setiap saluran memiliki peluang untuk melewati.
Dukungan Firefox untuk NDATA sedang dalam proses diimplementasikan; Lihat Firefox Bug 1381145 untuk melacaknya tersedia untuk penggunaan umum. Tim Chrome melacak implementasi dukungan NDATA di Chrome Bug 5696.
Catatan: Banyak informasi di bagian ini sebagian didasarkan pada posting blog Demystifying WebRTC’s Data Channel Ukuran Ukuran Pesan, yang ditulis oleh Lennart Grahl. Dia masuk ke sedikit lebih detail di sana, tetapi karena browser telah diperbarui sejak saat itu beberapa di antaranya mungkin sudah ketinggalan zaman. Selain itu, seiring berjalannya waktu, itu akan menjadi lebih, terutama setelah dukungan EOR dan NDATA sepenuhnya terintegrasi di browser utama.
Keamanan
Semua data yang ditransfer menggunakan WebRTC dienkripsi. Dalam kasus rtcdatachannel, enkripsi yang digunakan adalah Datagram Transport Layer Security (DTLS), yang didasarkan pada keamanan lapisan transportasi (TLS). Karena TLS digunakan untuk mengamankan setiap koneksi HTTPS, data apa pun yang Anda kirim pada saluran data sama amannya dengan data lain yang dikirim atau diterima oleh browser pengguna.
Lebih mendasar, karena WebRTC adalah koneksi peer-to-peer antara dua agen pengguna, data tidak pernah melewati web atau server aplikasi. Ini mengurangi peluang untuk membuat data dicegat.
Menemukan masalah konten dengan halaman ini?
- Edit halaman di github.
- Laporkan masalah konten.
- Lihat sumbernya di GitHub.
Halaman ini terakhir dimodifikasi pada 25 Apr 2023 oleh kontributor MDN.
Apakah WebRTC menggunakan SCTP?
Об этой страницental
Ы заре kondecedit. С помощю этой страницы с сожем определить, что запросы о о ancing оеет иенно ы,. Почем это мопо произойтиonya?
Ээ страница отображается в тех слчаях, когда автомически систе secara google ристрюи uman рисисilan рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рancing рии и menelepon которые наршают уловия исполззованияisah. Страница перестанет отображаться после то A, как эти запросы прекратяupanisah яяisah ancing ancing. До это A.
Источником запросов может слжить Врддносно secara п, пар иа бас00 иасазаз) ыылку запросов. Если Вы исползеет общий дсст в и итернет, проблем м ы ы ip ip ip00 ip ip ip ip ip uman ip ip ip ip ip ip uman ip ip ip ip ip ip ip uman ip ip ip ip ip ip ip ON ip ip ip ip ip ip ON. Обратитесь к своем системном аинистратору. Подробнее secara.
Пожет такжeda появлят secara, если Вы Вонот A рлжвввв dari рыч о оаilat оыч о оаilat, еами, ии же Водитedit запросы чень часто засто.
Komunikasi data #
Apa yang saya dapatkan dari webrtc’S komunikasi data? #
WebRTC menyediakan saluran data untuk komunikasi data. Di antara dua rekan Anda dapat membuka 65.534 saluran data. Saluran data berbasis datagram, dan masing -masing memiliki pengaturan daya tahannya sendiri. Secara default, setiap saluran data telah dijamin pengiriman yang dipesan. Jika Anda mendekati WEBRTC dari saluran data latar belakang media mungkin tampak sia -sia. Mengapa saya membutuhkan seluruh subsistem ini ketika saya bisa menggunakan http atau websockets? Kekuatan nyata dengan saluran data adalah Anda dapat mengonfigurasinya untuk berperilaku seperti UDP dengan pengiriman yang tidak teratur/lossy. Ini diperlukan untuk situasi latensi rendah dan kinerja tinggi. Anda dapat mengukur tekanan balik dan memastikan Anda hanya mengirim sebanyak yang didukung jaringan Anda.
bagaimana cara kerjanya? #
WebRTC menggunakan protokol transmisi kontrol aliran (SCTP), didefinisikan dalam RFC 4960. SCTP adalah protokol lapisan transport yang dimaksudkan sebagai alternatif untuk TCP atau UDP. Untuk WebRTC kami menggunakannya sebagai protokol lapisan aplikasi yang berjalan di atas koneksi DTLS kami. SCTP memberi Anda aliran dan setiap aliran dapat dikonfigurasi secara independen. Saluran data WebRTC hanyalah abstraksi tipis di sekitarnya. Pengaturan di sekitar daya tahan dan pemesanan baru saja diteruskan ke agen SCTP. Saluran data memiliki beberapa fitur yang bisa dilakukan SCTP’t ekspres, seperti label saluran. Untuk menyelesaikan bahwa WebRTC menggunakan data pembentukan saluran data (DCEP) yang didefinisikan dalam RFC 8832. DCEP mendefinisikan pesan untuk mengkomunikasikan label dan protokol saluran.
DCEP #
DCEP hanya memiliki dua pesan data_channel_open dan data_channel_ack . Untuk setiap saluran data yang dibuka, remote harus merespons dengan ACK.
Data_channel_open #
Pesan ini dikirim oleh agen WebRTC yang ingin membuka saluran.
Format Paket #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Jenis Pesan | Jenis Saluran | Prioritas | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Parameter Keandalan | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Panjang label | Panjang Protokol | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / label / \+\++++++-+-+-+-+-+-- -+-+-+-+-+-+-+-+-+\ \ / protokol / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Jenis Pesan #
Jenis pesan adalah nilai statis 0x03 .
Jenis Saluran #
- Data_channel_reliable (0x00) – tidak ada pesan yang hilang dan akan tiba secara berurutan
- Data_channel_reliable_unordered (0x80) – tidak ada pesan yang hilang, tetapi mereka mungkin sudah rusak.
- Data_channel_partial_reliable_rexmit (0x01) – Pesan mungkin hilang setelah mencoba jumlah yang diminta, tetapi mereka akan tiba secara berurutan.
- Data_channel_partial_reliable_rexmit_unordered (0x81) – pesan mungkin hilang setelah mencoba jumlah yang diminta dan mungkin tiba dari urutan.
- Data_channel_partial_reliable_timed (0x02) – Pesan mungkin hilang jika mereka tidak’T tiba dalam jumlah waktu yang diminta, tetapi mereka akan tiba secara berurutan.
- Data_channel_partial_reliable_timed_unordered (0x82) – pesan mungkin hilang jika mereka tidak’T tiba dalam jumlah waktu yang diminta dan mungkin tiba dari pesanan.
Prioritas #
Prioritas saluran data. Saluran data yang memiliki prioritas yang lebih tinggi akan dijadwalkan terlebih dahulu. Pesan pengguna prioritas rendah besar tidak akan menunda pengiriman pesan pengguna prioritas tinggi.
Parameter Keandalan #
Jika tipe saluran data adalah data_channel_partial_reliable, sufiks mengkonfigurasi perilaku:
- Rexmit – mendefinisikan berapa kali pengirim akan menyerahkan kembali pesan sebelum menyerah.
- Timeed – mendefinisikan berapa lama waktu (dalam MS) pengirim akan menyerahkan kembali pesan sebelum menyerah.
Label #
String yang dikodekan UTF-8 yang berisi nama saluran data. String ini mungkin kosong.
Protokol #
Jika ini adalah string kosong, protokol tidak ditentukan. Jika itu adalah string yang tidak kosong, itu harus menentukan protokol yang terdaftar di “Registry Nama Subprotokol Websocket”, didefinisikan dalam RFC 6455.
Data_channel_ack #
Pesan ini dikirim oleh agen WebRTC untuk mengakui bahwa saluran data ini telah dibuka.
Format Paket #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Jenis Pesan | +-+-+-+-+-+-+-+-+
Protokol Transmisi Kontrol Aliran #
SCTP adalah kekuatan nyata di balik saluran data WEBRTC. Ini menyediakan semua fitur saluran data ini:
- Multiplexing
- Pengiriman yang andal menggunakan mekanisme transmisi seperti TCP
- Opsi-opsi keandalan parsial
- Penghindaran kemacetan
- Alur kontrol
Untuk memahami sctp kita akan menjelajahinya dalam tiga bagian. Tujuannya adalah Anda akan cukup tahu untuk men -debug dan mempelajari detail mendalam SCTP sendiri setelah bab ini.
Konsep #
Sctp adalah protokol kaya fitur. Bagian ini hanya akan menutupi bagian -bagian SCTP yang digunakan oleh WEBRTC. Fitur dalam sctp yang tidak digunakan oleh WebRTC termasuk multi-homing dan pemilihan jalur.
Dengan lebih dari dua puluh tahun pengembangan SCTP bisa sulit dipahami sepenuhnya.
Asosiasi #
Asosiasi adalah istilah yang digunakan untuk sesi SCTP. Itu adalah keadaan yang dibagi antara dua agen SCTP saat mereka berkomunikasi.
Streams #
Aliran adalah satu urutan dua arah dari data pengguna. Saat Anda membuat saluran data, Anda sebenarnya hanya membuat aliran SCTP. Setiap asosiasi SCTP berisi daftar aliran. Setiap aliran dapat dikonfigurasi dengan jenis keandalan yang berbeda.
WebRTC hanya memungkinkan Anda untuk mengonfigurasi pembuatan aliran, tetapi SCTP sebenarnya memungkinkan mengubah konfigurasi kapan saja.
Berbasis datagram #
SCTP membingkai data sebagai datagram dan bukan sebagai aliran byte. Mengirim dan menerima data terasa seperti menggunakan UDP bukan TCP. Kamu don’t perlu menambahkan kode tambahan untuk mentransfer beberapa file melalui satu aliran.
Pesan SCTP Don’t memiliki batas ukuran seperti UDP. Pesan SCTP tunggal dapat berupa gigabyte beberapa.
Potongan #
Protokol SCTP terdiri dari potongan. Ada banyak jenis potongan. Potongan -potongan ini digunakan untuk semua komunikasi. Data pengguna, inisialisasi koneksi, kontrol kemacetan, dan banyak lagi semuanya dilakukan melalui potongan.
Setiap paket SCTP berisi daftar potongan. Jadi dalam satu paket UDP Anda dapat memiliki beberapa potongan yang membawa pesan dari berbagai aliran.
Nomor Urutan Transmisi #
Nomor Urutan Transmisi (TSN) adalah pengidentifikasi unik global untuk potongan data. Potongan data adalah yang membawa semua pesan yang ingin dikirim pengguna. TSN penting karena membantu penerima menentukan apakah paket hilang atau rusak.
Jika penerima memperhatikan TSN yang hilang, itu tidak’t berikan data kepada pengguna sampai terpenuhi.
Pengidentifikasi aliran #
Setiap aliran memiliki pengidentifikasi yang unik. Saat Anda membuat saluran data dengan ID eksplisit, itu sebenarnya baru saja diteruskan ke SCTP sebagai pengidentifikasi aliran. Jika kamu tidak’t lulus id Identifier aliran dipilih untuk Anda.
Pengidentifikasi Protokol Payload #
Setiap potongan data juga memiliki pengidentifikasi protokol payload (PPID). Ini digunakan untuk secara unik mengidentifikasi jenis data apa yang sedang dipertukarkan. SCTP memiliki banyak PPID, tetapi WebRTC hanya menggunakan lima berikut:
- WEBRTC DCEP (50) – Pesan DCEP.
- WebRTC String (51) – Pesan String Datachannel.
- WEBRTC BINARY (53) – Pesan biner Datachannel.
- WebRTC String Empty (56) – Pesan String Datachannel dengan 0 Panjang.
- WebRTC Binary Empty (57) – Pesan Biner Datachannel dengan 0 Panjang.
Protokol #
Berikut ini adalah beberapa potongan yang digunakan oleh protokol SCTP. Ini bukan demonstrasi yang lengkap. Ini menyediakan struktur yang cukup untuk mesin negara untuk masuk akal.
Setiap potongan dimulai dengan bidang jenis. Sebelum daftar potongan, Anda juga akan memiliki header.
Data Chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 0 | Dicadangkan | u | b | e | Panjang | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Tsn | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Pengidentifikasi aliran | Nomor Urutan Stream | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Pengidentifikasi Protokol Payload | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / data pengguna / \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Potongan data adalah bagaimana semua data pengguna dipertukarkan. Saat Anda mengirim apa pun melalui saluran data, ini adalah cara dipertukarkan.
U bit diatur jika ini adalah paket yang tidak teratur. Kita bisa mengabaikan nomor urutan aliran.
B dan E adalah bit awal dan akhir. Jika Anda ingin mengirim pesan yang terlalu besar untuk satu potongan data, perlu difragmentasi menjadi beberapa potongan data yang dikirim dalam paket terpisah. Dengan bit b dan e bit dan urutan SCTP mampu mengekspresikan ini.
- B = 1, e = 0 – Potongan pertama dari pesan pengguna yang terfragmentasi.
- B = 0, e = 0 – Potongan tengah dari pesan pengguna yang terfragmentasi.
- B = 0, e = 1 – Potongan terakhir dari pesan pengguna yang terfragmentasi.
- B = 1, e = 1 – pesan yang tidak terfragmentasi.
TSN adalah nomor urutan transmisi. Ini adalah pengidentifikasi unik global untuk potongan data ini. Setelah 4.294.967.295 potongan ini akan dibungkus menjadi 0. TSN bertambah untuk setiap potongan dalam pesan pengguna yang terfragmentasi sehingga penerima tahu cara memesan potongan yang diterima untuk merekonstruksi pesan asli.
Pengidentifikasi aliran adalah pengidentifikasi unik untuk aliran data ini.
Nomor Urutan Stream adalah nomor 16-bit bertambah setiap pesan pengguna dan termasuk dalam header Chunk Pesan Data. Setelah 65535 pesan ini akan dibungkus ke 0. Nomor ini digunakan untuk memutuskan urutan pesan pengiriman ke penerima jika Anda diatur ke 0. Mirip dengan TSN, kecuali nomor urutan aliran hanya bertambah untuk setiap pesan secara keseluruhan dan bukan setiap potongan data individu.
Pengidentifikasi Protokol Payload adalah jenis data yang mengalir melalui aliran ini. Untuk WEBRTC, itu akan menjadi DCEP, String atau Binary.
Data pengguna adalah apa yang Anda kirim. Semua data yang Anda kirim melalui saluran data WEBRTC ditransmisikan melalui potongan data.
Init chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 1 | Bendera chunk | Panjang Potongan | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Inisiasi tag | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Kredit Jendela Penerima yang Diiklankan (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Jumlah aliran keluar | Jumlah aliran masuk | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN Awal | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ \ / opsional / variabel-panjang / \ \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk init memulai proses pembuatan asosiasi.
Tag inisiat digunakan untuk generasi cookie. Cookie digunakan untuk manusia-di-menengah dan penolakan perlindungan layanan. Mereka dijelaskan secara lebih rinci di bagian mesin negara bagian.
Kredit jendela penerima yang diiklankan digunakan untuk SCTP’Kontrol kemacetan. Ini mengkomunikasikan seberapa besar buffer yang dialokasikan penerima untuk asosiasi ini.
Jumlah aliran keluar/inbound memberi tahu remote tentang berapa banyak aliran yang didukung agen ini.
TSN awal adalah UINT32 acak untuk memulai TSN lokal di.
Parameter opsional memungkinkan SCTP untuk memperkenalkan fitur baru ke protokol.
Sack Chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 3 | bendera chunk | Panjang Potongan | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Kumulatif TSN ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Kredit Jendela Penerima yang Diiklankan (A_RWND) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Jumlah blok ACK celah = n | Jumlah duplikat tsns = x | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #1 Mulai | Gap Ack Block #1 End | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Gap Ack Block #n Mulai | GAP ACK BLOCK #N END | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplikat TSN 1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / \ . \ / /+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Duplikat TSN X | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Potongan karung (pengakuan selektif) adalah bagaimana seorang penerima memberi tahu seorang pengirimnya telah mendapatkan paket. Sampai pengirim mendapat karung untuk TSN, ia akan mengubah kembali chunk data yang dimaksud. Sebuah karung tidak lebih dari sekadar memperbarui TSN.
Tsn kumulatif ACK TSN tertinggi yang telah diterima.
Ukuran buffer penerima window receiver yang diiklankan. Penerima dapat mengubah ini selama sesi jika lebih banyak memori tersedia.
ACK memblokir TSN yang telah diterima setelah TSN kumulatif ACK . Ini digunakan jika ada celah dalam paket yang dikirimkan. Membiarkan’S mengatakan potongan data dengan TSNS 100, 102, 103 dan 104 dikirimkan. TSN kumulatif ACK akan menjadi 100, tetapi blok ACK dapat digunakan untuk memberi tahu pengirimnya’t perlu mengirim ulang 102, 103 atau 104 .
Duplikat TSN memberi tahu pengirim bahwa mereka telah menerima potongan data berikut lebih dari sekali.
Chunk Heartbeat #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 4 | Bendera chunk | Panjang detak jantung | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / Informasi Hati TLV (variabel-panjang) / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Potongan detak jantung digunakan untuk menegaskan remote masih merespons. Berguna jika Anda Aren’t Mengirimkan potongan data apa pun dan perlu membuka pemetaan NAT.
Abort Chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 6 | dicadangkan | t | Panjang | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ / / / \ nol atau lebih kesalahan menyebabkan \ / / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Sebuah chunk abort tiba -tiba menutup asosiasi. Digunakan saat satu sisi memasuki keadaan kesalahan. Mengakhiri dengan anggun menggunakan koneksi menggunakan potongan shutdown.
Shutdown Chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 7 | Bendera chunk | Panjang = 8 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Kumulatif TSN ACK | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk shutdown memulai shutdown anggun dari asosiasi SCTP. Setiap agen menginformasikan remote dari TSN terakhir yang dikirim. Ini memastikan bahwa tidak ada paket yang hilang. WebRTC tidak’t melakukan penutupan yang anggun dari asosiasi sctp. Anda perlu merobohkan setiap saluran data sendiri untuk menanganinya dengan anggun.
Kumulatif tsn ack adalah tsn terakhir yang dikirim. Masing -masing pihak tahu untuk tidak berakhir sampai mereka menerima potongan data dengan TSN ini.
Kesalahan Chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Ketik = 9 | Bendera chunk | Panjang | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ \ / satu atau lebih kesalahan penyebab / \ \ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Potongan kesalahan digunakan untuk memberi tahu agen SCTP jarak jauh bahwa kesalahan non-fatal telah terjadi.
Maju TSN Chunk #
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Tipe = 192 | Bendera = 0x00 | Panjang = variabel | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| TSN Kumulatif Baru | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| Stream-1 | Urutan stream-1 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\ / / \++-+-+-+-+-+-+-+-+-+--+-- +-+-+-+-+-+-+| Stream-n | Urutan stream-n | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Chunk TSN maju menggerakkan TSN global ke depan. Sctp melakukan ini, sehingga Anda dapat melewatkan beberapa paket yang Anda tidak’t peduli lagi. Membiarkan’S bilang Anda mengirim 10 11 12 13 14 15 dan paket -paket ini hanya berlaku jika semuanya tiba. Data ini juga sensitif real-time, jadi jika tiba terlambat’t berguna.
Jika Anda kalah 12 dan 13 tidak ada alasan untuk mengirim 14 dan 15 ! SCTP menggunakan potongan TSN maju untuk mencapainya. Itu memberi tahu penerima bahwa 14 dan 15 aren’T akan dikirim lagi.
TSN Kumulatif Baru Ini adalah TSN baru dari koneksi. Paket apa pun sebelum TSN ini tidak akan dipertahankan.
Urutan stream dan aliran digunakan untuk melompati nomor urutan aliran angka di depan. Rujuk kembali ke potongan data untuk pentingnya bidang ini.
Mesin Negara Bagian #
Ini adalah beberapa bagian menarik dari mesin status SCTP. WebRTC tidak’t Gunakan semua fitur mesin status SCTP, jadi kami telah mengecualikan bagian -bagian itu. Kami juga telah menyederhanakan beberapa komponen untuk membuat mereka dapat dimengerti sendiri.
Aliran Pembentukan Koneksi #
Potongan init dan init ACK digunakan untuk bertukar kemampuan dan konfigurasi masing -masing rekan. SCTP menggunakan cookie selama jabat tangan untuk memvalidasi rekan yang berkomunikasi dengannya. Ini untuk memastikan bahwa jabat tangan tidak dicegat dan untuk mencegah serangan DOS.
Init Ack Chunk berisi cookie. Cookie kemudian dikembalikan ke penciptanya menggunakan Cookie Echo . Jika verifikasi cookie berhasil, cookie ACK dikirim dan potongan data siap untuk ditukar.
Aliran Teardown Koneksi #
SCTP menggunakan chunk shutdown. Saat agen menerima potongan shutdown, ia akan menunggu sampai menerima TSN ACK kumulatif yang diminta . Ini memungkinkan pengguna untuk memastikan bahwa semua data dikirimkan meskipun koneksi lossy.
Mekanisme Keep-Seive #
SCTP menggunakan permintaan detak jantung dan potongan detak jantung untuk menjaga koneksi tetap hidup. Ini dikirim pada interval yang dapat dikonfigurasi. Sctp juga melakukan backoff eksponensial jika paket hasn’t tiba.
Potongan detak jantung juga berisi nilai waktu. Ini memungkinkan dua asosiasi untuk menghitung waktu perjalanan antara dua agen.