**تشخیص و تصحیح خطا** (به انگلیسی: Error detection and correction) در نظریه اطلاعات، نظریه کدگذاری، علوم رایانه، مخابرات تکنیک‌هایی هستند که تحویل امن داده‌ها در کانال‌های مخابراتی ناامن را ممکن می‌کنند بسیاری از کانال‌ها در معرض نویز هستند و ممکن است اطلاعات در حین فرستاده‌شدن میان مبدأ و مقصد دچار خطا گردند. تشخیص و تصحیح خطا امکان شناسایی و ساخت مجدد اطلاعات اولیه را ممکن می‌گرداند.

تعریف
-----

* تشخیص خطا: تشخیص خطاهایی که با نویز یا با اختلال‌هایی ایجاد می‌گردند و درهنگام انتقال میان فرستنده و گیرنده به وجود می‌آیند.
* تصحیح خطا: یافتن خطا و بازیابی اصل اطلاعات

تاریخچه
-------

معروف‌ترین استفاده قاعده‌دار از تشخیص خطا توسط کاتبان یهودی در هنگام کپی‌برداری از کتاب مقدسشان بود. آنها روش‌های مختلفی برای تشخیص خطا داشتند از قبیل جمع کلمات در هر خط یا جمع کلمات در هر صفحه یا چک کردن یک پاراگراف (معمولاً پاراگراف میانی). در هر صفحه اگر حتی یک خطا وجود داشت کل صفحه ازبین می‌رفت اما اگر ۳ خطا هم‌زمان دریک صفحه رخ می‌داد، کل صفحه رانابود می‌کردند. این روش کار بودن خود را زمانی نشان داد که طومارهای دریای مرده کشف شدند.

معرفی
-----

ایده عمومی این است که چیزی به متن اصلی افزوده گردد که دریافت‌کننده بتواند درستی متن دریافتی را بررسی نماید، اگر خطایی محرز گشت آن را تصحیح کند. طرح‌های تشخیص و تصحیح خطا می‌تواند به صورت سیستماتیک یا غیرسیستماتیک باشد. در طرح سیستماتیک فرستنده داده‌های اصلی را همراه تعداد ثابتی عدد به عنوان بیت‌های بررسی می‌فرستد، که بیت‌های بررسی از الگوریتم قطعیای به دست می‌آیند که از داده‌های اصلی استفاده می‌کنند. اگر فقط تشخیص خطا مدنظر باشد گیرنده می‌تواند الگوریتم را دوباره بر روی داده‌های اصلی اجرا و مقدار خروجی آن را با بیت‌های بررسی مقایسه کند اگر یکسان بودند خطایی رخ نداده‌است. در سامانه‌هایی که از کد غیر سیستماتیک استفاده می‌کنند، پیام اصلی تبدیل به یک پیام کد شده می‌شود. عملکرد مناسب زمانی حاصل می‌گردند که بر اساس ویژگی‌های کانال مخابراتی و طرح‌های انتقال داده انتخاب گردند. انواع معمول کانال‌های مخابراتی شامل مدل بدون حافظه که در آن خطا به صورت تصادفی و با احتمال قطعی اتفاق می‌افتد و مدل‌های پویا است. در نتیجه تشخیص و تصحیح خطا را می‌توان به (به انگلیسی: random-error-detecting/correcting) و (به انگلیسی: burst-error-detecting/correcting) تقسیم کرد.
اگر ظرفیت کانال را نتوان معین کرد یا ظرفیت بیش از حد متغیر باشد می‌توان درخواست ارسال مجدد داده‌ها را داشت که آن را به عنوان درخواست بازفرستی خودکار، (به انگلیسی: automatic repeat request) می‌شناسند که به طور ویژه در اینترنت کاربرد دارد.

اجرا
----

تشخیص و تصحیح خطا به دو صورت زیر تحقق میابد:

* درخواست بازفرستی خودکار، (به انگلیسی: automatic repeat request):داده‌ها به فرم بلوکی دریافت می‌گردند هر بلوک داده برای وجود خطا بررسی می‌شود اگر خطایی یافت شود، به صورت خودکار برای آن بلاک داده درخواست ارسال مجدد می‌شود این روند ادامه میابد تا زمانی که کل داده‌ها به صورت سالم دریافت گردند.
* اصلاح خطا رو به جلو (به انگلیسی: Forward error correction): فرستنده اطلاعات را قبل فرستادن با کمک (به انگلیسی: error-correcting code (ECC)) کد می‌کند. اطلاعات اضافه شده توسط کد دریافت‌کننده برای بازیابی اطلاعات اصلی مورد استفاده قرار می‌گیرد.

این دو روش ممکن است ترکیب گردند وروش دیگری به نام درخواست تکرار اتوماتیک ترکیبی (به انگلیسی: Hybrid automatic repeat request) بسازند.

طرح‌های تشخیص خطا
-----------------

تشخیص خطا اغلب با یک تابع درهم‌سازی مناسب صورت می‌گیرد یک تابع هش برچسب‌هایی باطول ثابت را به پیام می‌افزاید و که گیرنده را قادر می‌سازد که پیام دریافتی را با بررسی برچسب صحت آن را تأیید کند. طرح‌های بسیار زیادی برای تابع‌های هشی وجود دارد اما استفاده از آن‌ها بسته به سادگی یا مناسب بودن برای تشخیص نوع خاصی از خطاهست.

### کدهای تکرار

مقالهٔ اصلی: کدهای تکرار
اساس این طرح این است که کد ارسالی چندین بار ارسال گردد تا از صحت آن مطمئن شویم یک کد بزرگ به چندین بلاک تقسیم می‌گردد، آنگاه هر کدام چند بار مثلاً ۳ بار ارسال می‌گردند؛ بنابراین اگر یکی از این بلاک‌ها متفاوت با دیگری باشد خطایی رخ داده هست. این طرح کارا نیست و زمان زیادی می‌گیرد، اما مزیت آن سادگی آن است.

### بیت توازن

مقالهٔ اصلی: بیت توازن
دراین حالت یک بیت اضافه می‌شود به گونه‌ای که کل بیت‌های ارسالی دارای مجموع اعضای فرد یا زوج باشد.

### چک‌سام

مقالهٔ اصلی: چک‌سام
چک‌سام یک پیام عبارت است از هم‌نهشتی مجموع کلمات پیام

### کد افرونگی چرخشی

مقالهٔ اصلی: کد افزونگی چرخشی
یک تابع درهم‌ساز غیر ایمن هست که برای تشخیص خطاهایی تصادفی در شبکه ایجاد شده‌است.

### تابع درهمساز رمزنگارانه

مقالهٔ اصلی: تابع درهم‌ساز رمزنگارانه
تابع درهم‌سازی هست که رشته‌ای را می‌گیرد و رشته‌ای ثابت برمی‌گرداند این طرح اطمینان بالایی از لحاظ یکپارچگی داده دارد. هرگونه تغییر در داده باعث تغییر مقدار تابع درهم‌ساز شده و خطا یافته می‌شود.

### اصلاح خطا روبه جلو

مقالهٔ اصلی: اصلاح خطا روبه جلو
(به انگلیسی: Forward error correction)، با هر الگوی اصلاح خطا روبه جلو می‌توان خطاها را یافت. با کمترین فاصله همینگ d می‌تواندتاd-1 خطا را یافت. این طرح مناسب است اگر بتوان حداقل تعداد خطاها را قبل از ارسال پیش‌بینی نمود.

تصحیح خطا
---------

### درخواست بازفرستی خودکار

مقالهٔ اصلی: درخواست بازفرستی خودکار
یک روش کنترل خطا که از کدهای کشف خطا، قبول یا عدم قبول پیام و وقفه برای انتقال مطمئن داده‌ها استفاده می‌کند (قبول پیام یعنی گیرنده پیامی به فرستنده می‌فرستد که پیام به درستی دریافت شده‌است). فرستنده به‌طور معمول در زمان وقفه اگر پیام قبولی دریافت نکند، پیام را مجدداً می‌فرستد و این کار تا تعداد معینی بار صورت می‌پذیرد. این روش برای کانال‌های ارتباطی متغیر یا با ظرفیت ناشناخته مانند اینترنت مناسب هست.

### اصلاح خطا روبه جلو

مقالهٔ اصلی: اصلاح خطا روبه جلو
بر این اساس افزونه‌ای به کد اضافه گشته تا دریافت‌کننده بتواند آن را حتی با وجود تعداد معینی خطا بازیابی کند. اصلاح خطا رو به جلو در مدل اتصال متقابل سامانه‌های باز کاربرد دارد.

### درخواست بازفرستی خودکار ترکیبی

مقالهٔ اصلی: درخواست بازفرستی خودکار ترکیبی
از ترکیب دو روش قبل به دست می‌آید و دو روش اساسی دارد:

* پیام‌ها با روش اصلاح خطا روبه جلو فرستاده و بعد گیرنده پیام را کد گشایی می‌کند، اگر کد گشایی درست انجام نشود، مانند درخواست بازفرستی مجدد، درخواست بازفرستادن پیام را می‌کند.
* پیام فقط با اطلاعاتی دربارهٔ چگونگی تشخیص خطا فرستاده می‌شود، اگر گیرنده خطایی بیابد، با روش درخواست بازفرستی مجدد خودکار درخواست اطلاعاتی دربارهٔ چگونگی تصحیح آ نرا درخواست می‌کند تا بتواند اطلاعات را بازیابی کند.

موارد غیرقابل استفاده
---------------------

برنامه‌هایی که احتیاج به زمان تأخیر کم دارند (مانند گفتگوی تلفنی) نمی‌توان از درخواست بازفرستی خودکار استفاده کرد و باید از اصلاح خطا رو به جلو استفاده کرد. همچنین مانند مورد قبل برای برنامه‌هایی که وقتی اطلاعات را می‌فرستند دیگران را دردسترس برای ارسال مجدد ندارند نمی‌توان از درخواست باز فرستی خودکار استفاده کرد.

بعضی موارد کاربرد
-----------------

ارتباط تنگاتنگی میان توسعه اصلاح خطا رو به جلو و برنامه‌های فضایی بود. در فضا مسافت زیاد، قدرت سیگنال کم و نیروی مورد نیاز محدود است، پس احتیاج بود اطلاعات ارسالی اگر هم مشکل دارند در همان‌جا تصحیح و مورد استفاده قرار گیرند. برای همین هم برای مثال وویجر ۲ از تصحیح خطای رید-سالامون استفاده کرده‌است. همچنین از تشخیص و اصلاح خطا در بالابردن قابلیت اطمینان فضاهای ذخیره‌سازی داده‌ها استفاده می‌گردد برای مثال در هارد درایوهای جدید از کد افزونه‌ای چرخشی برای تشخیص و از تصحیح خطای رید-سالامون برای تصحیح خطاهای جزئی بهره می‌برند. سامانه‌های آرایه چندگانه دیسک‌های مستقل از تکنیک‌های مختلف تشخیص و تصحیح خطاها در زمانی که هارد درایو کاملاً قفل کرده‌است، استفاده می‌کنند.
حافظه دسترسی تصادفی پویاها نیز از کدهای تصحیح خطا استفاده می‌کنند، تصحیح خطا در این موارد معمولاً از کدهای همینگ استفاده می‌کنند. سامانه‌های کمی هم از شستشوی حافظه استفاده می‌کنند.

پانویس
------

1. ↑
2. ↑
3. ↑
4. ↑
5. ↑
6. ↑
7. ↑  «نسخه آرشیو شده» (PDF). بایگانی‌شده از اصلی (PDF) در ۲۲ مه ۲۰۱۴. دریافت‌شده در ۲۲ مه ۲۰۱۴.

منابع
-----

* http://ecomputernotes.com/
* techradar

* مشارکت‌کنندگان ویکی‌پدیا. «Error detection and correction». در *دانشنامهٔ ویکی‌پدیای انگلیسی*، بازبینی‌شده در ۲۲ مه ۲۰۱۴.