Кіріспе

Флетчерлік тексеру сомасы – 1970 жылдардың соңында Лоуренс Ливермор зертханасында Джон Г. Флетчер (1934–2012) ұсынған, позицияға тәуелді тексеру сомасын есептеуге арналған алгоритм. Флетчерлік тексеру сомасының мақсаты – циклдық артық тексеруге жақын қателерді анықтау мүмкіндігін қамтамасыз ету болды, бірақ қосымша амалдармен байланысты есептеу шығындарын азайту.

Қарапайым тексеру сомаларын қайта қарау

Қарапайым тексеру жиынтығы алгоритмдері сияқты, Флетчер тексеру жиынтығы қателерден қорғалатын екілік деректер сөзін біттердің қысқа "блоктарына" бөлуді және осы блоктардың модульдік қосындысын есептеуді қамтиды. (Бұл саланың терминологиясы шатастыруы мүмкін екеніне назар аударыңыз. Қорғалатын деректердің толығымен жиынтығы "сөз" деп аталады, ал оны бөлуге арналған бөліктер "блоктар" деп аталады.) Мысалы, деректер 136 таңбадан тұратын хабар болуы мүмкін, әр таңба 8 биттік байт ретінде сақталады, бұл барлығы 1088 биттік дерек сөзін құрайды. 8 биттік блок мөлшері ыңғайлы, бірақ міндетті емес. Сол сияқты, 255 саны ыңғайлы модуль болады, бірақ басқаларын да таңдауға болады. Осылайша, қарапайым тексеру сомасы хабарламаның барлық 8 биттік байттарын қосу, 255-ке бөлу және тек қалдықты сақтап есептеледі. (Іс жүзінде, модульдік операция қосымның өзінде орындалады, нәтиженің мөлшерін бақылау үшін.) Тексеру сомасы хабарламамен бірге жіберіледі, оның ұзындығы 137 байтқа немесе 1096 битке дейін ұзарады. Хабарды алған адам тексеру сомасын қайта есептеп, оны алынған мәнмен салыстыру арқылы хабарламаның берілу барысында өзгерткенін анықтай алады.

Қарапайым тексеру сомаларының кемшіліктері

Қарапайым тексеру сомасының бірінші әлсіздігі – дерек сөзіндегі (хабарламадағы) блоктардың (байттардың) ретіне сезімтал емес болуы. Егер рет өзгертілсе, тексеру сомасы сол күйінде қалады және өзгеріс анықталмайды. Екінші кемшілігі – тексеру сомасының мүмкін болатын мәндерінің саны шектеулі, ол таңдалған модульге тең. Мысалымызда, бар болғаны 255 түрлі тексеру сомасы бар, сондықтан кездейсоқ деректердің біздің хабарламамызбен бірдей тексеру сомасына ие болу ықтималдығы шамамен 0,4% құрайтынын көру оңай.

Флетчерлік тексеру сомасы

Флетчер бұл екі кемшілікті қарапайым тексеру қосындысымен бірге екінші мәнді есептеу арқылы шешеді. Бұл – дерек сөзінің әрбір блогы қосылған кезде қарапайым тексеру қосындысы қабылдаған мәндердің модульдік қосындысы. Қолданылатын модуль бірдей. Демек, дерек сөзінен алынған әрбір блок үшін, блоктың мәні бірінші сомаға қосылады, ал бірінші соманың жаңа мәні екінші сомаға қосылады. Екі сома да нөлден басталады (немесе басқа белгілі бір мәннен). Дерек сөзінің соңында модуль операторы қолданылады, және екі мән Флетчер тексеру жиынтығының мәнін құру үшін біріктіріледі. Блоктардың ретіне сезімталдық енгізіледі, себебі бір блок бірінші сомаға қосылғаннан кейін, ол екінші сомаға одан кейінгі әрбір блокпен бірге қайта-қайта қосылады. Мысалы, егер екі жапсарлас блок алмасып кетсе, бастапқыда бірінші болған блок екінші сомаға бір рет кем қосылады, ал бастапқыда екінші болған блок екінші сомаға бір рет артық қосылады. Бірінші соманың соңғы мәні өзгермейді, бірақ екінші сома өзгереді, бұл хабарламадағы өзгерісті анықтайды. Мүмкін болатын тексеру сомасы мәндерінің кеңістігі енді қарапайым тексеру сомасы мәнінің квадратына тең. Мысалымызда, әрқайсысы 255 мүмкін мәнді қамтитын екі сомадан құралған тексеру сомасының 65025 мүмкін мәні шығады.

Әртүрлі алгоритм параметрлерінің шолу

Параметрлердің саны шексіз болғанымен, түпнұсқалық мақалада тек K=8 (сөз ұзындығы) жағдайы, 255 және 256 модульдерімен қарастырылған. 16 және 32 биттік нұсқалар (Флетчер 32 және 64) бастапқы жағдайдан туындап, кейінгі техникалық сипаттамаларда немесе мақалаларда зерттелген.

Флетчер-16

Дерек сөзі 8 биттік блоктарға бөлінгенде, жоғарыдағы мысалдағыдай, екі 8 биттік қосынды пайда болады және олар 16 биттік Флетчер тексеру сомасына біріктіріледі. Әдетте, екінші қосынды 256-ға көбейтіліп, қарапайым тексеру сомасына қосылады, бұл қосындыларды 16 биттік сөзде қарапайым тексеру сомасы ең кіші маңызды ұшында орналасқан етіп, қатар қоюға мүмкіндік береді. Осы алгоритм Флетчер-16 тексеру сомасы деп аталады. Сондай-ақ, 28−1=255 модулін қолдану да көбінесе түсініледі.

Флетчер-32

Дерек сөзі 16 биттік блоктарға бөлінгенде, екі 16 биттік қосынды пайда болады және олар 32 биттік Флетчер тексеру қосындысына біріктіріледі. Әдетте, екінші қосынды 2¹⁶-ға көбейтіліп, қарапайым тексеру қосындысына қосылады, нәтижесінде 32 биттік сөзде қосындылар тікелей біріктіріліп, қарапайым тексеру қосындысы ең кіші маңызды ұшында орналасады. Осы алгоритм Флетчер-32 тексеру қосындысы деп аталады. 2¹⁶-1=65535 модулін қолдану да көбінесе түсініледі. Бұл таңдаудың себебі Флетчер-16 үшін де осыған ұқсас.

Флетчер-64

Дерек сөзі 32 биттік блоктарға бөлінгенде, екі 32 биттік қосынды пайда болады және олар 64 биттік Флетчер тексеру қосындысына біріктіріледі. Көбінесе екінші қосынды 232-ге көбейтіліп, қарапайым тексеру қосындысына қосылады, бұл 64 биттік сөзде қосындыларды қатар орналастырып, қарапайым тексеру қосындысын ең кіші маңызды ұшында қалдырады. Осы алгоритм Флетчер 64 тексеру жиынтығы деп аталады. 232−1=4,294,967,295 модулін қолдану да әдетте түсініледі. Бұл таңдаудың себебі Флетчер 16 және Флетчер 32 үшін де осыған ұқсас.

Адлерлік тексеру қосындысымен салыстыру

Адлер 32 бақылау жиынтығы – Марк Адлер ұсынған Флетчер 32 бақылау жиынтығының бір түрі. Модуль (екі сома үшін де) 65521 саны таңдалған (65535 саны 3, 5, 17 және 257-ге бөлінеді). Бірінші сома 1 санынан басталады. Басты модульді таңдау "араластыруды" жақсартады (қате үлгілері біркелкі ықтималдықпен анықталады, ең нашар анықталатын үлгілерді анықтау ықтималдығы артады, бұл жалпы өнімділікке әсер етеді). Дегенмен, мүмкін бақылау сомасының мәндерінің кеңістігін азайту осының керісінше әрекет етеді және өнімділікті сәл төмендетеді. Бір зерттеу көрсеткендей, Флетчер 32, Адлер 32-ден өнімділік және қателерді анықтау қабілеті тұрғысынан жоғары. 65535 модулі бойынша қосу, 65521 модулі бойынша қосудан қарапайым және жылдам орындалғандықтан, Флетчер 32 бақылау жиынтығы көбінесе жылдам алгоритм болып табылады.

Модульге қатысты сақ болу

Жоғарыда және төмендегі мысалдарда Флетчер 16 үшін 255 модулі қолданылады, бірақ кейбір нақты қолданыстарда 256 модулі қолданылады. TCP протоколының баламалы тексеру қосындысы және U-blox GPS құрылғысынан келетін UBX * хабарламаларының тексеру қосындысы 256 модулі бар Флетчер 16-ны пайдаланады. Қай модуль қолданылатыны жүзеге асырылу тәсіліне байланысты.

Кемшіліктері

Флетчерлік бақылау қосындысы барлық 0 биттерінен тұратын блоктарды және барлық 1 биттерінен тұратын блоктарды ажырата алмайды. Мысалы, егер дерек сөзіндегі 16 биттік блок 0x0000-ден 0xFFFF-ке өзгеретін болса, Флетчер 32 тексеру сомасы өзгермейді. Бұл сондай-ақ, барлық 00 байттарынан тұратын тізбек, сол өлшемдегі барлық FF байттарынан тұратын тізбекпен бірдей тексеру сомасына ие екенін білдіреді.

Іске асыру

Бұл мысалдар екілік толықтыру арифметикасын негізге алады, себебі Флетчер алгоритмі бірлік толықтыру машиналарында дұрыс жұмыс істемейді.

Биттер мен байттарды реттеу (енділік / желілік тәртіп)

Кез келген екі жүйе бірдей нәтиже алуды күтсе, бинарлық деректер сөзін қысқа блоктарға бөліп, блоктарды сандар ретінде қарастыратын кез келген есептеуде деректер сөзіндегі биттердің ретін сақтауы қажет. Осы тұрғыдан алғанда, Флетчер тексеру қосындысы басқа тексеру қосындылары мен CRC алгоритмдерінен ешқандай айырмашылығы жоқ және қосымша түсіндіруді қажет етпейді. Үлкен эндиандық және кіші эндиандық жүйелер арасында деректер сөзі байттар бойынша жіберілгенде және Флетчер 32 тексеру сомасы есептелгенде, көзге көрінетін реттілік мәселесі туындауы мүмкін. Егер блоктар жадтағы деректер сөзінен 16 биттік таңбасыз бүтін санды қарапайым оқу арқылы алынса, онда жадтағы 16 биттік дерек элементтерінің байт реті кері ауысқандықтан блоктардың мәндері екі жүйеде де әртүрлі болады, нәтижесінде тексеру сомасының нәтижесі де әртүрлі болады. Жоғарыдағы іске асыру мысалдары тексеру сомасының алгоритмін түсініксіз ету үшін реттілік мәселелерін қарастырмайды. Флетчер 16 тексеру сомасы 8 биттік блоктарды қолданғандықтан, байт эндиандығына әсер етпейді.