Consistent overhead byte stuffing (COBS) – algorytm kodowania ciągu liczb (zwykle bajtów) w postaci ciągu, w którym nie występuje jeden wyróżniony symbol (zwykle zero). Jego pomysłodawcą i autorem jest Stuart David Cheshire(inne języki). Podstawową zaletą algorytmu jest znikomy narzut zwiększający rozmiar zakodowanych danych. Głównym zastosowaniem algorytmu jest wspomaganie pakietyzacji strumienia danych w transmisji szeregowej.
Historia
Prezentacja algorytmu miała miejsce na konferencji SIGCOMM poświęconej zagadnieniom komunikacyjnym jak również został on zgłoszony jako propozycja do wykorzystania w protokole PPP. Algorytm kodowania był tematem pracy doktorskiej, którą Stuart David Cheshire(inne języki) przedłożył na Uniwersytecie Stanforda w 1998. Rok później artykuł z opisem algorytmu został opublikowany czasopiśmie organizacji IEEE. W 2020 zaadaptowano wykorzystanie algorytmu dla półbajtów. W 2022 roku zauważono, że w sprzyjających okolicznościach działanie algorytmu można przeprowadzić równolegle na fragmentach danych co znacznie skraca czas przetwarzania zwłaszcza w realizacji sprzętowej.
Motywacja
W transmisji danych z wykorzystaniem łącza szeregowego w warstwie fizycznej warstwa łącza danych tworzy ramki, które kapsułkują dane z wyższej warstwy. Każda ramka zawiera znaczniki, które jednoznacznie pozwalają określić jej początek i koniec. W systemach opartych na transmisji danych w postaci ciągów tekstowych znacznik startu to jeden ze znaków, który nie jest używany w kodowaniu danych. W przypadku, gdy łącze danych ma przesyłać dowolne dane binarne, może się zdarzyć, że wśród nich pojawią się takie, które będą przyjmowały wartości tożsame z używanymi do rozpoznawania początku i końca ramki. Aby uniknąć takich kolizji stosowane są metody pozwalające na ich eliminację ze strumienia danych. Za przykład można wskazać SLIP lub PPP. Polegają one głównie na podmianie każdego bajtu mającego specjalne znaczenie przez odpowiednie zastąpienie sekwencją dwóch bajtów. Jeśli nastąpi próba wysłania danych składających się z samych „zarezerwowanych” wartości, to w takim przypadku długość danych do przesłania w warstwie fizycznej ulegnie podwojeniu.
W proponowanym algorytmie narzut związany z eliminacją wartości zarezerwowanych nie przekracza 1 bajta na każde 254 bajty danych.
Opis
W wersji podstawowej algorytm skupia się na sposobie zapisu ciągu liczb z pełnego zakresu liczb ośmiobitowych od 0 do 255 na odpowiadający mu ciąg liczb z zakresu od 1 do 255. Jeśli zachodzi konieczność eliminacji wartości innej niż zero, to można wszystkie bajty wyniku zamienić wykonując na nich funkcję XOR z wartością do usunięcia.
Kody
Do reprezentacji wartości oryginalnego ciągu COBS używa następujących kodów:
dowolny niezerowy bajt danych + bajt o wartości zero
03 XX XX
XX XX 00
dowolne dwa niezerowe bajty danych + bajt o wartości zero
nn XX … XX
XX … XX 00
(nn-1) niezerowych bajtów danych + bajt o wartości zero
FE XX … XX
XX … XX 00
253 niezerowe bajty danych + bajt o wartości zero
FF XX … XX
XX … XX
254 niezerowe bajty danych, po których nie ma bajtu o wartości zero
W powyższym zestawieniu kodów nie istnieje wartość 00, która jest niedozwolona.
Kodowanie
Ciąg wejściowy o dowolnej długości dzielony jest na fragmenty nie dłuższe niż 254 bajty, w których bajt o wartości zero występuje dokładnie na końcu. Jest on zastępowany w ciągu wyjściowym odpowiadającym mu kodem z domyślnym zerem. Jeśli taki podciąg nie istnieje to w jego miejsce jest wstawiany wyjątek zaczynający się kodem 255, który pozwala na kodowanie długich bezzerowych ciągów danych. Wyjątek stanowi również ostatni fragment nie dłuższy niż 253 bajty, który domyślnie zakłada istnienie wirtualnego zera tuż za ostatnim bajtem pakietu. Po zakodowaniu w wyjściowym strumieniu danych nie ma wartości zero, które można jednoznacznie wykorzystać do wskazania granic między pakietami.
Przykłady
Pusta kratka na końcu to wirtualne zero. Pogrubiona czcionka oznacza pierwszy bajt kodu. Wielokropek to ciąg niezerowych wartości.
Oryginalny przykład ze specyfikacji
dane
45
00
00
2C
4C
79
00
00
40
06
4F
37
kod
02
45
01
04
2C
4C
79
01
05
40
06
4F
37
Ciąg z sekwencją niezerowych bajtów od pozycji 9 do 264
pozycja
1
2
3
4
5
6
7
8
…
263
264
265
266
dane
44
69
6C
65
00
00
74
00
…
54
61
—
kod
05
44
69
6C
65
01
02
74
FF
…
03
54
61
Ciąg z sekwencją 254 niezerowych bajtów na końcu
pozycja
1
2
3
4
5
6
7
…
258
259
260
dane
F0
9F
8D
86
00
F0
9F
…
92
A6
—
kod
05
F0
9F
8D
86
FF
F0
9F
…
92
A6
Pusty pakiet
dane
kod
01
Bajt zero
dane
00
kod
01
01
Własności
Bardzo mały narzut na rozmiar danych po kodowaniu.
Strumień danych zakodowanych algorytmem COBS dzielony jest na pakiety w miejscu napotkania wartości specjalnej 0x00. Zachowanie na okoliczność występowania sekwencji zer w takim ciągu nie jest zdefiniowane. Jednym z rozwiązań jest przyjęcie, że oznacza ona brak pakietu.
Ciąg zerowych bajtów może być więc wykorzystany jako wypełnienie jeżeli brakuje danych do transmisji.
Protokół MS/TP, używany jako warstwa łącza danych w transmisji po RS-485 w protokole BACnet, stosuje algorytm COBS do eliminacji wartości specjalnej 0x55 z bloku danych i sumy kontrolnej. Sekwencja bajtów 0x550xFF oznacza w nim początek nowej ramki.
Algorytm COBS może być dobrym wyborem w przypadku implementacji pakietyzacji przy połączeniach z wykorzystaniem protokołu TCP.
Algorytm nie jest powszechnie stosowany w praktyce. Jednym z powodów może być brak oficjalnego wsparcia w ramach standardu PPP.
Algorytm operuje na buforach danych, wobec czego nie może być stosowany w przypadku gdy oczekiwane jest natychmiastowe generowanie danych wyjściowych w przetwarzaniu potokowym.
W przypadku obsługi pakietów o niewielkich rozmiarach, stały jednobajtowy narzut może być odbierany jako znaczny. Dla pakietów jednobajtowych narzut stanowi 100%, a dla czterobajtowych 25% oryginalnej wiadomości.
↑AdewaleA.AdetomiAdewaleA., GodwinG.EnemaliGodwinG., TughrulT.ArslanTughrulT., Enabling Dynamic Communication for Runtime Circuit Relocation, „IEEE Transactions on Very Large Scale Integration (VLSI) Systems”, 28 (1), 2020, s. 142-155, DOI:10.1109/TVLSI.2019.2934927, Cytat: Adopting a similar technique to map the hex number set [0, F] to [1, F], we reserve the number zero to be used as the delimiter(ang.).
↑EnricoE.RonconiEnricoE. i inni, Multi-COBS: A Novel Algorithm for Byte Stuffing at High Throughput, „IEEE Access”, 2022, s. 78848-78859, DOI:10.1109/ACCESS.2022.3194265(ang.).
↑PravinP.BhagwatPravinP., ChatschikCh.BisdikianChatschikCh., IbrahimI.KorpeogluIbrahimI., MahmoudM.NaghshinehMahmoudM., Statish K.S.K.TripathiStatish K.S.K., Cordless Dialup Networking for Palmtop Computers [online], luty 1999, s. 8, IBM RC 21404(96651).
↑MunM.Wai YuenMunM., Ethernet encapsulation and emulation for DVB/MPEG multimedia wireless systems: base station and subscriber interface VHDL designs, wrzesień 2005, s. 87, ISBN978-1-369-31445-8(ang.).