Doimiy baytlarni to'ldirish - Consistent Overhead Byte Stuffing - Wikipedia

Doimiy baytlarni to'ldirish (COBS) an algoritm samarali, ishonchli va aniq natijalarga olib keladigan ma'lumotlar baytlarini kodlash uchun paketlar hoshiyasi paket tarkibidan qat'i nazar, shuning uchun dasturlarni noto'g'ri tuzilgan paketlardan tiklashni osonlashtiradi. A funktsiyasini bajarish uchun ma'lum bir bayt qiymatini, odatda nolni ishlatadi paket ajratuvchi (paketlar orasidagi chegarani ko'rsatadigan maxsus qiymat). Nol ajratuvchi sifatida ishlatilganda, algoritm har bir nol ma'lumotlar baytini nolga teng bo'lmagan qiymat bilan almashtiradi, shunda paketda nol ma'lumotlar baytlari paydo bo'lmaydi va shu bilan paket chegaralari sifatida noto'g'ri talqin qilinadi.

Baytni to'ldirish "noqonuniy" yoki "zahiralangan" qiymatlarni (masalan, paket ajratuvchi) o'z ichiga olishi mumkin bo'lgan ma'lumotlar baytlarining ketma-ketligini ushbu qiymatlarning takrorlanishini o'z ichiga olmaydigan potentsial uzunroq ketma-ketlikka o'zgartiradigan jarayon. O'zgargan ketma-ketlikning qo'shimcha uzunligi odatda algoritmning ustki qismi deb ataladi. COBS algoritmi eng yomon yukni qattiq chegaralaydi va uni kamida bir baytgacha va maksimal ⌈ ga cheklaydi.n/ 254⌉ bayt (254 yilda bitta bayt, yaxlitlangan). Binobarin, kodlangan baytlar ketma-ketligini uzatish vaqti juda bashorat qilinadi, bu COBS-ni jitter muammoli bo'lishi mumkin bo'lgan real vaqt dasturlari uchun foydali qiladi. Algoritm hisoblashda arzon va uning o'rtacha xarajatlari boshqa aniq ramkalash algoritmlariga nisbatan past.[1][2]

Biroq, COBS 254 baytgacha talab qiladi qarash. Uning birinchi baytini uzatishdan oldin u birinchi nol baytning (agar mavjud bo'lsa) quyidagi 254 baytdagi holatini bilishi kerak.

Paketlarni hoshiyalash va to'ldirish

Paketlangan ma'lumotlar har qanday ketma-ket vositalar orqali yuborilganda, ba'zilari protokol paket chegaralarini belgilash uchun talab qilinadi. Bu ramka markeridan, paketlar orasidagi chegaralar qaerga tushishini ko'rsatadigan maxsus bit-ketma-ketlik yoki belgi qiymatidan foydalangan holda amalga oshiriladi. Ma'lumotlarni to'ldirish - bu paketlash ma'lumotlarini uzatilishidan oldin freymlash markerining barcha hodisalarini yo'q qilish uchun o'zgartiradigan jarayon, shuning uchun qabul qilgich markerni aniqlaganda, marker paketlar orasidagi chegarani ko'rsatishi mumkin.

COBS [0,255] oralig'idagi ixtiyoriy baytlar qatorini [1,255] oralig'idagi baytlarga o'zgartiradi. Ma'lumotlardan barcha nol baytlarni olib tashlagan holda, nol bayt endi o'zgartirilgan ma'lumotlarning oxirini aniq belgilash uchun ishlatilishi mumkin. Bu o'zgartirilgan ma'lumotlarga nol bayt qo'shish orqali amalga oshiriladi va shu bilan COBS tomonidan kodlangan ma'lumotlardan iborat paket hosil bo'ladi ( foydali yuk ) paketning oxirini aniq belgilash uchun.

(Boshqa har qanday bayt qiymati paketni ajratuvchi sifatida saqlanishi mumkin, ammo noldan foydalanish tavsifni soddalashtiradi.)

Doimiy to'ldirish (COBS) kodlash jarayoni

COBS kodlash jarayonini tavsiflashning ikkita teng usuli mavjud:

Oldindan blokirovka tavsifi
Ba'zi baytlarni kodlash uchun avval nol baytni qo'shib, so'ngra ularni 254 nol bo'lmagan bayt yoki 0-253 nol bo'lmagan baytdan keyin nol baytga bo'ling. Qo'shilgan nol bayt tufayli, bu har doim ham mumkin.
So'nggi nol baytni o'chirish (agar mavjud bo'lsa) va nolga teng bo'lmagan baytlar sonini qo'shib, har bir guruhni kodlash. Shunday qilib, har bir kodlangan guruh asl nusxasi bilan bir xil, faqat 254 nol bo'lmagan bayt 255 baytni 255 baytga oldindan belgilash orqali kodlanadi.
Maxsus istisno sifatida, agar paket 254 nol bo'lmagan bayt guruhi bilan tugasa, ortda qolgan nol baytni qo'shish shart emas. Bu ba'zi holatlarda bitta baytni tejaydi.
Bog'langan ro'yxat tavsifi
Dastlab, paketning boshiga nol bayt va har 254 nol bo'lmagan baytdan keyin qo'shiling. Ushbu kodlash shubhasiz qaytarilishi mumkin. To'liq 254 nol bo'lmagan bayt bilan tugaydigan bo'lsa, paketning oxiriga nol baytni kiritish shart emas.
Ikkinchidan, har bir nol baytni keyingi nol baytga yoki paketning oxiriga almashtirish bilan almashtiring. Birinchi bosqichda qo'shimcha nollar qo'shilganligi sababli, har bir ofset maksimal 255 ga teng bo'lishi kafolatlanadi.

Misollarni kodlash

Ushbu misollar COBS algoritmi bilan turli xil ma'lumotlar ketma-ketligini qanday kodlashini ko'rsatadi. Misollarda barcha baytlar quyidagicha ifodalangan o'n oltinchi kodlangan ma'lumotlar turli xil xususiyatlarni ko'rsatish uchun matnni formatlash bilan ko'rsatilgan:

  • Qalin kodlash orqali o'zgartirilmagan ma'lumotlar baytini bildiradi. Ma'lumotlarning nolga teng bo'lmagan barcha baytlari o'zgarishsiz qoladi.
  • Yashil kodlash orqali o'zgartirilgan ma'lumotlar nol baytini bildiradi. Barcha nol ma'lumotlar baytlari kodlash paytida quyidagi nol baytga almashtirish bilan almashtiriladi (ya'ni bittasi va undan keyin nol bo'lmagan baytlar soni). Bu sharhlashni talab qiladigan keyingi paket baytiga samarali ko'rsatgich: agar manzillangan bayt nolga teng bo'lmasa, u quyidagilar guruh sarlavhasi bayt nol ma'lumotlar bayti bu izohlashni talab qiladigan keyingi baytga ishora qiladi; agar manzillangan bayt nolga teng bo'lsa, u holda paketning oxiri.
  • Qizil yuqoridagi bayt bo'lib, u shuningdek guruh sarlavhasi bayt bo'lib, quyidagi guruhga ofsetni o'z ichiga oladi, ammo ma'lumotlar baytiga mos kelmaydi. Ular ikkita joyda: har bir kodlangan paketning boshida va 254 nol bo'lmagan baytning har bir guruhidan keyin paydo bo'ladi.
  • A ko'k Paketning oxirini ma'lumot qabul qiluvchiga ko'rsatish uchun har bir paketning oxirida nol bayt paydo bo'ladi. Ushbu paket ajratuvchi bayt COBS tarkibiga kirmaydi; bu kodlangan chiqishga qo'shilgan qo'shimcha ramka bayti.
MisolKodlanmagan ma'lumotlar (hex)COBS (hex) bilan kodlangan
10001 01 00
200 0001 01 01 00
311 22 00 3303 11 22 02 33 00
411 22 33 4405 11 22 33 44 00
511 00 00 0002 11 01 01 01 00
601 02 03 ... FD FEFF 01 02 03 ... FD FE 00
700 01 02 ... FC FD FE01 FF 01 02 ... FC FD FE 00
801 02 03 ... FD FE FFFF 01 02 03 ... FD FE 02 FF 00
902 03 04 ... FE FF 00FF 02 03 04 ... FE FF 01 01 00
1003 04 05 ... FF 00 01FE 03 04 05 ... FF 02 01 00

Quyida jadvalning har bir o'zgartirilgan ma'lumot baytining qanday joylashishini va uni ma'lumotlar bayti yoki kadr baytining oxiri sifatida qanday aniqlanishini ko'rsatish uchun yuqoridagi jadvaldan 3 misol yordamida diagramma keltirilgan.

   [OHB]: Yuqori bayt (Kadr boshlanishi) 3+ --------------> | : Birinchi nol belgisi 2 + --------> | nisbiy joylashishiga ishora qiladi : Keyingi nol belgisini ko'rsatuvchi nol ma'lumotlar bayti [EOP]: Paket oxiridagi nol belgining joylashishi. 0 1 2 3 4 5: bayt pozitsiyasi 03 11 22 02 33 00: COBS ma'lumotlar doirasi 11 22 00 33: chiqarilgan ma'lumotlar OHB = yuqori bayt (keyingi nol belgisiga ishora) EOP = paketning oxiri

7 dan 10 gacha bo'lgan misollarda, paketning uzunligi 255 va undan yuqori bo'lganligi uchun kodlangan ma'lumotlarga qarab ustki xarajatlarning qanday o'zgarishi ko'rsatilgan.

Amalga oshirish

Quyidagi kod C dasturlash tilida COBS kodlovchi va dekoderini amalga oshiradi:

/* * StuffData bayti ma'lumotlarning "uzunlik" baytlarini to'ldiradi * "ptr" bilan ko'rsatilgan joyda, yozish * "dst" tomonidan ko'rsatilgan joyga chiqish. * * Kodlangan ma'lumotlarning uzunligini qaytaradi. */# shu jumladan <stdint.h># shu jumladan <stddef.h>hajmi_t StuffData(konst uint8_t *ptr, hajmi_t uzunlik, uint8_t *dst){    uint8_t *boshlang = dst;    uint8_t *code_ptr = dst++;    *code_ptr = 1;    esa (uzunlik--)    {        agar (*ptr)        {            *dst++ = *ptr++;            *code_ptr += 1;        }        boshqa        {            code_ptr = dst++;            *code_ptr = 1;            ptr++;        }        agar (*code_ptr == 0xFF && uzunlik > 0)        {            code_ptr = dst++;            *code_ptr = 1;        }    }    *dst++ = 0;    qaytish dst - boshlang;}/* * UnStuffData da "uzunlik" bayt ma'lumotlari dekodlanadi * "ptr" bilan ko'rsatilgan joy, yozish * "dst" tomonidan ko'rsatilgan joyga chiqish. * * Shifrlangan ma'lumotlarning uzunligini qaytaradi * (bu <= uzunlik bo'lishi kafolatlanadi). */hajmi_t UnStuffData(konst uint8_t *ptr, hajmi_t uzunlik, uint8_t *dst){    konst uint8_t *boshlang = dst, *oxiri = ptr + uzunlik;    uint8_t kod = 0xFF, nusxa ko'chirish = 0;    bool bayroq = to'g'ri;    uchun (; ptr < oxiri; nusxa ko'chirish--)    {        agar (nusxa ko'chirish != 0)        {            bayroq = yolg'on;            *dst++ = *ptr++;        }        boshqa        {            agar (kod != 0xFF)            {                bayroq = to'g'ri;                *dst++ = 0;            }            nusxa ko'chirish = kod = *ptr++;            agar (kod == 0)            {                tanaffus;            }        }    }    agar (bayroq)        --dst;    qaytish dst - boshlang;}

Adabiyotlar

  1. ^ Cheshir, Styuart; Beyker, Meri (1999 yil aprel). "Doimiy baytlarni to'ldirish" (PDF). Tarmoq bo'yicha IEEE / ACM operatsiyalari. 7 (2): 159–172. CiteSeerX  10.1.1.108.3143. doi:10.1109/90.769765. Olingan 30-noyabr, 2015.
  2. ^ Cheshir, Styuart; Beyker, Meri (1997 yil 17-noyabr). Doimiy baytlarni to'ldirish (PDF). ACM SIGCOMM '97. Kann. Olingan 23-noyabr, 2010.

Shuningdek qarang

Tashqi havolalar