DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

Embedded EtherNet 17
13 بازدید
۱۴۰۴-۰۷-۱۶
7 دقیقه
  • نویسنده: مجتبی داشخانه
  • درباره نویسنده: ---

magic cookie چیست؟

گفتیم که فرمت هدر در پروتکل های BOOTP و DHCP یکسان هست. پس چگونه این دو از هم تشخیص داده میشن؟ سرور DHCP و همینطور نرم افزارهای شنود مثل wireshark) با استفاده از مفهوم magic cookie تشخیص میدن که پیام رسیده از نوع BOOTP هست یا DHCP. بدین صورت که اگر 4 بایت ابتدایی در قسمت Options با اعداد ثابت 99.130.83.99  یا 0x63825363 پر شده باشن؛ بدین معنی است که پیام ارسالی مبتنی بر DHCP است وگرنه داریم از BOOTP استفاده میکنیم. گزینه های مورد نیازمون هم بعد از 4 بایت magic cookie نوشته میشن.

 

معرفي تعدادي از آپشن هاي پروتكل DHCP

مهم‌ترین مورد در بخش گزینه‌ها؛ گزينه شما 53 با نام “Message Type” يا همان نوع پيام است. اين گزينه فقط يك بايت داده داره در نتيجه 3 بايت اشغال ميكنه و به‌صورت 0x35,0x01,0x– استفاده ميشه كه 0x– نوع پيام رو مشخص ميكنه و شامل موارد زير هست:

  • 0x01 : DHCP Discover
  • 0x02 : DHCP Offer
  • 0x03 : DHCP Request
  • 0x05 : DHCP ACK
  • 0x06 : DHCP NACK

موارد ديگه اي هم برای نوع پیام هست كه اينجا اعلام نشد (RFC 2132). در مرحله Discovery کلاینت این گزینه رو به‌صورت 0x35,0x01,0x01 میفرسته؛ در مرحله دوم سرور 0x035,0x01,0x02 و…

گزینه 50 — Requested IP Address (آدرس IP درخواست‌شده)

گزينه مهم ديگه، گزينه شماره 50 با نام Requested IP Address هست. اين گزينه 4 بايت داده براي IP مورد تقاضا (ترجیحی) هست و در نتيجه 6 بايت رو اشغال ميكنه كه دو بايت ابتدايي اون 0x32,0x04‌ و 4 بايت بعدي آدرس IP مورد تقاضا رو نشون ميده.

سایر گزینه‌های مهم DHCP (TTL، DNS، Lease Time، Option Overload)

از گزینه‌های معروف ديگه ميشه به گزينه 23 جهت مشخص نمودن مقدار پیش‌فرض TTL در يك ارتباط مبتني بر IP ؛ گزينه شماره 6 براي تعيين سرور DNS‌؛ گزينه شماره 51 جهت تعيين زمان اجاره و يا گزينه 52 براي وقتي كه مقدار بایت‌های بخش آپشن، جهت قراردادن گزینه‌های ارسالي كافي نباشه. با اين گزينه، گيرنده متوجه ميشه كه بخش‌های SName و File‌ نيز دربرگيرنده بخشي از گزینه‌ها هستند. برای اطلاعات بیشتر در مورد گزینه‌های پروتکل DHCP به سند RFC 2132 مراجعه کنید.

مرور مراحل برقراری ارتباط DHCP

يه مرور كوچولو بكنيم. ابتدا كلاينت روشن ميشه (و برای سادگی، فرض می‌کنیم كه كابل شبكه هم متصله و همه چی گل و بلبله) كلاينت كه فقط مك آدرس خودش رو میدونه؛ يك پيغام عمومي در لايه دو و سه شبكه (مك آدرس مقصد FF:FF:FF:FF:FF:FF ؛ آی‌پی آدرس مقصد 255.255.255.255؛ آدرس آی‌پی مبدأ 0.0.0.0) با پورت مبدأ 68 و پورت مقصد 67 روي شبكه ميفرسته. بیت B هم ست میشه. در جواب، سرور كه الان مك آدرس كلاينت رو داره؛ يك پيغام خصوصي در لايه دوم (با مك آدرس گيرنده يعني كلاينت) و عمومي در لايه سوم (آی‌پی 255.255.255.255) با پورت مبدأ 67 و مقصد 68 ميفرسته. در مرحله سوم، كلاينت از بين پاسخ‌های دريافتي يكي رو انتخاب ميكنه (در استاندارد، مواردی مثل زمان انتظار براي دريافت پيشنهاد و… ذكر شده) و حالا؛ كه هم مك آدرس و هم آی‌پی آدرس سرور رو داره؛ یک پيغام خصوصي به سرور ميفرسته و در نهايت، در مرحله چهارم، سرور با تأیید اين عمليات به‌صورت خصوصي يا عمومي (باتوجه‌به بيت B در مرحله سوم) كار رو تموم ميكنه.

راه‌اندازی DHCP Server در محیط ویندوز

  • از اونجاییکه بسیاری از ویندوزها، به‌صورت پیش‌فرض نمیتونن به‌صورت یک DHCP server عمل کنند؛ ما از یک نرم‌افزار جانبی برای ایجاد قابلیت DHCP server بر روی ویندوز استفاده کردیم. این نرم‌افزار به نام DHCPsrv رو از de/cms/download دانلود کنید (ورژن رایگانش 2.5.2.3)؛ سپس باتوجه‌به راهنمایی‌های عنوان شده در فایل Readme.txt این قابلیت رو فعال کنید.

پیاده‌سازی DHCP Client روی میکروکنترلر با ENC28J60

خب بریم سراغ کد؛ ما یه نرم‌افزار دانلود کردیم تا بتونیم ویندوز رو به‌صورت یک DHCP server فعال کنیم. در ابتدای برنامه؛ بعد از پیکربندی تراشه ENC (و احتمالاً در یک حلقه بی‌نهایت) ما باید فرایند دریافت آدرس IP رو باید انجام بدیم تا بعد از دریافت آدرس IP بتوانیم عملکرد عادی برد رو داشته باشیم. کدی که در میکروکنترلر نوشته شده؛ این‌طوری طراحی شده که پس از دریافت یک پیام روی UDP؛ در صورت نیاز، بهش جواب میده. پیام مرحله 3 رو که در جواب پیام مرحله 2 میتونیم بفرستیم. پیام مرحله چهار هم که نیاز به جواب نداره. میمونه پیام مرحله اول که با این روش قابل‌ارسال نیست. پس ما باید یک فریم حامل پیغامی مبتنی بر DHCP/UDP/IP/Ethernt ii ایجاد و توسط تابع ENC28J60_TransmitFrame ارسال کنیم تا DHCP server رو در جریان خواسته خودمون قرار بدیم. طبیعیه که باید یک روتین مناسب برای این عملیات نوشته بشه. اما جهت درک ساده‌تر مفهوم ارسال درخواست DHCP Dicovery؛ این قسمت از کد رو به‌صورت بسیار ساده‌ای پیاده‌سازی کردیم. بدین ترتیب که یک فریم Ethernet ii رو طوری چیدمان کردیم که پروتکل‌های DHCP,UDP و IP رو شامل باشه. این کد به‌صورت زیر در فایل main.c و بعد از راه‌اندازی اولیه ENC توسط تابع ENC28j60_init پیاده‌سازی شده:

شاید برای شما مفید باشد:
ساخت و طراحی LED چشمک‌زن با STM8 | قسمت هفتم
شاید برای شما مفید باشد:
برنامه ای ساده برای کدویژن و بسکام | آموزش میکروکنترلر AVR قسمت چهارم
  • آپشن 0xFF به معنای انتهای گزینه‌ها رو می‌توان درست بعد از آخرین پیام قرار داد و نه انتهای بخش گزینه‌ها؛ همچنین در بین پیام‌ها یا در انتهای بخش گزینه‌ها، می‌توان برای قراردادن گزینه‌ها در مرزهای مضرب چهار، از پدینگ یعنی گزینه 0x00 استفاده کرد.
  • برای محاسبه چک سام در پروتکل‌های IP, UDP قاعدتاً باید تابع مناسبی بنویسیم. اما اینجا اونها رو مستقیم نوشتیم. برای محاسبه چک سام هم از یک حقه ساده استفاده کردیم. در نرم‌افزار wireshark محاسبه و بررسی مقدار چک سام رو فعال کردیم (Edit/Preferences/Advance). یک‌بار پیام رو ارسال کردیم تا ببینیم مقدار درست چک سام، چی باید باشه. مقدار مناسب رو در کد قرار دادیم و دوباره کامپایل و پروگرام کردیم! یادآوری کنیم؛ ممکنه بعضی از پیاده‌سازی‌های این دو پروتکل؛ درستی چک سام رو بررسی نکنند. اما نرم‌افزاری که به‌عنوان DHCP Server دانلود کردیم، بررسی میکنه!
  • یادمون هم نره که مقدار آی‌پی رو در فایل c به آدرس عمومی تنظیم کنیم:

برای پیغام مرحله سوم (Request) در پاسخ Offer هم از کدی که تا الان داشتیم؛ استفاده کردیم. چون آی‌پی برد ما در حال حاضر 255.255.255.255 هست؛ پس کدی که الان در اختیار داریم؛ پکت های عمومی آیپی رو دریافت میکنه و چون پیغام روی UDP ارسال میشه، کافیه در تابع UDP_Process تغییرات لازم رو اعمال کنیم. اولین قدم اینه که بررسی کنیم آیا روی پورت 68 چیزی اومده یا نه؟

گام بعدی اینه که ببینیم آیا پیغام فعلی پیغام Offer یا ACK هست. برای این کار در ابتدای بخش گزینه‌ها، اول باید مجیک کوکی رو پیدا کنیم و بعد اگر مقدار موجود در گزینه 53، عدد 2 بود (یعنی پیغام Offer) باید پاسخ پیام که همون پیغام Request هست رو بفرستیم. مقدار آی‌پی واقعی رو هم از بخش yiaddr به دست میاریم و به‌عنوان آدرس IP خودمون ذخیره می‌کنیم. البته بهتر بود بعد از دریافت Ack انجام بشه.

شاید برای شما مفید باشد:
کار با ماژول EC200 کویکتل (4G LTE)
  • پیغام ACK نیاز به جواب نداره.
  • در پاسخ به پیغام Offer میتونید بیت B رو ریست کنید تا پیغام ACK به‌صورت خصوصی برای شما ارسال بشه.

برای تست؛ آدرس IP کامپیوتر رو 192.168.30.1 قرار دادیم و محدوده مجاز برای پیشنهاد آدرس رو هم 192.168.30.2 تا 192.168.30.255 ست کردیم. بریم ببینیم wireshark این پیغام ها رو چطور ثبت کرده:

 

پیغام Discover فرستاده شده توسط کلاینت (میکروکنترلر):

DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

پیغام Offer ارسال شده توسط سرور:

DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

  • همان‌طور که دیده می‌شود علاوه بر مقدار آدرس آی‌پی؛ تعدادی گزینه دیگه هم مثل subnet mask ؛ Lease Time و… توسط سرور فرستاده شده.

پیغام Request که میکروکنترلر در پاسخ به Offer به سرور برگردونده:

DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

 

و در نهایت پیغام Ack توسط سرور:

DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

بعد از عملیات هم اگر پنجره برنامه DHCP sever رو باز کنید (کلیک راست روی آیکن نرم‌افزار در تسک بار ویندوز و انتخاب open status) باید همچین چیزی ببینید:

DHCP و Magic Cookie — ساختار پکت و پیاده‌سازی ENC28J60 | قسمت 17 آموزش Embedded Ethernet

بعد از اتمام پروسه تخصیص آدرس IP؛ با دستور پینگ؛ تنظیم‌شدن آدرس آی‌پی رو چک کنید.

 

اطلاعات
13
0
0
اشتراک و حمایت
جلسات دیگر
آموزش

DNS و DHCP چیست؟ - آموزش کامل با...

profile

نویسنده: مجتبی داشخانه

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

ویراستار: Shadow
مقالات بیشتر
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

نویسنده شو !

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

ارسال مقاله