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

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

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

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

به پایان آمد این دفتر ......


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

ولی این چها سال خیلی زود گذشت. انگار همین دیروز بود که بابا خبر قبولی رو بهم داد. وقتی این خبروشنیدم اصلا باورم نمی شد. از بچگی رویام قبولی تو رشته کامپیوتر بود.
اولین روزی که برای ثبت نام رفتم دانشگاه ، انگار که جو گیر شده باشم 20 واحد گرفتم!!!!!!!!!!!!!!
ترم اول با اون درس مبانی برنامه نویسی و استاد محترمه فوق العاده باسواد!!!!! حال همه بچه ها اساسی گرفته شد. ولی ترم 2 تلافی کردن و برای درس برنامه نویسی پیشرفته یه استاد ماه آوردن که حقیقتا با اون استاد بود که تازه فهمیدیم برنامه نویسی یعنی چی!
.....طفلی این استاد که از وضعیت اسف بار ترم قبل ما خبر نداشت، همون روزای اول حالش گرفته شد، قهر کرد!!!! حالا کی حوصله منت کشی داره؟؟ما هم که اصلا آدمی نبودیم که زیر بار این حرفا بریم! یعنی چی بریم بریم منت یه پسرو بکشیم؟!؟! اصلا.............
ولی بماند که منت کشی هم کردیم ، دوباره آوردیمش سر کلاس!


یادش بخیر داستانهای بیل گیتس و دوستان!!!
ترم 5 و 6 ، هر هفته چهارشنبه ها سریال بیل گیتس اینا!! داشتیم.سر کلاس مهندسی نرم افزار 1 و 2 که انصافا اعتراف می کنم نود درصد مهندسیم رو مدیون این استادم.
مهندسی نرم افزار 2 و مدیربازی و جلسات Leader ها که مجبورمون می کرد چهارشنبه ها تا ساعت 10 شب به خونه نرسیم.
اگه هیچ نتیجه ای هم نداشت، که واقعا داشت . یکم حس مدیر بودنو تجربه کردیم.آی حال داد.......
و کلاس های شیوه ارائه که تو اون کلاس ها حتی شیوه زندگی روهم یاد گرفتیم. کلاسمون رو بچه های صنایع اشغال کرده بودن.

 هر چی هم سنگ زدیم!!!!!!!! مین کار گذاشتیم و نارنجک انداختیم نتونستیم این رژیم غاصب رو سرنگون کنیم.آخه بچه های رشته صنایع که همه درساشون ارائه داره باید با دانشجوی کامپیوتر تو یه کلاس سنجیده بشه؟!
و درس ذخیره و بازیابی و Data Base و پروژش که ..................... شرمنده .اینو دیگه واقعا روم نمی شه درباره اش چیزی بگم.دانشجو ها که هیچ، سایر اساتید و حتی کارمندا هم میشناختند این موجود خارق العاده رو.
و از همه این ها هم که بگذریم.گل سر سبد این چهار سال و کلاس های مفرح............جون.درس شبکه و یه استاد شنگول که تقریبا هر هفته هم کلاسهای 3 ساعتی ما به 4،5 و گاهی هم 6 ساعت به درازا می کشید. اگه تا 10 ساعت هم طول می کشید همه با جون و دل میموندن.چون هم فوق العاده درس می داد و هیچ کسی هم اصلا احساس خستگی نمی کرد.


بیچاره بچه های مهندسی اینترنت که بعد از ما با این استاد کلاس داشتند. همیشه کلاسشون دودر بود.
و سال آخر...............
سال آخر که دیگه ارشدای دانشگاه بودیم. از تابستون مرکز تحقیقات رو اشغال کردیم!! کل زندگیمون تو مرکز تحقیقات بود.
و موقع انتخاب واحد که ما هر چی گرفتیم، اینا هی حذف کردن.به هفته التماس کردیم که آخه قربونتون بریم یه درس اختیاری بدین . بعضی از بچه ها داشتن حذف ترم می شدن.

آخرش هم چی دادن؟!؟! حسابداری!!!!!!!!!!!!!!!!!!!!! آخه حسابداری چه ربطی به مهندس کامپیوتر داره؟!
شاید هم داره ، ما نمی دونیم.!!
بعد هم کلی نامه و عریضه که خوب باشه. حالا این ترم نشد، حداقل ترم بعد یه واحد آبرومند بدین که بعدا رومون بشه بگیم تو دانشگاه این واحد اختیاری رو پاس کردیم.!ولی انگار که................

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

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

 

بچه ها همتونو دوست دارم و دلم براتون تنگ میشه.

مقایسه 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 بیت حفظ بشه از این بیت ها با مقادیر الکی!! استفاده میشه.