Consistent overhead byte stuffing

Z Wikipedii, wolnej encyklopedii

Consistent overhead byte stuffing[a] (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[edytuj | edytuj kod]

Prezentacja algorytmu miała miejsce na konferencji SIGCOMM poświęconej zagadnieniom komunikacyjnym[1] jak również został on zgłoszony jako propozycja do wykorzystania w protokole PPP[2]. Algorytm kodowania był tematem pracy doktorskiej, którą Stuart David Cheshire(inne języki) przedłożył na Uniwersytecie Stanforda w 1998[3]. Rok później artykuł z opisem algorytmu został opublikowany czasopiśmie organizacji IEEE[4]. W 2020 zaadaptowano wykorzystanie algorytmu dla półbajtów[5]. 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[6].

Motywacja[edytuj | edytuj kod]

W transmisji danych z wykorzystaniem łącza szeregowego w warstwie fizycznej warstwa łącza danych tworzy ramki, które kapsułkują dane z wyższej warstwy[7]. Każda ramka zawiera znaczniki, które jednoznacznie pozwalają określić jej początek i koniec[7][8]. 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[b][9]. 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[10]. Polegają one głównie na podmianie każdego bajtu mającego specjalne znaczenie przez odpowiednie zastąpienie sekwencją dwóch bajtów[11]. 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[12].

W proponowanym algorytmie narzut związany z eliminacją wartości zarezerwowanych nie przekracza 1 bajta na każde 254 bajty danych[13].

Opis[edytuj | edytuj kod]

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[14].

Kody[edytuj | edytuj kod]

Do reprezentacji wartości oryginalnego ciągu COBS używa następujących kodów[14]:

Kod (hex) Znaczenie Opis
01 00 bajt o wartości zero
02 XX XX 00 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[14].

Kodowanie[edytuj | edytuj kod]

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[14]. 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[14]. Po zakodowaniu w wyjściowym strumieniu danych nie ma wartości zero, które można jednoznacznie wykorzystać do wskazania granic między pakietami[14].

Przykłady[edytuj | edytuj kod]

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[15]
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[16]
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[16]
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[17]
dane
kod 01
Bajt zero
dane 00
kod 01 01

Własności[edytuj | edytuj kod]

  • Bardzo mały narzut na rozmiar danych po kodowaniu[18].
  • Bardzo prosta synchronizacja[18].
  • Kodowanie wymaga bufora o rozmiarze 254 bajtów[19]
  • Trywialna implementacja w każdym języku programowania[20]

Obserwacje[edytuj | edytuj kod]

  • 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[17].
  • Ciąg zerowych bajtów może być więc wykorzystany jako wypełnienie jeżeli brakuje danych do transmisji[21].
  • 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 0x55 0xFF oznacza w nim początek nowej ramki[22].
  • Algorytm COBS może być dobrym wyborem w przypadku implementacji pakietyzacji przy połączeniach z wykorzystaniem protokołu TCP[23].
  • Algorytm nie jest powszechnie stosowany w praktyce[19]. Jednym z powodów może być brak oficjalnego wsparcia w ramach standardu PPP[24].
  • 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[25].
  • W przypadku obsługi pakietów o niewielkich rozmiarach, stały jednobajtowy narzut może być odbierany jako znaczny[26]. Dla pakietów jednobajtowych narzut stanowi 100%, a dla czterobajtowych 25% oryginalnej wiadomości[27].

Uwagi[edytuj | edytuj kod]

  1. Literalnie Niesprzeczne[28] nagłówkowe[29] dopełnianie bajtowe[30].
  2. Na przykład w systemie Modbus jest to dwukropek[9].

Przypisy[edytuj | edytuj kod]

  1. Cheshire i Baker 1997 ↓.
  2. J. Carlson, S. Cheshire, M. Baker, PPP Consistent Overhead Byte Stuffing (COBS) [online], Internet Draft, ietf.org, listopad 1997 [dostęp 2024-04-28] (ang.).
  3. Cheshire 1998 ↓.
  4. Cheshire i Baker 1999 ↓.
  5. Adewale Adetomi, Godwin Enemali, Tughrul Arslan, Enabling Dynamic Communication for Runtime Circuit Relocation, „IEEE Transactions on Very Large Scale Integration (VLSI) Systems”, 28 (1), 2020, s. 142-155, DOI10.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.).
  6. Ronconi i in. 2022 ↓.
  7. a b Jakubajtis 1989 ↓, s. 112.
  8. Mielczarek 1993 ↓, s. 70-71, 81-82.
  9. a b Mielczarek 1993 ↓, s. 71.
  10. Cheshire i Baker 1997 ↓, s. 1.
  11. Cheshire i Baker 1997 ↓, s. 3.
  12. Cheshire i Baker 1997 ↓, s. 7.
  13. Cheshire i Baker 1997 ↓, s. 2.
  14. a b c d e f Cheshire i Baker 1997 ↓, s. 4.
  15. Cheshire i Baker 1997 ↓, s. 5.
  16. a b Ronconi i in. 2022 ↓, s. 78850 (3/12).
  17. a b Unexpected test result for test encoding of empty input #16, [w:] cobs.rs [online], github.com, 12 lipca 2022 [dostęp 2024-04-28] (ang.).
  18. a b Oksman 2002 ↓, slajdy 6 i 17.
  19. a b Oksman 2002 ↓, slajd 17.
  20. Keerat Singth, Implementing COBS ZPE in C#, „Proceedings of IRAJ International Conference”, Chennai, 26 października 2013, s. 6, ISBN 978-93-82702-34-4 [dostęp 2024-04-28] (ang.).
  21. Oksman 2002 ↓, slajd 6.
  22. Rolando Herrero, Fundamentals of IoT Communication Technologies, Springer, 2021, s. 50, ISBN 978-3-030-70080-5 (ang.).
  23. Mike Ash, The Complete Friday Q&A, t. III, Lulu.com, 2017, s. 264 (ang.).
  24. Pravin Bhagwat i inni, Cordless Dialup Networking for Palmtop Computers [online], luty 1999, s. 8, IBM RC 21404(96651).
  25. Mun Wai Yuen, Ethernet encapsulation and emulation for DVB/MPEG multimedia wireless systems: base station and subscriber interface VHDL designs, wrzesień 2005, s. 87, ISBN 978-1-369-31445-8 (ang.).
  26. Jaime S. Cardoso, Bandwidth-efficient byte stuffing, „IEEE International Conference on Communications”, 2007, s. 1.
  27. Ronconi i in. 2022 ↓, s. 78855 (8/12).
  28. consistent, [w:] Robert Szymula, PODRĘCZNY SŁOWNIK (ANGIELSKO-POLSKO-ROSYJSKI) TERMINÓW INFORMATYCZNYCH, Roman Hajczuk (red. nauk.), Białystok: Uniwersytet w Białymstoku, 2002, s. 57, ISBN 83-89031-29-9 [dostęp 2024-04-28].
  29. overhead, [w:] Informatyczny Słownik Angielsko-Polski [online], ComputerWorld [dostęp 2024-04-28] (pol.).
  30. byte stuffing, [w:] Informatyczny Słownik Angielsko-Polski [online], ComputerWorld [dostęp 2024-04-28] (pol.).

Bibliografia[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]