محسن نوشته

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

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

نکته: لازمه یه تشکر ویژه از همسرم، ثریا داشته باشم. ثریا توی مسیر ریسرچ و مطالعه همیشه پشتیبان من بوده و هر کاری که از دستش میومده برای این هدف انجام داده. تصاویری که توی این مجموعه از پست ها میبینید را ثریا طراحی کرده و این زحمتش UX جذابی حین مطالعه برامون ایجاد میکنه. ثریا جان سپاس.

فیلترها در ENC28J60:

وقتی یه تراشه شبکه منتظر دریافت فریم های اترنت هست ممکنه انواع فریم ها رو دریافت کنه. گاهی باید کار خاصی در قبال این فریم های خاص مستقل از واحد پردازشی انجام بده و گاهی اصلا نباید اونا رو پردازش کنه و در داخل بافر دریافت قرار بده. برای این منظور ENC28J60 شش نوع فیلتر مختلف در اختیار ما قرار میده که عبارتند از:

۱. Unicast Filter
این فیلتر جلوی ورود و پردازش همه ی فریم های اترنت ورودی را میگیره به جز آنهایی که آدرس مقصدشون آدرس خود ENC28J60 هست. یادآوری کنم که آدرس ENC28J60 توی ثبات های MAADR قرار داره.

۲. Broadcast Filter
این فیلتر به تمام بسته هایی که آدرس مقصدشون: FF:FF:FF:FF:FF:FF هست اجازه ورود و پردازش میده.

۳. Multicast Filter
این فیلتر کم ارزش ترین بیت از پر ارزش ترین بایت آدرس مقصد را چک میکنه اگه 1 باشه به فریم اجازه ورود و پردازش میده.

۴. Pattern Match Filter
این فیلتر یک پنجره 64 بایتی از ابتدای فریم از محلی که توی ثبات EMPO نوشته شده را انتخاب میکنه و به ازای بایت های خاصی از این پنجره CRC محاسبه میکنه. اگه CRC محاسبه شده با مقداری که قبلا توی ثبات EPMCH قرار داده شده برابر بود به فریم اجازه ورود و پردازش داده میشه. یه سری ثبات به نام های: EPMCH0 تا EPMCH7 وجود دارن که با این ثبات ها میتونیم دقیقا مشخص کنیم که کدوم بایت از پنحره توی محاسبه CRC مشارکت داشته باشن. تعداد EPMCH ها 8 تا هستن و هر کدوم هم 8 بیتی، بنابراین 64 بیت داریم که هرکدوم به یکی از بایت های پنحره 64 بایتی اشاره میکنن و مثلا اگه بیت اول از EPMCH1 مقدار 1 داشته باشه، اولین بایت پنجره منتخب توی محاسبه CRC شرکت داره و باقی بایت ها هم به همین منوال. شکل زیر بهمون نشون میده این فیلتر چطوری کار میکنه.

ENC28J60

۵. Magic Pattern Filter
اول باید بدونیم Magic Packet ها چین. این Packet با فریم های اترنت حمل میشن و کاربردهای متنوعی دارن. یکی از جالب ترین کاربردهاشون روشن کردن کامپیوترها از طریق LAN هستش همون قابلیتی که ما به اسم Wake On Lan یا WoL میشناسیمش. Magic Packet ها الگوی خاصی دارن تا بتونن بدون نیاز به پشته شبکه پردازش بشن. ابن الگو به این صورته که ابتدای بسته 6 بایت متوالی با مقدار 0xFF قرار میگیره و بعدش 16 بار آدرس MAC مقصد تکرار میشه. شکل زیر این الگو یا ساختار را نمایش میده:

ENC28J60

نکته مهم اینکه Magic Packet ها فقط در صورتی میتونن پردازش بشن که آدرس مقصدشون آدرس تراشه ENC28J60 باشه.

۶. Hash Table Filter
این فیلتر مقدار CRC را برای آدرس مقصد فریم محاسبه میکنه و مقدار حاصله به یک بیت از مجموعه ثبات های EHT اشاره خواهد کرد. در صورتی که مقدار بیتی که به آن اشاره می‌شود مقدار 1 داشته باشد فریم مورد نظر از فیلتر عبور خواهد کرد. ما 8 تا ثبات EHT هشت بیتی داریم و جمعا 256 بیت داریم. فرض کنیم حاصل CRC برای آدرس MAC مقصد فریم مقدار 0x05 شده است. در صورتی که بیت پنجم از مجموعه 256 بیت EHT با مقدار 1 تنظیم شده باشد، فریم مورد نظر از فیلتر Hash Table عبور خواهد کرد در غیر اینصورت فریم دور ریخته خواهد شد.

پیکربندی فیلترها:

حالا که فهمیدیم انواع فیلترها کدومن بریم ببینیم چطور میشه ENC28J60 را برای اعمال این فیلترها پیکربندی کنیم. برای پیکربندی فیلترهای ثباتی بنام ERXFCON در اختیار ما هستش. اگه همه بیت های این ثبات مقدار صفر داشته باشه حالت Promiscuous فعال میشه. این یعنی اینکه همه فریم های دریافتی پذیرش و پردازش میشن. اما هر کدوم از این بیتها نقش خاصی به عهده دارن که در ادامه با هم بررسیشون میکنیم:

ANDOR: بیت کنترل کننده AND و OR:

UCEN: بیت کنترل فیلتر Unicast

CRCEN: بیت کنترل فیلتر CRC معتبر

PMEN: بیت کنترل فیلتر Pattern Match

HTEN: بیت کنترل فیلتر Hash Table

MCEN: بیت کنترل فیلتر Multicast

BCEN: بیت کنترل فیلتر Broadcast

شکل زیر جزئیات بیت های ERXFCON را نمایش میده.

ENC28J60

کنترل جریان در ENC28J60:

برای اینکه دقیق بدونیم کنترل جریان چه کاری انجام میده اول باید راجع به مودهای کاری ENC28J60 بدونیم. این تراشه و اکثر تراشه های شبکه که با سرعت های 10/100Mbps کار میکنن توی دو مود مختلف میتونن با شبکه مبادله داده انجام بدن. این دو مود را به عناوبن: Full-Duplex و Half-Duplex میشناسیم. وقتی تراشه توی مود Half-Duplex کار میکنه در توی یک لحظه یا میتونه پالس های الکتریکی را از Wire یا رسانه برداره یا روی رسانه پالس الکتریکی ارسال کنه. درواقع نمیتونه بصورت همزمان این کارو انجام بده. اما وقتی تراشه شبکه توی مود Full-Duplex کار میکنه میتونه بصورت همزمان هم روی رسانه پالس الکتریکی ارسال کنه و هم پالس الکتریکی دریافت کنه. در حالت Half-Duplex تراشه ابتدا از عدم وجود پالس الکتریکی روی رسانه اطمینان حاصل میکنه و در صورتی که رسانه آزاد باشد پالس های الکتریکی متناظر با بیت های فریم را روی رسانه ارسال میکنه. اگه حین این ارسال تراشه دیگه ای اقدام به ارسال پالس روی رسانه کنه پالس ها و متناظر با آن بیت ها آسیب خواهند دید. وقتی این شرایط رخ میده میگیم تصادم یا Collison رخ داده. موقع ایجاد تصادم ENC28J60 میتونه دو تا کار انجام بده:

۱. اگه تصادم قبل از ارسال تعداد بایت هایی که توسط Collision Window در ثبات MACLCON2 تعریف شده است رخ بده، بیت TXRTS از ثبات ECON1 همچنان یک باقی می مونه و یک تاخیر تصادفی که جزئیاتش توی IEEE802.3 تعریف شده، توسط ENC28J60 در ارسال مجدد فریم اعمال می شه و پس از این تاخیرENC28J60 برای ارسال مجدد فریم تلاش می کنه. اگر تعداد دفعاتی که عملیات ارسال دوباره توسط ENC28J60 که در ثبات RETMAX ازMACLCON1 تعریف شده، بیشتر بشه، بیت TXRTS از ثبات ECON1 صفر میشه، توی این شرایط MCU باید بیت TXABRT از ثبات ESTAT را چک کنه و دلیل ارسال نشدن فریم را از بردارهای حالت ارسال بررسی کنه.

۲. اگر تصادم پس از ارسال تعداد بایت هایی که توسط Collision Window در ثبات MACLCON2 تعریف شده است رخ بده، ارسال فریم بلافاصله قطع میشه و هیچ تلاش دوباره ای برای ارسال مجدد توسط ENC28J60 صورت نمی گیره. اگر نود های شبکه بر اساس استانداردهای تعریف شده در IEEE802.3 تنظیم شده باشن، این نوع تصادم اتفاق نمی افته. اغلب این نوع تصادم وقتی رخ می ده که یک نود که در حالت Full Duplex تنظیم شده برای ارسال توی یک رسانه Half Full عمل می کنه. حالا که با مود های عملکرد تراشه شبکه آشنا شدیم بریم سراغ کنترل جریان. موضوع از این قراره که تراشه های شبکه میتونن از نظر قدرت پردازش توی بازه هایی از زمان ناهمگن بشن. مثلا فرض کنید سرعت پردازش بسته ها توسط یک واحد پردازشی کم باشه. این باعث میشه بافر دریافتش زودتر پر بشه و با پر شدن بافر دریافت دیگه تراشه نتونه فریم دریافت کنه. توی این شرایط همه فریم های موجود روی رسانه از بین میرن. برای اینکه جلوی این اتفاق گرفته بشه تراشه ای که زودتر بافر دریافتش پر میشه میتونه به فرستنده این موضوع را اطلاع بده. به محض اطلاع فرستنده از این موضوع اون میتونه تا اطلاع ثانوی از آزاد شدن بافر گیرنده، بهش فریم ارسال نکنه. به این مکانیزم کنترل جریان میگن. کنترل جریان برای هر کدوم از این مودها متفاوته و جداگانه بررسی میکنیمشون.

کنترل جریان در مود Half-Duplex:

اصولا کنترل جریان توی این مود توصیه نمیشه، مگه اینکه فقط دو نود به شبکه متصل باشن. توی این حالت فرستنده با ارسال بایت های بیخودی روی رسانه، رسانه را مشغول نگه میداره. MCU میتونه با 1 کردن بیت FCEN0 از ثبات EFLOCON کنترل جریان را روشن کنه و ENC28J60 جریان پیوسته ای از Preamble با مقدار 0x55 را روی رسانه ارسال کنه (همون بایت های بیخودی) و اینجوری رسانه برای ارسال فریم توسط سایر نودها آزاد نمی شه. بعد MCU با 0 کردن بیت FCEN0 از ثبات EFLOCON، کنترل جریان را میتونه خاموش و رسانه را آزاد کنه. وقتی که مقدار0x55 روی رسانه منتقل میشه MCU با 1 کردن بیت TXRTS از ثبات ECON1 میتونه از ENC28J60 بخواد تا فریمشم روی رسانه منتشر کنه. وقتی این بیت روشن میشه ENC28J60 اول ارسال مقدار 0x55 را متوقف میکنه و بلافاصله یک Inter Packet gap روی رسانه ارسال میکنه و بلافاصله بعد این فریم را روی رسانه قرار میده.

کنترل جریان در مود Full-Duplex:

در Full Duplex کنترل جریان، توسط فریمی به نام Pause Control که جزئیاتش توسط IEEE802.3 تعریف شده است انجام می شه. این فریم 64Byte طول داره که شامل یک آدرس MAC مقصد Multicast رزرو شده با مقدار01:00:00:C2:01:80، آدرس MAC مبدا فرستنده، یک کد عملیاتی خاص، دو بایت به نام Pause Timer و مقادیر Padding و CRC هستش. در حالت عادی، هنگامی که یک فریم Pause Control توسط ماژول MAC دریافت میشه، ماژول MAC پس از اتمام ارسال فریم جاری، ارسال سایر فریم ها را به تاخیر می اندازه، که مقادیرPause Timer برای کنترل این تاخیر مورد استفاده قرار می گیره. اگر یک فریم Pause Control دوباره دریافت بشه این تاخیر بر اساس مقادیر جدید بروز رسانی میشه. جهت فعال کردن کنترل جریان در حالت MCU ،Full Duplex باید بیت های TXPAUS و RXPAUS را از ثبات MACON1 روشن کنه، و هروقت به دلیل هجوم زیاد فریم ها با محدودیت RX Buffer مواجه شد، کنترل جریان، با نوشتن مقدار 0x02 در ثبات EFLOCON توسط MCU روشن میشه، ENC28J60 به صورت دوره ای فریم Pause Control را با مقدار Pause Timer براساس محتوای ثبات EPAUS ارسال می کنه. وقتی که حافظه RX Buffer آزاد می شه، MCU باید محتوای ثبات EFLOCON را به 0x03 تغییر بده. به این ترتیب کنترل جریان با ارسال یک فریم Pause Control با مقدار Pause Timer = 0x0000 خاموش می شه.

جمع بندی:

خوب تا اینجا کامل با سخت افزار ارتباط با دنیای شبکه های کامپیوتری آشنا شدیم. فهمیدیم وظیفه یک کنترلر شبکه یا کارت شبکه یا تراشه شبکه چی هست و چه معماری داره و چطور کار میکنه. حالا یه سنس عالی از کارهایی که برای ارسال فریم روی رسانه شبکه اترنت لازمه داریم. از پست بعدی میریم سراغ لایه های بالاتر و اینکه چطور پشته شبکه فریم های اترنت را پردازش میکنه.

پیروز باشید.