Data Communication

Data Communication #

Apa yang saya dapatkan dari komunikasi data WebRTC? #

WebRTC menyediakan data channel untuk komunikasi data. Antara dua peer Anda dapat membuka 65.534 data channel. Data channel berbasis datagram, dan masing-masing memiliki pengaturan daya tahan sendiri. Secara default, setiap data channel memiliki pengiriman berurutan yang dijamin.

Jika Anda mendekati WebRTC dari latar belakang media, data channel mungkin tampak boros. Mengapa saya memerlukan seluruh subsistem ini ketika saya bisa menggunakan HTTP atau WebSocket?

Kekuatan sebenarnya dengan data channel adalah Anda dapat mengonfigurasinya untuk berperilaku seperti UDP dengan pengiriman tidak berurutan/lossy. Ini diperlukan untuk situasi latensi rendah dan kinerja tinggi. Anda dapat mengukur backpressure dan memastikan Anda hanya mengirim sebanyak yang didukung jaringan Anda.

Bagaimana cara kerjanya? #

WebRTC menggunakan Stream Control Transmission Protocol (SCTP), didefinisikan dalam RFC 4960. SCTP adalah protokol lapisan transpor 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 stream dan setiap stream dapat dikonfigurasi secara independen. Data channel WebRTC hanyalah abstraksi tipis di sekitarnya. Pengaturan sekitar daya tahan dan pengurutan hanya diteruskan langsung ke Agent SCTP.

Data channel memiliki beberapa fitur yang tidak dapat diekspresikan oleh SCTP, seperti label channel. Untuk mengatasi itu WebRTC menggunakan Data Channel Establishment Protocol (DCEP) yang didefinisikan dalam RFC 8832. DCEP mendefinisikan pesan untuk mengomunikasikan label channel dan protokol.

DCEP #

DCEP hanya memiliki dua pesan DATA_CHANNEL_OPEN dan DATA_CHANNEL_ACK. Untuk setiap data channel yang dibuka, remote harus merespons dengan ack.

DATA_CHANNEL_OPEN #

Pesan ini dikirim oleh Agent WebRTC yang ingin membuka channel.

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Message Type |  Channel Type |            Priority           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Reliability Parameter                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Label Length          |       Protocol Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               \
/                             Label                             /
\                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               \
/                            Protocol                           /
\                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Message Type #

Message Type adalah nilai statis 0x03.

Channel Type #

Channel Type mengontrol atribut daya tahan/pengurutan dari channel. Ini mungkin memiliki nilai berikut:

  • 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 tiba tidak berurutan.
  • 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 tidak berurutan.
  • DATA_CHANNEL_PARTIAL_RELIABLE_TIMED (0x02) - Pesan mungkin hilang jika mereka tidak 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 tiba dalam jumlah waktu yang diminta dan mungkin tiba tidak berurutan.

Priority #

Prioritas dari data channel. Data channel yang memiliki prioritas lebih tinggi akan dijadwalkan terlebih dahulu. Pesan pengguna prioritas rendah yang besar tidak akan menunda pengiriman pesan pengguna prioritas lebih tinggi.

Reliability Parameter #

Jika tipe data channel adalah DATA_CHANNEL_PARTIAL_RELIABLE, akhiran mengonfigurasi perilaku:

  • REXMIT - Mendefinisikan berapa kali pengirim akan mengirim ulang pesan sebelum menyerah.
  • TIMED - Mendefinisikan berapa lama waktu (dalam ms) pengirim akan mengirim ulang pesan sebelum menyerah.

Label #

String yang dikode UTF-8 yang berisi nama data channel. String ini mungkin kosong.

Protocol #

Jika ini adalah string kosong, protokol tidak ditentukan. Jika itu adalah string yang tidak kosong, itu harus menentukan protokol yang terdaftar dalam “WebSocket Subprotocol Name Registry”, didefinisikan dalam RFC 6455.

DATA_CHANNEL_ACK #

Pesan ini dikirim oleh Agent WebRTC untuk mengakui bahwa data channel 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Message Type |
+-+-+-+-+-+-+-+-+

Stream Control Transmission Protocol #

SCTP adalah kekuatan sebenarnya di balik data channel WebRTC. Ini menyediakan semua fitur data channel ini:

  • Multiplexing
  • Pengiriman andal menggunakan mekanisme retransmisi seperti TCP
  • Opsi keandalan parsial
  • Congestion Avoidance
  • Flow Control

Untuk memahami SCTP kita akan menjelajahinya dalam tiga bagian. Tujuannya adalah Anda akan tahu cukup untuk men-debug dan mempelajari detail mendalam SCTP sendiri setelah bab ini.

Konsep #

SCTP adalah protokol yang kaya fitur. Bagian ini hanya akan membahas bagian-bagian SCTP yang digunakan oleh WebRTC. Fitur dalam SCTP yang tidak digunakan oleh WebRTC termasuk multi-homing dan path selection.

Dengan lebih dari dua puluh tahun pengembangan SCTP bisa sulit untuk sepenuhnya dipahami.

Association #

Association adalah istilah yang digunakan untuk Sesi SCTP. Ini adalah state yang dibagikan antara dua Agent SCTP saat mereka berkomunikasi.

Streams #

Stream adalah satu urutan data pengguna dua arah. Ketika Anda membuat data channel, Anda sebenarnya hanya membuat stream SCTP. Setiap Association SCTP berisi daftar stream. Setiap stream dapat dikonfigurasi dengan jenis keandalan yang berbeda.

WebRTC hanya memungkinkan Anda mengonfigurasi saat pembuatan stream, tetapi SCTP sebenarnya memungkinkan mengubah konfigurasi kapan saja.

Berbasis Datagram #

SCTP membingkai data sebagai datagram dan bukan sebagai byte stream. Mengirim dan menerima data terasa seperti menggunakan UDP daripada TCP. Anda tidak perlu menambahkan kode tambahan untuk mentransfer beberapa file melalui satu stream.

Pesan SCTP tidak memiliki batas ukuran seperti UDP. Satu pesan SCTP bisa berukuran beberapa gigabyte.

Chunks #

Protokol SCTP terdiri dari chunk. Ada banyak jenis chunk yang berbeda. Chunk ini digunakan untuk semua komunikasi. Data pengguna, inisialisasi koneksi, congestion control, dan lainnya semuanya dilakukan melalui chunk.

Setiap paket SCTP berisi daftar chunk. Jadi dalam satu paket UDP Anda dapat memiliki beberapa chunk yang membawa pesan dari stream yang berbeda.

Transmission Sequence Number #

Transmission Sequence Number (TSN) adalah pengidentifikasi unik global untuk chunk DATA. Chunk DATA adalah yang membawa semua pesan yang ingin dikirim pengguna. TSN penting karena membantu penerima menentukan apakah paket hilang atau tidak berurutan.

Jika penerima menyadari TSN yang hilang, ia tidak memberikan data kepada pengguna sampai dipenuhi.

Stream Identifier #

Setiap stream memiliki pengidentifikasi unik. Ketika Anda membuat data channel dengan ID eksplisit, itu sebenarnya hanya diteruskan langsung ke SCTP sebagai stream identifier. Jika Anda tidak memberikan ID, stream identifier dipilih untuk Anda.

Payload Protocol Identifier #

Setiap chunk DATA juga memiliki Payload Protocol Identifier (PPID). Ini digunakan untuk mengidentifikasi secara unik 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 panjang 0.
  • WebRTC Binary Empty (57) - Pesan biner DataChannel dengan panjang 0.

Protokol #

Berikut adalah beberapa chunk yang digunakan oleh protokol SCTP. Ini bukan demonstrasi lengkap. Ini memberikan cukup struktur agar state machine masuk akal.

Setiap Chunk dimulai dengan bidang type. Sebelum daftar chunk, 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 0    | Reserved|U|B|E|    Length                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              TSN                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Stream Identifier        |   Stream Sequence Number      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Payload Protocol Identifier                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               \
/                            User Data                          /
\                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk DATA adalah bagaimana semua data pengguna dipertukarkan. Ketika Anda mengirim apa pun melalui data channel, ini adalah cara pertukaran.

Bit U disetel jika ini adalah paket tidak berurutan. Kita dapat mengabaikan Stream Sequence Number.

B dan E adalah bit awal dan akhir. Jika Anda ingin mengirim pesan yang terlalu besar untuk satu chunk DATA, ia perlu difragmentasi menjadi beberapa chunk DATA yang dikirim dalam paket terpisah. Dengan bit B dan E dan Sequence Number SCTP dapat mengekspresikan ini.

  • B=1, E=0 - Bagian pertama dari pesan pengguna yang terfragmentasi.
  • B=0, E=0 - Bagian tengah dari pesan pengguna yang terfragmentasi.
  • B=0, E=1 - Bagian terakhir dari pesan pengguna yang terfragmentasi.
  • B=1, E=1 - Pesan yang tidak terfragmentasi.

TSN adalah Transmission Sequence Number. Ini adalah pengidentifikasi unik global untuk chunk DATA ini. Setelah 4.294.967.295 chunk ini akan kembali ke 0. TSN ditambah untuk setiap chunk dalam pesan pengguna yang terfragmentasi sehingga penerima tahu cara mengurutkan chunk yang diterima untuk merekonstruksi pesan asli.

Stream Identifier adalah pengidentifikasi unik untuk stream tempat data ini berada.

Stream Sequence Number adalah angka 16-bit yang ditambah setiap pesan pengguna dan disertakan dalam header chunk pesan DATA. Setelah 65535 pesan ini akan kembali ke 0. Angka ini digunakan untuk memutuskan urutan pengiriman pesan ke penerima jika U disetel ke 0. Mirip dengan TSN, kecuali Stream Sequence Number hanya ditambah untuk setiap pesan secara keseluruhan dan bukan setiap chunk DATA individual.

Payload Protocol Identifier adalah jenis data yang mengalir melalui stream ini. Untuk WebRTC, itu akan menjadi DCEP, String atau Binary.

User Data adalah apa yang Anda kirim. Semua data yang Anda kirim melalui data channel WebRTC ditransmisikan melalui chunk 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 1    |  Chunk Flags  |      Chunk Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Initiate Tag                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Advertised Receiver Window Credit (a_rwnd)          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Number of Outbound Streams   |  Number of Inbound Streams    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Initial TSN                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               \
/              Optional/Variable-Length Parameters              /
\                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk INIT memulai proses pembuatan association.

Initiate Tag digunakan untuk pembuatan cookie. Cookie digunakan untuk perlindungan Man-In-The-Middle dan Denial of Service. Mereka dijelaskan lebih detail di bagian state machine.

Advertised Receiver Window Credit digunakan untuk Congestion Control SCTP. Ini mengomunikasikan seberapa besar buffer yang dialokasikan penerima untuk association ini.

Number of Outbound/Inbound Streams memberi tahu remote berapa banyak stream yang didukung agent ini.

Initial TSN adalah uint32 acak untuk memulai TSN lokal.

Optional Parameters memungkinkan SCTP 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 3    |Chunk  Flags   |      Chunk Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Cumulative TSN Ack                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Advertised Receiver Window Credit (a_rwnd)           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of Gap Ack Blocks = N  |  Number of Duplicate TSNs = X |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Gap Ack Block #1 Start       |   Gap Ack Block #1 End        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                                                               /
\                              ...                              \
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Gap Ack Block #N Start      |  Gap Ack Block #N End         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Duplicate TSN 1                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                                                               /
\                              ...                              \
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Duplicate TSN X                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk SACK (Selective Acknowledgment) adalah bagaimana penerima memberi tahu pengirim bahwa ia telah mendapatkan paket. Sampai pengirim mendapat SACK untuk TSN ia akan mengirim ulang chunk DATA yang dimaksud. SACK melakukan lebih dari sekedar memperbarui TSN.

Cumulative TSN ACK TSN tertinggi yang telah diterima.

Advertised Receiver Window Credit ukuran buffer penerima. Penerima mungkin mengubah ini selama sesi jika lebih banyak memori menjadi tersedia.

Ack Blocks TSN yang telah diterima setelah Cumulative TSN ACK. Ini digunakan jika ada kesenjangan dalam paket yang dikirim. Katakanlah chunk DATA dengan TSN 100, 102, 103 dan 104 dikirim. Cumulative TSN ACK akan menjadi 100, tetapi Ack Blocks dapat digunakan untuk memberi tahu pengirim bahwa ia tidak perlu mengirim ulang 102, 103 atau 104.

Duplicate TSN menginformasikan pengirim bahwa ia telah menerima chunk DATA berikut lebih dari sekali.

HEARTBEAT 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 4    | Chunk  Flags  |      Heartbeat Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               \
/            Heartbeat Information TLV (Variable-Length)        /
\                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk HEARTBEAT digunakan untuk menegaskan remote masih merespons. Berguna jika Anda tidak mengirim chunk DATA apa pun dan perlu menjaga mapping NAT tetap terbuka.

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 6    |Reserved     |T|           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/                                                               /
\               Zero or more Error Causes                       \
/                                                               /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk ABORT menutup association secara tiba-tiba. Digunakan ketika satu sisi memasuki state kesalahan. Mengakhiri koneksi dengan anggun menggunakan chunk 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 7    | Chunk  Flags  |      Length = 8               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Cumulative TSN Ack                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk SHUTDOWN memulai penutupan anggun dari association SCTP. Setiap agent menginformasikan remote tentang TSN terakhir yang dikirimnya. Ini memastikan bahwa tidak ada paket yang hilang. WebRTC tidak melakukan penutupan anggun dari association SCTP. Anda perlu merobohkan setiap data channel sendiri untuk menanganinya dengan anggun.

Cumulative TSN ACK adalah TSN terakhir yang dikirim. Setiap sisi tahu untuk tidak mengakhiri sampai mereka menerima chunk DATA dengan TSN ini.

ERROR 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 9    | Chunk  Flags  |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               \
/                    One or more Error Causes                   /
\                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk ERROR digunakan untuk memberi tahu Agent SCTP remote bahwa kesalahan non-fatal telah terjadi.

FORWARD 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Type = 192  |  Flags = 0x00 |        Length = Variable      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      New Cumulative TSN                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Stream-1              |       Stream Sequence-1       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
\                                                               /
/                                                               \
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Stream-N              |       Stream Sequence-N       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Chunk FORWARD TSN memindahkan TSN global ke depan. SCTP melakukan ini, sehingga Anda dapat melewati beberapa paket yang tidak Anda pedulikan lagi. Katakanlah Anda mengirim 10 11 12 13 14 15 dan paket-paket ini hanya valid jika mereka semua tiba. Data ini juga sensitif terhadap real-time, jadi jika tiba terlambat itu tidak berguna.

Jika Anda kehilangan 12 dan 13 tidak ada alasan untuk mengirim 14 dan 15! SCTP menggunakan chunk FORWARD TSN untuk mencapai itu. Ini memberi tahu penerima bahwa 14 dan 15 tidak akan dikirim lagi.

New Cumulative TSN ini adalah TSN baru dari koneksi. Setiap paket sebelum TSN ini tidak akan dipertahankan.

Stream dan Stream Sequence digunakan untuk melompat Stream Sequence Number nomor ke depan. Rujuk kembali ke DATA Chunk untuk signifikansi bidang ini.

State Machine #

Ini adalah beberapa bagian menarik dari state machine SCTP. WebRTC tidak menggunakan semua fitur state machine SCTP, jadi kami telah mengecualikan bagian-bagian itu. Kami juga telah menyederhanakan beberapa komponen untuk membuatnya dapat dipahami sendiri.

Connection Establishment Flow #

Chunk INIT dan INIT ACK digunakan untuk bertukar kemampuan dan konfigurasi dari setiap peer. SCTP menggunakan cookie selama handshake untuk memvalidasi peer yang berkomunikasi dengannya. Ini untuk memastikan bahwa handshake tidak dicegat dan untuk mencegah serangan DoS.

Chunk INIT ACK berisi cookie. Cookie kemudian dikembalikan ke pembuatnya menggunakan COOKIE ECHO. Jika verifikasi cookie berhasil, COOKIE ACK dikirim dan chunk DATA siap untuk dipertukarkan.

Connection establishment

Connection Teardown Flow #

SCTP menggunakan chunk SHUTDOWN. Ketika agent menerima chunk SHUTDOWN ia akan menunggu sampai ia menerima Cumulative TSN ACK yang diminta. Ini memungkinkan pengguna untuk memastikan bahwa semua data dikirim bahkan jika koneksi lossy.

Keep-Alive Mechanism #

SCTP menggunakan Chunk HEARTBEAT REQUEST dan HEARTBEAT ACK untuk menjaga koneksi tetap hidup. Ini dikirim pada interval yang dapat dikonfigurasi. SCTP juga melakukan exponential backoff jika paket belum tiba.

Chunk HEARTBEAT juga berisi nilai waktu. Ini memungkinkan dua association menghitung waktu perjalanan antara dua agent.