Przejdź do zawartości

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

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

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].
  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]
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy