در شبکه هیچ ارتباطی بهصورت تصادفی و بدون هماهنگی شکل نمیگیرد. هر بار که یک دستگاه میخواهد با دستگاه دیگری ارتباط برقرار کند مثلاً وقتی مرورگر شما به یک سرور وب وصل میشود . پروتکلی به نام TCP پشت صحنه وارد عمل میشود. اولین کاری که این پروتکل انجام میدهد، ایجاد یک اتصال پایدار و قابل اعتماد است؛ فرآیندی که آن را با نام Three-Way Handshake میشناسیم.
Three-Way Handshake درواقع یک گفتوگوی سه مرحلهای میان دو دستگاه است که با پیامهای SYN، SYN-ACK و ACK انجام میشود. این مکانیسم تضمین میکند که هر دو طرف آماده ارتباط هستند، ظرفیت مناسب دارند و میتوانند دادهها را بدون خطا رد و بدل کنند.
دست تکانی 3 مرحله چیست؟
Three-Way Handshake یکی از بنیادیترین مفاهیم در پروتکل TCP است؛ مکانیسمی سهمرحلهای که قبل از آغاز هر ارتباط قابلاعتماد بین دو دستگاه اجرا میشود. وقتی یک کلاینت (مثل مرورگر شما) میخواهد به یک سرور متصل شود، قبل از اینکه حتی یک بایت داده رد و بدل شود، هر دو طرف باید مطمئن شوند که آماده دریافت و ارسال هستند. این هماهنگی اولیه همان چیزی است که به آن Three-Way Handshake گفته میشود.
این فرآیند با تبادل سه پیام ساده اما بسیار مهم انجام میشود: SYN / SYN/ACK / ACK
در ظاهر ساده است، اما پشت این سه پیام مسئلههایی مثل هماهنگسازی شمارهها، مدیریت اتصال، و مطمئنشدن از آمادهبودن هر دو طرف قرار دارد.
یک مثال ساده فکر کن میخواهی با کسی تماس بگیری:
- اول تماس میگیری و میگویی: سلام، صدای منو داری؟ (SYN)
- طرف مقابل جواب میدهد: سلام، دارم میشنوم! تو هم صدای منو داری؟(SYN/ACK)
- تو پاسخ میدهی: آره، صدات میاد. شروع کنیم. (ACK)
حالا ارتباط دوطرفه برقرار شده و مکالمه شروع میشود.
در شبکه هم دقیقاً همین اتفاق میافتد؛ اما کاملاً با عدد، فلگ و بستههای TCP.
اهمیت Three-Way Handshake در ارتباطات TCP
اهمیت Three-Way Handshake فقط این نیست که قبل از ارتباط، یک سلاموعلیکی انجام شود. این فرآیند پایه و اساس اعتماد، هماهنگی و پایداری در ارتباطات TCP است و اگر نباشد، هیچ اتصال قابل اعتمادی شکل نمیگیرد.
Three-Way Handshake چند نقش حیاتی دارد:
تأیید آمادگی هر دو طرف : هم کلاینت و هم سرور باید اعلام کنند که برای تبادل داده آمادهاند.
اگر یکی از طرفها آماده نباشد، اتصال برقرار نمیشود و از مشکلات بزرگتر جلوگیری میشود.
هماهنگسازی Sequence Number ها : TCP باید بداند اولین بایت داده از چه شمارهای شروع میشود.
بدون این مرحله، بستهها ترتیب درست نخواهند داشت و ارتباط پایدار نخواهد بود.
جلوگیری از اتصال اشتباه یا ناقص : اگر فقط یک پیام ارسال شود، ممکن است ارتباط نادرست یا نصفهنیمه شکل بگیرد.
سه مرحله باعث میشود که هیچ اتصال تصادفی یا ناقصی برقرار نشود.
مرحله اول: ارسال SYN
در مرحله اول Three-Way Handshake، کلاینت یک پیام SYN (مخفف Synchronize به معنی هماهنگسازی) برای سرور ارسال میکند تا اعلام کند که قصد راهاندازی یک ارتباط TCP را دارد. در این پیام، کلاینت یک عدد تصادفی به نام ISN – Initial Sequence Number تولید میکند که همان Sequence Number اولیه محسوب میشود. این عدد مهم است، چون TCP یک پروتکل Reliable – قابلاعتماد است و باید بتواند ترتیب دادهها و کنترل گمشدن بستهها را مدیریت کند.
به عنوان مثال اگر ISN کلاینت 1000 باشد، بسته اول شامل SYN=1 و SEQ=1000 است. این یعنی: من میخوام اتصال رو شروع کنم، شماره شروع بستههای من هم اینه. در این مرحله هنوز ACK ارسال نمیشود، چون ارتباط عملاً شروع نشده. در ابزارهای تحلیل بسته مثل Wireshark، این مرحله را معمولاً با Flags = SYN مشاهده میکنیم.
مرحله دوم: پاسخ SYN/ACK
اگر سرور آماده برقراری ارتباط باشد، به SYN کلاینت پاسخ میدهد و یک بسته ترکیبی SYN/ACK ارسال میکند. این بسته دو معنی دارد:
۱) ACK یعنی درخواستت را گرفتم و مقدار آن برابر است با Sequence Number کلاینت بهعلاوه یک واحد؛ مثلاً اگر کلاینت 1000 فرستاده باشد، سرور ACK=1001 میفرستد.
۲) SYN یعنی من هم میخوام این ارتباط را هماهنگ کنم، و سرور نیز یک ISN جدید تولید میکند، مثلاً SEQ=3000.
در نتیجه پیام سرور شبیه این است: پیامت رسید (ACK=1001) و این هم شماره شروع من برای ادامه کار (SEQ=3000). این مرحله بسیار حساس است چون در همین پیام هم تأیید دریافت انجام میشود و هم هماهنگسازی شمارههای سرور. در Wireshark این بخش معمولاً با Flags = SYN, ACK دیده میشود.
تفاوت Three-Way Handshake با Four-Way Handshake
Three-Way Handshake برای شروع ارتباط استفاده میشود، اما Four-Way Handshake برای پایان اتصال به کار میرود. تفاوت اصلی این دو در نحوه مدیریت بستههای FIN و ACK است. هنگام شروع اتصال، SYN و ACK میتوانند در یک بسته ترکیب شوند و همین باعث میشود مرحله آغاز فقط سه پیام داشته باشد. اما در پایان ارتباط، بسته FIN نمیتواند همزمان با ACK طرف مقابل باشد چون هر طرف باید بهصورت جداگانه اعلام کند که ارسال دادهها را تمام کردهام. به همین دلیل خاتمه ارتباط به چهار مرحله نیاز دارد: ابتدا یک طرف FIN میفرستد، طرف مقابل ACK میدهد، سپس خودش FIN میفرستد و دوباره ACK دریافت میکند. این ساختار باعث میشود هیچ دادهای وسط کار حذف نشود و هر دو طرف فرصت داشته باشند ارسالشان را کامل کنند. پس بهطور خلاصه: سهمرحلهای برای شروع، چهارمرحلهای برای پایان ارتباط و این تفاوت حیاتی از نظر امنیت، پایداری و مدیریت وضعیت اتصال است.
نقش Sequence Number و Acknowledgment Number
Sequence Number و Acknowledgment Number دو ستون اصلی امنیت و نظم در TCP هستند. Sequence Number مشخص میکند هر بسته در چه موقعیتی از جریان داده قرار دارد و کمک میکند بستهها حتی اگر با تأخیر یا بینظمی برسند، دوباره بهطور صحیح مرتب شوند. این شمارهگذاری از همان Three-Way Handshake شروع میشود، وقتی هر طرف یک Initial Sequence Number (ISN) تصادفی انتخاب میکند تا امکان حملات حدسزدن شماره بستهها کم شود. در مقابل، Acknowledgment Number نشان میدهد طرف مقابل انتظار دریافت کدام بایت را دارد و این یعنی هر بستهای که میرسد، دقیقاً و درست تأیید میشود. بدون این دو مقدار، TCP نمیتوانست تضمین کند هیچ دادهای گم نمیشود، تکرار نمیشود یا اشتباه چسبانده نمیشود. به همین دلیل برنامههایی مثل بانکداری الکترونیکی، پرداخت آنلاین، انتقال فایل و APIهای مهم کاملاً وابسته به دقت این دو عدد هستند.
بررسی Three-Way Handshake در Wireshark
وقتی ارتباط TCP را داخل Wireshark تحلیل میکنیم، دقیقترین و واقعیترین تصویر از Three-Way Handshake را میبینیم. در این ابزار، شروع اتصال همیشه با سه بسته پشت سر هم مشخص میشود: اول یک بسته SYN از سمت کلاینت، بعد پاسخ SYN/ACK از سرور، و در نهایت ACK از کلاینت. هرکدام از این بستهها شامل اطلاعات حیاتی مثل Sequence Number، Acknowledgment Number، Window Size، Flags و جزئیات لایههای شبکه هستند. تحلیل این بستهها کمک میکند بفهمیم اتصال سالم است یا خیر، آیا تأخیر وجود دارد، آیا بستهها دوباره ارسال شدهاند یا حتی اینکه سرور زیر فشار است. متخصصان امنیت معمولاً با بررسی همین سه بسته علائم حملاتی مثل SYN Flood، Spoofing یا ناهماهنگی در شمارههای Sequence را پیدا میکنند. درواقع Wireshark بهترین پنجره برای دیدن این پروتکل در دنیای واقعی است.
تهدیدات و حملات مرتبط با Three-Way Handshake
هرچند Three-Way Handshake طراحی شده تا اتصال امن و منظم برقرار شود، اما همین ساختار میتواند هدف برخی حملات قرار بگیرد. مهمترین آنها حمله SYN Flood است که در آن مهاجم تعداد زیادی بسته SYN به سرور میفرستد، بدون اینکه مرحله سوم یعنی ACK را ارسال کند. این باعث میشود سرور مجبور شود تعداد زیادی اتصال نیمهکاره نگه دارد و منابعش بهسرعت پر شود. نتیجه؟ کندی شدید یا حتی قطع سرویس. از طرف دیگر حملات TCP Sequence Prediction تلاش میکنند شمارههای Sequence را حدس بزنند تا بتوانند وسط ارتباط معتبر شوند و دادهها را دستکاری کنند. اگر عددهای اولیه ISN تصادفی نباشند، این حمله سادهتر میشود. به همین دلیل سرورها امروز از الگوریتمهای امنتر، فایروالهای هوشمند و تکنیکهایی مثل SYN Cookies استفاده میکنند تا جلوی سوءاستفاده از همین مراحل سهگانه TCP را بگیرند.
حمله SYN Flood چگونه کار میکند؟
حمله SYN Flood یکی از معروفترین روشهای DoS در لایه TCP است. در این حمله، مهاجم تعداد بسیار زیادی بسته SYN به سرور میفرستد، اما هیچوقت مرحله بعد یعنی ارسال ACK را انجام نمیدهد. سرور هر بار که SYN دریافت میکند، مجبور است یک اتصال نیمهکاره (Half-Open Connection) ایجاد کند و منابعی مثل حافظه و صف اتصالات را برای آن نگه دارد. حالا اگر این درخواستهای SYN بهشکل گسترده ارسال شوند، حافظه و ظرفیت سرور پر میشود و دیگر نمیتواند به کاربران واقعی پاسخ بدهد. تفاوت مهم این حمله با یک اتصال معمولی این است که سرور منتظر ACK میماند، اما هیچوقت آن را نمیگیرد. این دقیقاً نقطهای است که مهاجم از آن سوءاستفاده میکند. امروزه برای مقابله با این حمله از تکنیکهایی مثل SYN Cookies، Rate Limiting و Firewall Filtering استفاده میشود تا سرور قربانی بیش از حد انتظار نشود.
اگر فقط SYN ارسال شود و ACK دریافت نشود، چه اتفاقی میافتد؟
وقتی سرور یک بسته SYN دریافت میکند، پاسخ SYN/ACK را برمیگرداند و وارد حالت SYN-RECEIVED میشود. در این حالت سرور منتظر ACK نهایی کلاینت است تا اتصال کامل شود. اگر این ACK نیاید، سرور چند بار بسته SYN/ACK را دوباره ارسال میکند و برای مدتی اتصال نیمهکاره را نگه میدارد. بعد از چند بار تلاش و رسیدن به زمان Timeout، سرور این اتصال را حذف میکند. اگر تعداد زیادی از این اتصالات نیمهکاره ایجاد شود، سرور زیر بار میماند و ممکن است حتی بهطور کامل از پاسخدهی باز بایستد. این دقیقاً همان مکانیسمی است که حمله SYN Flood بر اساس آن عمل میکند: ارسال SYN بدون ادامهی فرآیند و پر کردن صف اتصالات. برای همین بسیاری از سیستمها محدودیتهایی روی تعداد Half-Open Connections و زمان انتظار ACK قرار میدهند تا از مصرف بیش از حد منابع جلوگیری شود.
بررسی فلگهای مهم و حساس در TCP (URG, PSH, FIN, RST و …)
در پروتکل TCP هر بستهی شبکه (Packet) فقط شامل داده نیست؛ بلکه داخل خودش مجموعهای از «فلگها» دارد که رفتار ارتباط را کنترل میکنند. این فلگها مثل علائم دست یک پیامرسان هستند که به طرف مقابل میگویند “الآن باید چه کاری انجام بدهیم.” هرکدام نقش خاصی دارند و در تحلیل ترافیک یا شناسایی حملات، دانستن کاربردشان ضروری است.
URG (Urgent Flag) یعنی بخشی از دادهها فوریتی است و باید قبل از بقیه پردازش شود. این فلگ بیشتر در سیستمهای قدیمی استفاده میشد.
PSH (Push Flag) وقتی فعال میشود که فرستنده میخواهد دادهها سریع به لایهی بالاتر منتقل شوند؛ مثلاً در چتهای زنده یا ارسال داده Real-time.
FIN (Finish Flag) برای پایان دادن به یک اتصال بهصورت محترمانه استفاده میشود. وقتی این فلگ ارسال شود یعنی «من کارم تمام شده، میخوام ارتباط را ببندم.»
RST (Reset Flag) یک قطع ناگهانی است. اگر اتصال شکل اشتباه گرفته یا مشکلی پیش بیاید، سرور با RST اتصال را فوراً میبُرد.
ACK (Acknowledgment Flag) که پایهایترین فلگ TCP است و نشان میدهد بستهی قبلی دریافت شده است.
SYN (Synchronize Flag) برای شروع ارتباط به کار میرود و همان فلگی است که در Three-Way Handshake استفاده میکنیم.
این فلگها وقتی کنار هم بررسی میشوند، الگوهای رفتاری مهمی تولید میکنند. مثلاً ترکیب SYN بدون ACK اغلب نشانهی حمله است، در حالی که FIN / ACK / FIN / ACK الگوی طبیعی بسته شدن اتصال است. در ابزارهایی مثل Wireshark تحلیل این فلگها یکی از اصلیترین روشها برای پیدا کردن رفتار غیرعادی و حتی حملات پیچیده است.
روشهای امنیتی برای جلوگیری از حملات TCP
از آنجایی که TCP روی اتصال پایدار و قابل اعتماد کار میکند، مهاجمان معمولاً از همین نقطه برای حمله استفاده میکنند—بهخصوص حملاتی مثل SYN Flood. برای همین لازم است سرورها چند لایه امنیتی داشته باشند تا این نقاط ضعف تبدیل به تهدید نشوند.
یکی از مهمترین روشهای دفاعی، SYN Cookies است. این تکنیک کمک میکند سرور قبل از اینکه پیام ACK را دریافت کند، هیچ فضایی برای اتصال رزرو نکند. نتیجه؟ درخواستهای SYN جعلی نمیتوانند سرور را مجبور کنند حافظهاش را بیهوده مصرف کند.
روش دیگر استفاده از Rate Limit است؛ یعنی محدود کردن تعداد درخواستهای SYN یک آیپی در یک مدت مشخص. فایروالها و WAFها بهخوبی میتوانند جلوی ارسال SYNهای بیشازحد را بگیرند.
ابزارهای IDS مثل Snort و Suricata نیز رفتارهای غیرعادی را شناسایی میکنند—مثلاً اگر یک سیستم شروع کند به ارسال تعداد زیادی SYN یا RST غیرطبیعی، این ابزارها هشدار میدهند.
در سطح شبکه، میتوان با فیلتر کردن آیپیهای مشکوک یا جلوگیری از اتصالهای نیمهباز زیاد، فشار را کم کرد. بعضی سرورها هم با بهینهسازی Backlog ظرفیت مدیریت اتصالهای ناتمام را افزایش میدهند تا دیرتر دچار مشکل شوند.
در نهایت، مانیتورینگ مداوم ترافیک با ابزارهایی مثل Wireshark یا Netstat کمک میکند سریع متوجه رفتارهای غیرعادی شویم. کسی که الگوی طبیعی Three-Way Handshake را بشناسد، هر انحراف را خیلی راحت تشخیص میدهد.
کلام اخر :
Three-Way Handshake پایهایترین سازوکار TCP برای ایجاد یک ارتباط مطمئن است. این فرآیند ساده سهمرحلهای (SYN، SYN/ACK، ACK) باعث میشود دو دستگاه قبل از تبادل داده، هماهنگ و آماده شوند. فهم دقیق آن نهتنها برای درک شبکه ضروری است، بلکه برای امنیت، تشخیص حملاتی مثل SYN Flood و استفاده از روشهای دفاعی مانند SYN Cookies اهمیت زیادی دارد. هر ارتباط اینترنتی بارها این فرآیند را اجرا میکند؛ بنابراین شناخت آن یک مهارت پایه برای افراد فعال در حوزه شبکه، امنیت و توسعه سرویسهای تحت وب است.