محسن نوشته

نگاهی عمیق به پشته شبکه (بخش اول)
منتشر شده در: — Jul 11, 2020

زمانی که IoT وجود نداشت بنظر من اولین قدم هایی که منجر به اتصال اشیاء به اینترنت می شد را کمپانی Microchip با ارائه تراشه ENC28J60 برداشته بود. من اولین بار سال ۱۳۸۵ دیتاشیت این تراشه رو پرینت گرفتم و شروع کردم به خوندنش. اون موقع دانشجوی برق-قدرت بودم و حقیقتا برای من موضوع سنگینی بود. هیچ دانشی از شبکه و اینترنت نداشتم اما جسور شده بودم از این تراشه سر در بیارم. نهایتا سال ۱۳۸۹ تونستم باهاش دستگاهی بسازم که میتونست به اینترنت متصل بشه، یه وب سرور داشت که میشد با استفاده از اینترفیسش: LED‍ و رله ها رو کنترل کنیم.

بین سال ۹۰ تا ۹۲ من درگیر سربازی شدم اما تمام وقت آزادم درگیر مطالعه مفاهیم: شبکه، سیستم عامل و پروتکل ها شد و بلاخره تمام زحمتی که توی این چند سال روی این موضوع کشیدم را تبدیل به یک کتاب کردم. سال ۹۳ با هزاران آرزو برای تکمیل دانشم ارشد شبکه های کامپیوتری را شروع کردم به خوندن (که کاش هیچوقت این زمان را برای تحصیلات تکمیلی نذاشته بودم!)

وقتی دانشجوی ارشد بودم تراشه های دیگه را شروع کردم به مطالعه. تراشه هایی مثل: CC2530 از کمپانی TI و اخیرا برای ساخت فیورگجت درگیر مطالعه تراشه CC2540 شدم. بین سالهای ۹۳ تا ۹۵ تمام تمرکزم روی درک پشته شبکه سیستم عامل FreeBSD بود و دنبال این بودم که بتونم برای یکی از این تراشه ها درایور FreeBSD شو بنویسم. نهایتا با کمک یکی از دانشجوهایی که کارآموزیش باهام بود تونستیم برای تراشه CC2530 درایور FreeBSD را بنویسیم. این درایور تراشه CC2530 را بعنوان یک کارت شبکه به هسته سیستم عامل معرفی میکرد و رفتار سیستم عامل باهاش مشابه سایر کارت شبکه ها بود. البته تنها تفاوت این بود که این کارت شبکه FreeBSD را به شبکه IPSO متصل میکرد. IPSO مجموعه پروتکل هایی هستش که برای توسعه شبکه بیسیم کوتاه برد و کم سرعت بین اشیاء توسعه داده شده.

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

توی این پست یه نگاه اجمالی به تراشه ENC28J60 میندازیم و با معماری سخت افزارش آشنا میشیم (خیلی انتزاعی) . برای درک بهتر موضوع ازتون میخوام یه BlackBox را مشابه شکل زیر تصور کنید.

ENC28J60

تعریف MDI

این BlackBox با استفاده از یه کابل شبکه به سوئیچ شبکه و اینترنت متصل شده. ما به کابل شبکه رسانه (Media) انتقال دیتا هم میتونیم بگیم. پس رسانه ما چیزیه که توش دیتا با استفاده از سیگنالهای الکترونیکی مبادله میشه. ما برای اتصال BlackBox به این رسانه نیاز به یک واسط داریم. این واسط شکل و فرم فیزیکی داره، چیزی مثل کانکتور کابل شبکه (نرگی/مادگی). ویژگی های فیزیکی این کانکتور خیلی خیلی وابسته به ویژگی های فیزیکی رسانه هستش.

مثلا: رسانه اترنت نوع 10Base-5 کابل Coaxial و رسانه اترنت 10Base-T کابل Twisted-pair (زوج به هم تابیده شده مثل کابل های Cat-5) هستش. وقتی BlackBox ما بخواد به هر کدوم از این شبکه ها متصل شه نیاز به کانکتور مختص رسانه همون شبکه داره. به این کانکتور اصطلاحا MDI یا Media Dependent Interface یا واسط وابسته به رسانه میگیم.

توی تجهیزات شبکه معمولا نمیشه پایه های MDI را مستقیما به تراشه های اترنت متصل کرد و معمولا بین های MDI و پین های تراشه فیلتر مناسبی قرار داده میشه.

ENC28J60

از اونجایی که توی اترنت رسانه سیمی و با طول بلنده، این فیلتر کمک میکنه نویزهای ناخواسته ای که استعداد ایجاد اختلال روی کارکرد تراشه را داره فیلتر شه. اما حواسمون باشه هرچه طول کابل بیشتر باشه از یک طرف اعوجاج سیگنال بیشتر و از طرف دیگه اثر تضعیف سیگنال و نویز ها افزایش پیدا میکنه. نهایتا اینکه طول کابل اترنت 10Mbps یا همون 10Base-T نهایتا ۱۰۰ متر (کابل Cat-5) میتونه باشه. شاید شما توی سناریویی با طول بیشتر هم جواب گرفته باشید، اگه اینطوری بوده احتمالا محیط پیرامونی کابل نسبت به نویز تمیز بوده یا جنس کابل اثر اعوجاج و تضعیف کمتری روی سیگنال های رسانه داشته.

ماژول PHY

برای ادامه بحثمون میتونیم BlackBox را یه مقدار باز کنیم شکل زیر BlackBox باز شده را نشون میده.

ENC28J60

ماژول PHY یه مدار الکترونیکی هستش که وظیفه کدگذاری و کدگشایی را به عهده داره. این مدار از یک طرف جریانی از بیت ها را دریافت میکنه و اونها رو به سیگنال الکتریکی مناسب با رسانه کد میکنه و از طرف دیگه وقتی یک توالی از سیگنال ها را روی رسانه دریافت میکنه میتونه معادل توالی بیتی این سیگنال را کد گشایی کنه. اوایل وقتی که تکنولوژی نیمه رساناها به بلوغ الانش نرسیده بود وظایف PHY به بک تراشه فیزیکی مستقلی واگذار میشد. اما با پیشرفت تکنولوژی های توسعه چیپست ها، PHY در کنار سایر ماژول ها و بصورت یکپارچه داخل یک چیپست واحد ارائه شد. ماژول PHY دو تا گذرگاه اصلی داره:

ماژول MAC

اول از همه ببینیم MAC یعنی چی! Media Access Control وظیفه اصلیش پیاده سازی سخت افزاری پروتکل دسترسی به رسانه هستش. بعنوان مثال: چه زمانهایی باید روی رسانه دیتا ارسال شه، چه زمان هایی از رسانه دیتا دریافت شه، چه زمانهایی باید هر داده ای که میاد الزاما دریافت شه، نودهایی که به رسانه دسترسی دارن چطوری شناسه دار بشن، قالبی که داده ها باهاش بسته بندی (کبسوله بشن) چیه، مرز دو کپسول داده چطور مشخص شه، فاصله زمانی و بیتی بین دو کپسول داده چیه و خیلی چیزهای دیگه. برای اترنت مجموعه این قواعد توی استانداردی به نام IEEE802.3 تدوین شده و کار ماژول MAC پیاده سازی این استاندارد بصورت سخت افزاری هستش. بصورت کلی ماژول MAC از یک طرف با فریم های اترنت و از طرف دیگه با جریانی از بیت ها سروکار داره.

جمع بندی

حالا به شکل قبل برگردیم و فرض کنیم واحد پردازشی (MCU‍) از ماژول MAC خواسته یک بایت داده (10100111) را روی رسانه ارسال کنه. برای ساده تر شدن فرض کنیم واحد کپسوله بندی داده ها یک بایت باشه. ماژول MAC این بایت را از طریق MII به ماژول PHY ارسال میکنه و مثلا از طریق MIIM میتونه بهش سرعت انتقال و زمان شروع ارسال را اعلام کنه. ماژول PHY بایت دریافت شده را به یک رشته سمبل الکتریکی تبدیل میکنه و این رشته را روی رسانه (زوج سیم های به هم تابیده شده در اترنت) ارسال میکنه. تا اینجا ما یه سری مفاهیم اولیه را یاد گرفتیم و توی پست های بعدی میریم سراغ اینکه توی تراشه ENC28J60 این مفاهیم چطوری پیاده سازی شدن و ما چطور میتونیم با این پیاده سازی کار کنیم و داده روی رسانه اترنت مبادله کنیم.

پیروز باشد.