آموزش محاسبه چک‌سام IP با مکمل یک در زبان C | آموزش Embedded Ethernet قسمت یازدهم

Embedded EtherNet 11
مجتبی داشخانه
36 بازدید
۱۴۰۴-۰۳-۱۱
5 دقیقه

بطور کلی فرآیند چک سام اینطوری انجام ميشه: در بخشی که میخوان چک سام رو حساب کنن؛ تمام داده ها به ترتیب خاصی با هم جمع میشن و در نهایت نتیجه این جمع با یک روال تعریف شده، در محل چک سام نوشته میشه.

چک‌سام در پروتکل IP چگونه محاسبه می‌شود؟

  • گفتیم که در پروتکل IP چک سام روی هدر انجام میشه. از اونجاییکه بخش (field) چک سام، خودش داخل هدر هست؛ قبل از انجام چک سام، ابتدا داخل این بخش، عدد صفر نوشته میشه؛ بعد محاسبات انجام میشه و در آخر، نتيجه در همین قسمت نوشته ميشود.
  • مکمل یک (One’s Complement) چیست؟

مکمل یک (One’s Complement) چیست؟

برای تعریف چک سام اینترنتی، در اسناد اینطور گفته شده:

The checksum field is the 16 bit one’s complement of the one’s complement sum of all 16 bit words.

یعنی “چک سام نتیجه 16 بیتی و به فرم مکمل یک (one’s complement) جمع همه داده ها ( یی که قراره در محاسبات چک سام وجود داشته باشند) به صورت 16 بیتی”

توضیح ساده ترش اینه: بایت هایی که باید چک سامشون محاسبه بشه رو به صورت 16 بیتی (دو بایتی) جدا می کنیم، این دو بایتی ها رو به فرم مکمل یک جمع میکنیم؛ نتیجه جمع رو مکمل یک مي گیریم و در فیلد checksum می نویسیم. به عنوان مثال اگر نتیجه جمع شد +11 ؛ در بخش مربوطه -11 مینویسم (اعداد به فرم مکمل یک خواهند بود).

حالا چند تا نکته :

نحوه جمع به فرم مکمل یک

  • فرم مکمل یک، خیلی ساده ست؛ در اعداد منفی، تمام بیت ها رو NOT میکنیم! مثلا عدد +7 به صورت 16 بیتی؛ میشه 0000,0000,0000,0111 و عدد -7 به فرم مکمل یک میشه 1111,1111,1111,1000
  • در فرم مکمل یک؛ ما دو تا عدد به عنوان صفر داریم ، اگر به صورت 16 بیتی در نظر بگیریم، این دو تا صفر با 0x0000 و 0xFFFF نشون داده میشن، برای تمایز این دو، به اولی 0+ و به دومی 0- میگن.
  • در محاسبه جمع اعداد به فرم مکمل یک ، اگر رقم نقلي ( carry ) تولید بشه، برای درست بودن جواب، باید مقدار رقم نقلي رو به عدد حاصل اضافه کنیم. بعنوان مثال +7-5 رو اگه محاسباتمون 4 بيتي باشه:

همونطور که میبینیم اینجا عدد 1 رو به عنوان رقم نقلي داریم؛ لذا با نتیجه اصلي که “0001” هست جمع میشه که میشه 0010 یا 2 که اين، نتیجه ی درست محاسبه هست.

روش‌های مختلف تجزیه داده به صورت ۱۶ بیتی

  • محاسبات به فرم مکمل یک، یکسری خصوصیات جالب هم داره که اونها رو در شکل زیر و با سه روش نشون دادیم. فرض کنید داده هایی که باید روشون چک سام انجام بشه از چپ به راست به فرمت شانزده شانزدهی (Hexadecimal) عبارتند از :

 

بایت به بایت

دو بایتی با

ترتیب نرمال

دو بایتی با

ترتیب معکوس

Byte 0,1

00

01

0001

0100

Byte 2,3

F2

03

F203

03F2

Byte 4,5

F4

F5

F4F5

F5F4

Byte 6,7

F6

F7

F6F7

F7F6

جمع اول

2DC

1F0

2DDF0

1F2DC

نقلی

1

2

2

1

جمع دوم

DD

F2

DDF2

F2DD

جابجایی نهایی

DDF2

DDF2

DDF2

حالت اول اینه که بایت های فرد با هم و بایت های زوج با هم جمع میشن. حالت دوم اینه که بایت ها به فرم Big Endian با هم جمع شدن(حالت نرمال شبکه) و حالت سوم اینه که ابتدا بايت هاي درون داده 16 بیتی، جابجا (swap) شدن (Little Endian).

اگر محاسبات چک سام در نرم افزار (مثلا در نرم افزار میکروکنترلر) پیاده سازی بشه،؛ سرعت انجام اون بسیار اهمیت داره. در سند RFC 1071 و آپدیت هاي اون، بعضی الگوریتم های محاسبه چک سام با توجه به خصوصیات محاسبه به فرم مکمل یک پرداخته و بررسی شده.

يادآوري كنيم كه چک سام در پروتکل IP، تنها روی بایت های واقع در هدر انجام میشه.

  • در سیستم عامل ویندوز و همچنین در کدنویسی میکروکنترلرها ، محاسبات به فرمت مکمل دو (two’s complement) انجام میشن، عدم توجه به این نکته، عامل بسیاری از باگ های نرم افزاری ست.

پیاده‌سازی تابع چک‌سام در زبان C

قبل از اینکه برگردیم سراغ پروتکل IP، نیاز هست که یه تابع بنویسیم برای محاسبه چک سام. از اونجایی که داده هایی که توسط لایه دوم دریافت شده ن، درون یک آرایه به فرمت uint8_t ذخیره شدن، تابعی که مینویسیم دو آرگومان داره؛ اولی یک اشاره گر به ابتدای داده ها و دومی، طول داده ها رو میگیره و یک نتیجه 16 بیتی كه همون چك سام هست، بما برمی گردونه.

چون در عملیات جمع، ممکنه رقم نقلي (carry) داشته باشه؛ برای ذخیره نتیجه، یک متغیر 32 بیتی در نظر گرفته شده. در ابتداي تابع، بایت ها رو دوتا دوتا با هم جمع می کنیم، اگر تعداد بايت ها فرد باشه؛ در نهایت یک بایت اضافه ميماند، اون رو هم جمع میکنیم. از اونجاییکه عملیات جمع ممكنه رقم نقلي داشته باشه و نتیجه بیشتر از 16 بیت بشه، مقدار نقلی رو با نتیجه اصلی، جمع میکنیم ( برای فهم ساده تر الگوریتم؛ کد به صورت بالا نوشته شده). در نهایت دو بایت نتیجه جمع، به صورت بیتی NOT شده ن (تا مكمل يك جواب جمع بدست بياد) و اينو به عنوان نتیجه نهایی چك سام برمیگردونیم.

نکاتی مهم برای استفاده از تابع چک‌سام در میکروکنترلر

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

بررسی چک‌سام در سمت گیرنده

در سمت گیرنده، طبق الزام استاندارد، بایستي چک سام بررسي بشه (فرستنده هم ملزم به ارسال اون هست) در حاليكه در بسياري از كدهاي داخل نت، چك سام محاسبه يا بررسي نشده! در اینجا (یعنی سمت گیرنده) دو کار میتونیم انجام بدیم، راه ساده تر اینه که اینجا هم چک سام رو حساب کنیم و ببینیم که آیا یکی هستند یا نه!

راه دوم که بنظر سریعتر هست؛ اینه که در سمت گیرنده فیلد چک سام رو صفر نکنیم و محاسبات رو انجام بدیم، در نتیجه جواب نهایی، همواره باید صفر باشه. چرا؟ یادمونه که ما در آخرین مرحله از محاسبه چک سام؛ مکمل یک چک سام رو ثبت می کردیم؛ مثلا اگر چک سام میشد +6 ؛ ما مقدار -6 رو ذخیره می کردیم ، در نتیجه در سمت گیرنده، اگر بدون صفر کردن چک سام، محاسبات رو در سمت گیرنده انجام بدیم، باید به نتیجه صفر برسیم.

اطلاعات
36
0
0
لینک و اشتراک
profile

مجتبی داشخانه

متخصص الکترونیک

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

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

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

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

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ
سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت
سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم
سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ
آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی
پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله