Consistent overhead byte stuffing
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. Podstawową zaletą algorytmu jest znikomy narzut zwiększający rozmiar zakodowanych danych. Głównym zastosowaniem algorytmu jest wspomaganie pakietyzacji strumienia danych w transmisji szeregowej.
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. 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 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.1]. Każda ramka zawiera znaczniki, które jednoznacznie pozwalają określić jej początek i koniec[7.1][8.1]. 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][8.2]. 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[1.1]. Polegają one głównie na podmianie każdego bajtu mającego specjalne znaczenie przez odpowiednie zastąpienie sekwencją dwóch bajtów[1.2]. 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[1.3].
W proponowanym algorytmie narzut związany z eliminacją wartości zarezerwowanych nie przekracza 1 bajta na każde 254 bajty danych[1.4].
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[1.5].
Kody
[edytuj | edytuj kod]Do reprezentacji wartości oryginalnego ciągu COBS używa następujących kodów[1.5]:
| 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[1.5].
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[1.5]. 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[1.5]. Po zakodowaniu w wyjściowym strumieniu danych nie ma wartości zero, które można jednoznacznie wykorzystać do wskazania granic między pakietami[1.5].
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.
| 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 |
| 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 |
| 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 |
| dane | |
|---|---|
| kod | 01 |
| dane | 00 | |
|---|---|---|
| kod | 01 | 01 |
Własności
[edytuj | edytuj kod]- Bardzo mały narzut na rozmiar danych po kodowaniu[10.1].
- Bardzo prosta synchronizacja[10.1].
- Kodowanie wymaga bufora o rozmiarze 254 bajtów[10.2]
- Trywialna implementacja w każdym języku programowania[11]
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[9].
- Ciąg zerowych bajtów może być więc wykorzystany jako wypełnienie jeżeli brakuje danych do transmisji[10.3].
- 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[12].
- Algorytm COBS może być dobrym wyborem w przypadku implementacji pakietyzacji przy połączeniach z wykorzystaniem protokołu TCP[13].
- Algorytm nie jest powszechnie stosowany w praktyce[10.2]. Jednym z powodów może być brak oficjalnego wsparcia w ramach standardu PPP[14].
- 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[15].
- W przypadku obsługi pakietów o niewielkich rozmiarach, stały jednobajtowy narzut może być odbierany jako znaczny[16]. Dla pakietów jednobajtowych narzut stanowi 100%, a dla czterobajtowych 25% oryginalnej wiadomości[6.2].
Uwagi
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]- ↑ Stuart Cheshire, Mary Baker, Consistent Overhead Byte Stuffing, „ACM SIGCOMM '97”, Cannes 1997, DOI: 10.1145/263105.263168 (ang.).
- ↑ 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.).
- ↑ Stuart David Cheshire, Consistent Overhead Byte Stuffing, marzec 1998, OCLC 82593294 [dostęp 2024-04-28] (ang.).
- ↑ Stuart Cheshire, Mary Baker, Consistent Overhead Byte Stuffing, „IEEE/ACM TRANSACTIONS ON NETWORKING”, 7 (2), IEEE, 1999, s. 159-172, DOI: 10.1109/90.769765 (ang.).
- ↑ 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, 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.).
- ↑ Enrico Ronconi 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.).
- ↑ E.A. Jakubajtis, Lokalne sieci komputerowe, Warszawa: WNT, 1989, ISBN 83-204-1079-7.
- ↑ Wojciech Mielczarek, Szeregowe interfejsy cyfrowe, Warszawa: Helion, 1993, ISBN 83-85701-23-0.
- ↑ 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.).
- ↑ Vladimir Oksman, Overview of different encapsulation technologies, IEEE, lipiec 2002 [dostęp 2024-04-28] (ang.).
- ↑ 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.).
- ↑ Rolando Herrero, Fundamentals of IoT Communication Technologies, Springer, 2021, s. 50, ISBN 978-3-030-70080-5 (ang.).
- ↑ Mike Ash, The Complete Friday Q&A, t. III, Lulu.com, 2017, s. 264 (ang.).
- ↑ Pravin Bhagwat, Chatschik Bisdikian, Ibrahim Korpeoglu, Mahmoud Naghshineh, Statish K. Tripathi, Cordless Dialup Networking for Palmtop Computers [online], luty 1999, s. 8, IBM RC 21404(96651).
- ↑ 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.).
- ↑ Jaime S. Cardoso, Bandwidth-efficient byte stuffing, „IEEE International Conference on Communications”, 2007, s. 1.
- ↑ 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].
- ↑ overhead, [w:] Informatyczny Słownik Angielsko-Polski [online], ComputerWorld [dostęp 2024-04-28] (pol.).
- ↑ byte stuffing, [w:] Informatyczny Słownik Angielsko-Polski [online], ComputerWorld [dostęp 2024-04-28] (pol.).
Linki zewnętrzne
[edytuj | edytuj kod]- Consistent Overhead Byte Stuffing (COBS) Encoder/Decoder [online], crccalc.com [dostęp 2024-04-28], [kalkulator].