وبلاگ جوجه مهندس ها

یادداشت های دو دانشجوی مهندسی کامپیوتر

وبلاگ جوجه مهندس ها

یادداشت های دو دانشجوی مهندسی کامپیوتر

مقایسه TCP و UDP _قسمت دوم

 UDP

 

UDP از حروف اول کلمات User Datagram Protocol گرفته شده و یک پروتکل غیر اتصال گرا (Connectionless) است که مثل TCP در بالاترین لایه اجرا می شود. برخلاف TCP در پروتکل UDP امکان بروز خطا وجود دارد.

تشریح کامل آن در RFC 768 آمده. یک ارتباط غیراتصال گرا بین دو هاست برقرار می کنه و هر بسته از داده کاربر و کمترین میزان سرایند تشکیل شده که به آن UDP دیتاگرام گفته می شود.

UDP غیراتصال گرا است .یعنی یک دیتاگرام در هر لحظه ای میتونه ارسال بشه ، بدون نیاز به هر گونه اعلام قبلی، مذاکره و یا هیچ آماده سازی از قبل.فقط داده رو ارسال می کنه و امیدواره که گیرنده داده ها رو دریافت کنه.

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

مهمترین محاسن UDP اینه که محدوده داده ها در ائن مشخص شده ، در ارسال های broadcast میشه از این پروتکل استفاده کرد و همچنین سریعه.

و مهمترین معایب غیرقابل اعتماد بودن آن و در نتیجه پیچیده بودن برنامه نویسی در سطح لایه application است.

 

و اما قالب بسته UDP :

 

UDP header

 

همین طور که در شکل می بینید :

·               Source Port : یک فیلد اختیاری برای شماره پورت فرستنده. اگر شماره پورت مشخص نشه در این فیلد 0 قرار میگیره.

·               Destination Port : شماره پورت مقصد

·               Length : طول دیتاگرام، شامل Header و داده اصلی

·               Checksum: کد کشف خطا. این فیلد در Header بسته UDP اختیاریست.

 

 آدرس دهی

TCP و UDP از یک مدل آدرس دهی استفاده می کنند : یک آدرس IP و شماره پورت مورد نظر.

آدرس IP برای هدایت بسته به هاست منظور در شبکه ی مشخص شده و شماره پورت برای هدایت به پروسه منتظر. معمولا یک پورت برای یک برنامه اختصاص داره.

 

محاسن TCP

  • سیستم عامل همه کار رو برای شماانجام میده. دیگه باگهای ابتدائی که هر کس در اولین کارش با اون ها روبرو میشه رو مرتکب نمیشید. برای اینکه تمام این ها برای ما توسط سیستم  عامل انجام و رفع شده.
  • کارهائی که سیستم عامل برای دریافت و ارسال بسته های TCP انجام میده نیازی به سوئیچ لز مود کرنل به مود کاربر نداره. چون اغلب کارها مثل اسمبل کردن مجدد بسته های رسیده، پاسخ مبنی بر دریافت بسته ها (ACK) ، گزارش خطاها،و... توسط کرنل انجام می شود.
  • TCP سه چیز رو برای شما گارانتی میکنه : داده های ما به مقصدبرسه ، داده ها با ترتیب صحیحی برسه ، داده ها بدون تکرار در مقصد دریافت شود.
  • مسیریاب ها در مواجهه با بسته هایTCP رفتارهای خاص متناسبب رو انجام میدن . مثلا در صورت لزوم می تونند تقاضای ارسال مجدد بسته کنند.

 محاسن UDP

  • محدود و ملزم به رعایت از مدل ارتباطی connection oriented نیستیم.
  • کنترل خطاها، پاسخ به فرستنده (ACK) و... به برنامه بستگی داره و ما به عنوان برنامه نویس ویژگیهائی را که نیاز داریم پیاده سازی و استفاده می کنیم.
  • انتقال های broadcast و multicast در UDP امکان پذیره.

 معایبTCP

  • اگر سیستم عامل باگ داشته باشه، ما نمیتونیم از دست این باگ راحت بشیم.ممکنه برای چیزی که ما می خواهیم موثر نباشه و کارا نباشه ولی ما مجبوریم که از همون استفاده کنیم.
  • TCP ویژگیهای فوق العاده ای رو برای شما فراهم می کنه که شاید خیلی از اونها رو نیاز نداشته باشید. در نتیجه برای کار شما، پهنای باند و یا زمان رو هدر میده و بیخود صرف می کنه.
  • در TCP داده ها هیچ محدوده ای مشخص نشده و ما باید خودمان محدوده داده را مشخص کنیم.
  • TCP برای انتقال های broadcast و یا multicast نمیتونه مورد استفاده قرار بگیره.

 معایب UDP

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

مقایسه TCP و UDP _قسمت اول

TCP_IP

TCP و UDP دو پروتکل معمول لایه انتقال یا همون Transport Layer در مدل TCP/IP است. که الان می خواهیم تفاوت این دو تا رو یادبگیریم.

 

TCP

TCP از حروف اول کلمات Transmission Control Protocol  گرفته شده  و یکی از پروتکلهای اصلی در شبکه های مبتنی بر TCP/IP است.

TCP برقرارای ارتباط بین دو هاست و انتقال داده بین اون ها رو برقرار و صحت انجام این کار رو ضمانت می کنه .

TCP در RFC 793 به طور کامل تشریح شده. و سه ویژگی رو برای اون ذکر کرده :

Connection Oriented

Reliable

Stream Oriented

یک پروتکل اتصال گرا (Connection Oriented) یعنی قبل از اتقال واقعی داده بین دو هاست باید ارتباط بین آن ها برقرار یا اصطلاحا باز شود. ارتباط به صورت full duplex است یعنی ارسال و دریافت داده ها بر روی یک خط ارتباطی میسر است. همچنین پس از انتقال داده باید این اتصال رو بست تا منابع سیستم آزاد بشه. هر دو هاستی که در دو سمت این اتصال قرار دارند از باز بودن و شروع اتصال و همچنین از پایان آن اطلاع دارند. و انتقال داده ها بدون توافق طرفین اتصال بر برقراری اتصال امکان پذیر نیست.

Reliable یعنی قابل اعتماد. به این مفهوم که صحت ارسال و دیافت داده ها رو تضمین می کنه.

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

ایزوله کردن این سرویس ها در سطح یک لایه، به برنامه های کاربردی ما این امکان رو میده که بدون نیاز به کنترل خطا ها و در نظر گرفتن اونها طراحی و پیاده سازی بشه.

 

 

 برقراری ارتباط و ارسال داده

پیام از یک application در لایه بالایی که همون application layer سرچشمه میگیره و در قالب Stream یعنی جریانی از کاراکتر ها به صورت آسنکرون به لایه transport فرستاده میشه.

این مساله در مقابل بسیاری از پروتکل های دیگه که داده ها در قالب بلاک هایی با اندازه ثابت دریافت می کنند قرار گرفته.

لایه انتقال داده ها رو میگیره و در قالب سگمنت هایTCP (یا UDP )باز سازی کرده و اطلاعات اضافی مربوطه را در قالب  Header های سگمنت ابتدای داده اضافه میکنه.اگر ارتباط دو طرفه ای مثلTELNET یا FTP مورد نیاز باشه. یک ارتباط (virtual circuit) بین ماشین فرستنده و گیرنده برقرار میشه.

پروسه با تقاضای یک ارتباط TCP از طرف ماشین فرستنده به ماشین گیرنده شروع میشه. در این پیام یک عدد یکتا به نام socket number ، ارتباط ماشین فرستنده را مشخص میکنه. ماشین گیرنده هم شماره سوکت خودش رو به ماشین فرستنده ارسال میکنه. این دو شماره سوکت ارتباط بین دو ماشین رو تا زمان اتمام کار تعیین میکنه.

بعد از اینکه این ارتباط بین بین ماشینهای گیرنده و فرستنده برقرار شد، پیام به لایه IP که که داده ها را در قالب دیتاگرام بر روی شبکه منتشر می کند، انتقال داده می شود.

لایه IP میتونه هر عملیاتی از قبیل قطعه قطعه سازی و یا جمع کردن قطعه ها و تبدیل آن به پیام اولیه در سمت ماشین گیرنده را انجام بده.که چگونگی این عمایات برای لایه انتقال قابل درکه.

بعد از اینکه بسته TCP مسیر طولانی و پر پیچ و خم!! خودش رو در شبکه طی کرد و به ماشین گیرنده رسید به لایه TCP تحویل داده میشه و این لایه هم به لایه بالایی خودش که برنامه کاربردی قرار گرفته تحویل میده.

اگر بسته TCP از چند سگمنت تشکیل شده باشه، نرم افزار لایه TCP در ماشین گیرنده سگمنت ها رو جمع آوری کرده و با توجه به فیلد sequence number که در header سگمنت ها قرار داده شده، به ترتیب پشت سر هم قرار میده .

در صورتی که اطلاعات بدون خطا در ماشین گیرنده دریافت بشه، ماشین گیرنده پاسخی مبنی بر دریافت داده ها به ماشین فرستنده (ACK) ارسال میکنه.

 

ولی اگر بسته به صورت صحیح دریافت نشه چی !!

هیچی !در این حالی ماشین گیرنده هیچ پاسخی برای فرستنده نمی فرستد.اصطلاحا پاسخ (NAK) نمیده. کاملا مودبانه ، هیچ سرو صدایی راه نمیندازه که آقا جون این بسته نرسیده!!! از اون طرف ماشین فرستنده یک تایمر داره که اگر زمان معمول در نظر گرفته شده برای برای دریافت پاسخ (ACK) سپری شد ولی پاسخ نیامد، متوجه میشه که بسته نرسیده یا خراب شده و بسته را دوباره ارسال می کنه.

 

قالب این بسته TCP چه جوریه؟؟

شکل زیر ساختار header یک بسته TCP رو نشون میده.

TCP Header

·               Port : یک فیلد 16 بیتی که شماه پورت و در واقع برنامه کاربردی در ماشین فرستنده را مشخص میکنه.

·               Destination port : فیلد مشابه ، اما آدرس پورت ماشین گیرنده.

·               Sequence Number : شماره ا که موقعیت بلاک جاری در کل پیام رو مشخص میکنه.که ماشین گیرنده برای رسیدن به پیام ارسال شده و سر هم گذاشتن قطعه های دریافت شده از این فیلد استفاده میکنه.

·               Acknowledgement Number : شماره ای که seq no. بعدی مورد انتظارش رو مشخص میکنه. و این نشون میده که بسته با seq no. قبلی دریافت شده. در واقع نشاندهنده آخرین seq no. دریافت شده است +1

·               Data offset : این فیلد برای تعیین شروع فیلد data که داده اصلی ارسالی است، استفاده میشه. عددی که در این فیلد قرار می گیره، طول سرآیند بسته TCP را بر اساس کلمات 32 بیتی تعیین میکنه. مثلا اگر در این فیلد عدد 7 قرار داده بشه( 224 = 32 * 7   )224 بیت یا در واقع 28 بایت برای header و بقی داده است.(توجه کنید که طول header ثابت نیست.)

·               Reserved : 6 بیت رزرو شده برای روز مبادا!! شاید در آینده مورد استفاده قرار بگیره.

 

6 بیت بعدی نقش چند پرچم را بازی می کنند.

·                URG :اگر 1 باشه یعنی مقداری که در فیلد Urgent Pointer (در ادامه...) قرار گرفته مقدار معتبری است.

·               ACK : اگر 1 باشه نشاندهنده اعتبار فیلد Acknowledgement Number است.

·               PSH : اگر 1 باشه، تعیین میکنه که تابع Push باید اجرا بشه. در واقع با این فیلد فرستنده از گیرنده تقاضا میکنه که که داده های این سگمنت رو بافر نکنه و سریع برای پردازش های بعدی تحویل برنامه بده.

·               RST : اگر 1 باشه یعنی اشکالی ( سخت افزاری یا نرم افزاری) به وجود آمده و ارتباط باید reset بشه.

·               SYN : در هنگام برقراری ارتباط از مقدار 1 در این فیلد استفاده میشه.

·               FIN : خاتمه ارسال

·               Window : تعداد بلاک های دیگری که که ماشین گیرنده می تونه بپذیره، با مقداردهی در این فیلد مشخص میشه.اگر صفر باشه یعنی بافر گیرنده پر شده و اگر دوباره داده ای ارسال بشه!! دور ریخته میشه.!

·               Checksum : کد کشف خطا

·               Urgent Pointer : قبلا گفتیم که اگر بیت URG 1 باشه یعنی مقداری که در فیلد Urgent Pointer قرار گرفته معتبره. حالا ببینیم تو این فیلد چی باید قرار بگیره؟؟؟ اشاره گری در این فیلد قرار می گیره که موقعیت داده های اضطراری رو در بسته TCP مشخص میکنه. لایه TCP هیچ پردازشی روی این داده ها انجام نمیده و لایه بالاتر که برنامه کاربردی قرار داره، پردازش لازم روی داده ها انجام میده.

·               Options : فعلا فقط 3 تا option تعریف شده:

 0  ، انتهای لیست Option ها

  1 ، هیچی!!!

  2 ، ماکزیمم اندازه سگمنت

Padding: برای اینکه طول header به صورت ضریبی از 32 بیت حفظ بشه از این بیت ها با مقادیر الکی!! استفاده میشه.

این IP چقدر با کلاسه!!

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

 

حالا این آدرس IP چی هست؟؟؟

آدرس IP یک عدد 32بیتی (4بایتی) است که با روش و قاعده خاصی، یک آدرس یکتا به کامپیوتر متصل به شبکه نسبت میده. معمولا به صورت4 بایت که با نقطه از هم جدا میشوند نشون داده میشه مثلا آدرس 150 . 10 . 223 . 70 .

و البته خیلی هم با کلاسه.

آدرسهای IP به پنج کلاس A,B,C,D,E تقسیم میشه .

 

با کلاس ترین آدرس: آدرسهای کلاس A

 

 

class A

 

آدرس هایی در کلاس A قرار دارند که با ارزش ترین بیت آن ها 0 باشد.در این آدرسها 7بیت بعدی آدرس شبکه و 24 بیت باقی مانده متعلق به ماشین های هاست است.با توجه به اینکه با ارزش ترین بیت مقدار 0 داره، پس بایت با ارزش آدرس های کلاس A در محدوده دهدهی صفر تا 127 تغییر میکنه وبه هیچ وجه نمیتونه اعداد صفر و 127 باشه.چرا که این اعداد در شبکه معنای دیگری دارند.

 

 24 بیت یا به عبارتی 3بایت هم باقی میمونه برای آدرس ماشین های میزبان که با این همه میشه تقریبا حدود

224  ماشین رو آدرس دهی کرد.

خیلی شبکه بزرگی میشه...نه؟! پس آدرسهای کلاس A باید به شبکه های بزرگ اختصاص داده بشه که داده هم شده و شرکت های بزرگی که سال ها قبل از پیشگامان اینترنت بودند، این آدرس ها رو تسخیر کردند.

  

آدرس های کلاس B

 

 

Class B

 

 

کلاس B از آدرسهایی تشکیل شده که دو بیت با ارزش از آدرس دارای مقدار 10 باشد.14 بیت بعدی آدرس شبکه و 2 بایت باقی مانده آدرس ماشین های هاست است. اگر معادل دهدهی آدرس IP را در نظربگیریم اگر عدد سمت چپ دارای مقدار 128 تا 191 باشد نشاندهنده کلاس B آدرس می باشد.

 

و اما کلاس C

 

 

Class c

 

 

آدرسهای کلاس C پرکاربردترین آدرس های IP رو تشکیل می دهند. در این کلاس سه بیت ب ارزش آدرس دارای مقدار 110 است و 21 بیت بعدی از سه بایت سمت چپ آدرس متعلق به ادرس شبکه است. و 8 بیت آخر هم ماشین هاست رو مشخص میکنه.

برای تشخیص کلاس آدرس IP که به صورت دهدهی نوشته شده باید به عدد سمت چپ نگاه کنید. اگر عددی بین 192 تا 223 بود ، آن آدرس متعلق به کلاس C است.

 

آدرسهای کلاس D

 

Class D

 

1

در این کلاس چهار بیت با ارزش دارای مقدار 1110 است و سایر بیت ها، یعنی 28 بیت باقی مانده برای تعیین آدرسهای multicast استفاده میشه. از آدرسهای multicast برای ارسال داده به طور همزمان برای چند هاست استفاده می شود.

 

و بالاخره آدرسهای کلاس E

 

 این آدرس ها که 5 بیت با ارزش در آن ها دارای مقدار 11110  است هنوز کاربرد خاصی ندارند .و فقط به عنوان آدرس های کلاس E شناخته و تعریف می شود. ولی شاید در آینده استفاده های جهانی پیدا کنند.