هرچند از بخش option در پروتکل IP فعلا استفاده ای نمیکنیم اما بعضی موارد رو خوب هست که اینجا توضیح بدیم قبل از اینکه از این بخش بگذریم؛ چون این بخش هم مثل چکسام در بسیاری از پروتکلها وجود داره. در پروتکلهایی که در هدر، بخش Option (گزينه) با طول نامشخص دارند، گزينه ها به دو صورت ارسال ميشن:
در پروتكل IP دو گزينه داريم كه فقط بودن یا نبودنشون مهمه و يك بايتي هستند:
گزینه | مقدار داخل بایت |
انتهای لیست گزینهها = End of Option List | 0x00 |
بدون عملیات = No Operation | 0x01 |
گزینه “انتهای لیست گزینهها ” معمولاً در آخر گزینهها قرار می گیره و همون padding هست. چنانچه بخش Option دقیقاً مضربی از 4 باشه، نیازی به استفاده از این گزینه نیست.
گزینه “بدون عملیات” عموماً در بین گزینهها استفاده میشه؛ برای اینکه شروع گزینه بعدی دقیقاً روی آدرس با مضرب 4 بیفته (برای راحتی پردازش). توجه داشته باشید که هر دوی این گزینهها اختیاریست و نوع استفاده از اون به نظر برنامهنویس بستگی داره.
حالت دیگه برای Option اینه که همونطور که گفتیم چند بایتی و به فرم زیر باشن. بایت اول نوع (Type or Kind) گزینه، بایت دوم طول بایتهای اشغال شده توسط گزینه (Length) و بایتهای سوم به بعد اطلاعات یا مقادیر گزینه (Value). در بعضی پروتکلها، در بایت دوم یعنی “طول بایتهای گزینه” دو بایت نوع و طول هم به حساب میان؛ لذا در این حالت، کمترین مقدار اندازه گزینه، عدد 2 خواهد بود؛ بدین معنی که گزینه فاقد داده یا مقدار هست!
بهعنوانمثال فرض کنید گزینة نوع 7 ، دارای سه بایت داده با ارقام 0x0A,0x0B,0x0C هست؛ لذا در فرم اول این گزینه، اینطوری پیاده سازی میشه 0x07,0x03,0X0A,0X0B,0X0C و در حالت دوم به صورت 0X07,0X05,0X0A,0X0B,0X0C پیاده سازی خواهد شد. به این فرمت اصطلاحا TLV گفته میشه که سرنام کلمات Type,Length,Value هست و پروتکل IP از فرم دوم اون استفاده میکنه (یعنی در بخش Length تعداد بایت های نوع و طول هم لحاظ میشه).
همونطور که گفتیم (بسته به تعریف استاندارد پروتکل) ممکنه گزینههایی داشته باشیم كه مقدار تنظيم شونده ندارند؛ اما از فرمت TLV استفاده میکنند؛ مثلاً گزینه شماره 2 در فرم اول بهصورت 0X02,0X00 و در حالت دوم بهصورت 0X02,0X02 ثبت خواهد شد.
مجدد یادآوری میکنیم؛ چنانچه تعداد کل بایتهای یک گزینه مضرب 4 نباشه، معمولا در انتهای این گزینه، از گزینه شماره 1 یا همون No operation استفاده میشه تا هم بین گزینه ها فاصله بندازه و هم گزینه بعدی در آدرسی با مضرب 4 شروع بشه.
و در انتهای گزینهها هم چنانچه جای خالی باقی مونده باشه (بر اساس مقدار HLen)؛ گزینه شماره 0 یا همون End of Option List میتونه استفاده بشه.
مثال: فرض کنید ما دو گزینه با شمارههای 8 و 9 داريم که هر کدام فقط یک بایت مقدار (Value) با مقدار 0x0A دارند. در پروتکل IP این دو گزینه به ترتیب بصورت 0x08,0x03,0x0A و 0x09,0x03,0x0A خواهد بود؛ در نتیجه قسمت Option میتونه همچین شکلی داشته باشه
1 | 0x08,0x03,0x0A,0x01,0x09,0x03,0x0A,0x0 |
از سمت چپ سه بایت اول مربوط به گزینه شماره 8 هستند، از اونجایی که این گزینه، 3 بایت داره؛ برای اینکه گزینه بعدی در آدرس مضرب 4 قرار بگیره یه گزینه 0x01 یا همون No Operation در بایت چهارم قرار گرفته، 3 بایت بعدی گزینه شماره 9 هست و از اونجایی که گزینه دیگه ای نداریم؛ همچنین یک بایت باید اضافه کنیم تا کل بایت های قسمت Option مضربی از 4 باشه؛ در انتهای بایت ها یه بایت 0x00 که همون End of Option List یا padding هست، اضافه شده. اینم فراموش نکنیم که در این وضعیت مقدار HLen عدد 7 خواهد بود (5 برای بخش اصلی هدر بعلاوه 2 که از تقسیم 8 بایت گزینه ها به 4 بدست میاد).
یا اینکه اینطوری باشه:
1 | 0x08,0x03,0x0A,0x09,0x03,0x0A,0x00,0x00 |
همونطور که میبینید؛ دیگه بین گزینهها از No Operation استفاده نشده؛ در عوض مجبور شدیم در آخر بایت ها، دو بایت 0x00 برای padding داشته باشیم.
برگردیم سراغ کدنویسی. تا اینجا پیش رفتیم که داخل تابع ETH_Process بهصورت زیر تست کردیم ببینیم آیا فریم دریافتی شامل پروتکل IP هست یا نه:
1 2 3 4 5 6 7 8 9 | // IP protocol if (etherType == ETH_FRAME_TYPE_IP) // ==0x0800 { responseSize = IP_Process((IP_Frame*)ethFrame->data, ethDataLen); } |
مثل وضعیتی که در برخورد با پروتکل ARP داشتیم در اینجا نیز برای تفکیک بخشهای مختلف هدر و داده در پروتکل IP یک ساختار (struct) بهصورت زیر تعریف میکنیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | typedef struct IP_Frame { uint8_t verHeaderLen; uint8_t diffServices; uint16_ t len; uint16_t fragId; uint16_t fragOffset; uint8_t timeToLive; uint8_t protocol; uint16_t checkSum; uint8_t srcIpAddr [ IP_ADDRESS_BYTES_NUM ] ; uint8_t destIpAddr [ IP_ADDRESS_BYTES_NUM ] ; uint8_t data [] ; } IP_Frame ; |
اگر خواسته باشید در اجرای پروتکل IP بخش Options رو هم در نظر بگیرید؛ از اونجاییکه طول این بخش نامعین هست؛ لذا اون رو هم داخل آرایه data ببینید. طبیعیه که در این حالت، باتوجهبه عدد واقع در بخش Hlen اندازه بخش هدر مشخص میشه، اگر این عدد بزرگتر از 20 بایت باشه (HLen=5) در نتیجه، بخش ابتدایی data مربوط به قسمت Options هست.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.