دستدادن سهمرحلهای TCP
جواب کوتاه
دستدادن سهمرحلهای سه تا پیام کوتاهه که TCP قبل از هر اتصال میفرسته تا دو طرف مطمئن بشن اون یکی آمادهست و شمردن همدیگه رو بدونن. اولی SYN میفرسته (آمادهای؟ شمردن من از اینجاست)، دومی SYN-ACK (شنیدم؛ شمردن من از اینجاست)، و اولی ACK (شنیدم). از اون به بعد دادهها رد و بدل میشن، و آخر کار هر طرف با FIN اتصال رو میبنده.
سه تا کلمه
- SYNاز synchronize، یعنی «هماهنگ کردن»: پیامی که میگه «میخوام شروع کنم، و شمردن من از این عدده».
- ACKاز acknowledgment، یعنی «رسید»: پیامی که میگه «شنیدم، و منتظر این شمارهام».
- FINاز finish، یعنی «پایان»: پیامی که میگه «من دیگه چیزی نمیفرستم».
یه مبل سنگین
مثلا فرض کنید دو نفر میخوان یه مبل سنگین رو با هم بلند کنن. اگه یکی بیخبر بلند کنه و اون یکی آماده نباشه، مبل میفته. پس اول از هم میپرسن و مطمئن میشن هر دو آمادهن و صدای همدیگه رو میشنون، بعد با هم میشمرن.
TCP هم قبل از فرستادن هر دادهای همین کار رو میکنه (درس TCP و UDP). به این کار میگن دستدادن سهمرحلهای ، انگلیسیش three-way handshake. سرور از قبل روی پورت خودش منتظره (درس پورت)، و دستگاه شما شروع میکنه.
سه تا پیام، قدمبهقدم
شمارهها از نزدیک
همین سه تا پیام رو با شمارههاش ببینید. هر فلش یه پیامه و زمان از بالا به پایین میره. SEQ شمارهی ترتیب فرستندهست و ACK شمارهای که منتظرشه:
الف میگه از ۱۰۰ میشمره. ب با ACK=101 میگه پیام ۱۰۰ رو گرفته و منتظر ۱۰۱ هست، و شمردن خودش رو از ۳۰۰ میذاره. الف با ACK=301 همینو به ب میگه. دقت کنید پیام ACK خودش شمارهای مصرف نمیکنه؛ برای همین اولین دادهی الف هم SEQ=101 هست. عددهای ۱۰۰ و ۳۰۰ فقط مثالن: هر طرف برای هر اتصال یه شمارهی شروع ۳۲ بیتی تازه انتخاب میکنه، و این عدد نباید قابل حدس زدن باشه.
چرا سه تا، نه دو تا
با دو تا پیام، الف میفهمه ب آمادهست؛ ولی ب هنوز نمیدونه صدای خودش به الف رسیده یا نه، و نمیدونه الف شمردن اونو گرفته یا نه. پیام سوم همینو به ب میگه.
دلیل مهمتر، پیامهای کهنهست. گاهی یه درخواست اتصال قدیمی، که یه مدت توی راه مونده، دیر به سرور میرسه. اگه دو تا پیام بس بود، سرور با همون درخواست کهنه یه اتصال برقرار میکرد که هیچکس نخواسته. با پیام سوم، الف میتونه بگه «اینو من نخواستم» و با یه پیام به اسم reset ردش کنه. سند TCP همینو دلیل اصلی سهمرحلهای بودن میدونه.
زمین گذاشتن: چهار تا پیام
وقتی کار تموم شد، هر کدوم سر خودش رو زمین میذاره و به اون یکی خبر میده. توی TCP هم هر طرف جدا میگه «من دیگه چیزی نمیفرستم» (FIN) و طرف مقابل رسید میده. طرفی که زودتر FIN داده، تا وقتی اون یکی نبسته، هنوز میتونه داده بگیره.
پس بستن معمولا چهار تا پیامه. آخر کار، طرفی که اول بسته بود، یه کم صبر میکنه، به اندازهی دو برابر بیشترین عمر یه بسته توی شبکه، تا اگه یه پیام سرگردون توی راه مونده، با اتصال تازه قاطی نشه.
وقتی یکی فقط میپرسه
سرور برای هر SYN که میگیره، یه جا کنار میذاره و منتظر پیام سوم میمونه. حالا فرض کنید یکی هزاران SYN بفرسته و هیچوقت ACK نفرسته؛ مثل کسی که مدام میپرسه «آمادهای؟» و هیچوقت مبل رو بلند نمیکنه. جاهای سرور پر میشه و برای آدمهای واقعی جایی نمیمونه.
به این حمله میگن SYN flood . سیستمعاملها معمولا راههایی برای جلوگیری ازش دارن، و جزئیاتش توی درس «حملههای رایج شبکه» میاد.
سه تا اشتباه رایج
- «دستدادن برای هر بسته تکرار میشه.»نه. فقط یه بار، اول هر اتصال. بعدش دادهها با همون شمارهها و رسیدها رد و بدل میشن تا اتصال بسته بشه.
- «شمردن هر دو طرف از صفر شروع میشه.»نه. هر طرف شمارهی شروع خودش رو انتخاب میکنه، برای هر اتصال یه عدد تازه. اگه بشه حدسش زد، از نظر امنیت مشکل داره.
- «بستن اتصال هم سه تا پیامه.»نه. بستن معمولا چهار تا پیامه، چون هر طرف جدا میگه کارش تموم شده و اون یکی جدا رسید میده.
جمعبندی. آنچه از این درس با خودتان میبرید.
- سه تا پیام: SYN، SYN-ACK، ACK؛ بعد داده.
- هر طرف شمارهی شروع خودش رو میگه؛ ACK یعنی «منتظر این شمارهام»، یکی بیشتر از اونی که رسید.
- سه تا پیام لازمه تا هر طرف مطمئن بشه صدای خودش هم رسیده، و اتصالهای کهنه قاطی نشن.
- بستن معمولا چهار تا پیامه: FIN و ACK از هر طرف.
- SYN flood یعنی فرستادن کلی SYN بی ACK، تا جای سرور پر بشه.
خودتان را بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخر آزمون فقط کارنامه را میبینید: چند درست، چند نادرست.