تنظیم اتصال TCP
وقتی وب را مرور میکنیم، ایمیل میفرستیم یا یک بازی آنلاین انجام میدهیم، اغلب به اتصال شبکه پیچیده پشت آن فکر نمیکنیم. با این حال، همین مراحل به ظاهر کوچک هستند که ارتباط پایدار بین ما و سرور را تضمین میکنند. یکی از مهمترین مراحل، تنظیم اتصال TCP است و هسته اصلی آن، دستدهی سهطرفه است.
این مقاله به تفصیل به بررسی اصل، فرآیند و اهمیت دستدهی سهجانبه خواهد پرداخت. گام به گام توضیح خواهیم داد که چرا دستدهی سهجانبه مورد نیاز است، چگونه پایداری و قابلیت اطمینان اتصال را تضمین میکند و چقدر برای انتقال دادهها مهم است. با درک عمیقتر دستدهی سهجانبه، درک بهتری از مکانیسمهای اساسی ارتباطات شبکه و دیدگاه واضحتری از قابلیت اطمینان اتصالات TCP به دست خواهیم آورد.
فرآیند دستدهی سهطرفه TCP و انتقال وضعیت
TCP یک پروتکل انتقال اتصالگرا است که قبل از انتقال داده نیاز به برقراری اتصال دارد. این فرآیند برقراری اتصال توسط یک دستدهی سهجانبه انجام میشود.
بیایید نگاه دقیقتری به بستههای TCP که در هر اتصال ارسال میشوند، بیندازیم.
در ابتدا، هم کلاینت و هم سرور بسته هستند. ابتدا، سرور به طور فعال به یک پورت گوش میدهد و در حالت LISTEN قرار دارد، به این معنی که سرور باید شروع به کار کند. در مرحله بعد، کلاینت آماده دسترسی به صفحه وب است. باید با سرور ارتباط برقرار کند. قالب اولین بسته اتصال به شرح زیر است:
وقتی یک کلاینت اتصال را آغاز میکند، یک شماره ترتیب اولیه تصادفی (client_isn) تولید میکند و آن را در فیلد "شماره ترتیب" هدر TCP قرار میدهد. همزمان، کلاینت موقعیت پرچم SYN را روی ۱ تنظیم میکند تا نشان دهد که بسته خروجی یک بسته SYN است. کلاینت با ارسال اولین بسته SYN به سرور، تمایل خود را برای برقراری ارتباط با سرور نشان میدهد. این بسته حاوی دادههای لایه کاربرد (یعنی دادههای ارسال شده) نیست. در این مرحله، وضعیت کلاینت به عنوان SYN-SENT علامتگذاری میشود.
وقتی سرور یک بسته SYN را از یک کلاینت دریافت میکند، به طور تصادفی شماره سریال خود (server_isn) را مقداردهی اولیه میکند و سپس آن شماره را در فیلد "Serial number" از هدر TCP قرار میدهد. در مرحله بعد، سرور در فیلد "Acknowledgement number" مقدار client_isn + 1 را وارد میکند و هر دو بیت SYN و ACK را روی 1 تنظیم میکند. در نهایت، سرور بسته را به کلاینت ارسال میکند که حاوی هیچ داده لایه کاربردی (و هیچ دادهای برای ارسال توسط سرور) نیست. در این زمان، سرور در حالت SYN-RCVD قرار دارد.
پس از دریافت بسته از سرور توسط کلاینت، برای پاسخ به بسته پاسخ نهایی، باید بهینهسازیهای زیر را انجام دهد: ابتدا، کلاینت بیت ACK هدر TCP بسته پاسخ را روی ۱ تنظیم میکند؛ دوم، کلاینت مقدار server_isn + 1 را در فیلد "تأیید شماره پاسخ" وارد میکند؛ در نهایت، کلاینت بسته را به سرور ارسال میکند. این بسته میتواند دادهها را از کلاینت به سرور منتقل کند. پس از اتمام این عملیات، کلاینت وارد حالت ESTABLISHED میشود.
به محض اینکه سرور بسته پاسخ را از کلاینت دریافت کرد، به حالت ESTABLISHED (ایجاد شده) نیز تغییر میکند.
همانطور که از فرآیند بالا مشاهده میکنید، هنگام انجام یک دستدهی سهجانبه، دستدهی سوم مجاز به حمل دادهها است، اما دو دستدهی اول مجاز نیستند. این سوالی است که اغلب در مصاحبهها پرسیده میشود. پس از اتمام دستدهی سهجانبه، هر دو طرف وارد حالت ESTABLISHED میشوند که نشان میدهد اتصال با موفقیت برقرار شده است، در این مرحله کلاینت و سرور میتوانند ارسال دادهها به یکدیگر را آغاز کنند.
چرا سه بار دست دادن؟ نه دو بار، چهار بار؟
پاسخ رایج این است: «زیرا دست دادن سهجانبه، توانایی دریافت و ارسال را تضمین میکند.» این پاسخ درست است، اما فقط دلیل سطحی است و دلیل اصلی را مطرح نمیکند. در ادامه، دلایل دست دادن سهگانه را از سه جنبه بررسی خواهم کرد تا درک ما از این موضوع را عمیقتر کنیم.
دستدهی سهطرفه میتواند بهطور مؤثر از مقداردهی اولیه اتصالات تکراری تاریخی جلوگیری کند (دلیل اصلی)
دستدهی سهجانبه تضمین میکند که هر دو طرف یک شماره ترتیب اولیه قابل اعتماد دریافت کردهاند.
روش دستدهی سهجانبه از هدر رفتن منابع جلوگیری میکند.
دلیل ۱: از پیوندهای تکراری قدیمی اجتناب کنید
به طور خلاصه، دلیل اصلی دستدهی سهطرفه، جلوگیری از سردرگمی ناشی از مقداردهی اولیه اتصال تکراری قدیمی است. در یک محیط شبکه پیچیده، انتقال بستههای داده همیشه مطابق با زمان مشخص شده به میزبان مقصد ارسال نمیشود و بستههای داده قدیمی ممکن است به دلیل ازدحام شبکه و دلایل دیگر، ابتدا به میزبان مقصد برسند. برای جلوگیری از این امر، TCP از دستدهی سهطرفه برای ایجاد اتصال استفاده میکند.
وقتی یک کلاینت چندین بسته برقراری اتصال SYN را پشت سر هم ارسال میکند، در موقعیتهایی مانند ازدحام شبکه، موارد زیر ممکن است رخ دهد:
۱- بستههای SYN قدیمی قبل از بستههای SYN جدید به سرور میرسند.
۲- سرور پس از دریافت بسته SYN قدیمی، یک بسته SYN + ACK به کلاینت پاسخ میدهد.
۳- وقتی کلاینت بسته SYN + ACK را دریافت میکند، بر اساس زمینه خودش تشخیص میدهد که اتصال یک اتصال قدیمی (شماره توالی منقضی شده یا timeout) است و سپس بسته RST را برای قطع اتصال به سرور ارسال میکند.
با اتصال دو مرحلهای، هیچ راهی برای تعیین اینکه آیا اتصال فعلی یک اتصال قدیمی است یا خیر، وجود ندارد. اتصال سه مرحلهای به کلاینت اجازه میدهد تا بر اساس زمینه، زمانی که آماده ارسال بسته سوم است، تشخیص دهد که آیا اتصال فعلی یک اتصال قدیمی است یا خیر:
۱- اگر یک اتصال قدیمی باشد (شماره ترتیب منقضی شده یا زمان آن تمام شده باشد)، بستهای که توسط دستدهی سوم ارسال میشود، یک بسته RST برای لغو اتصال قدیمی است.
۲- اگر ارتباط قبلی برقرار نباشد، بستهای که برای بار سوم ارسال میشود، یک بسته ACK است و دو طرف ارتباط با موفقیت ارتباط را برقرار میکنند.
بنابراین، دلیل اصلی استفاده TCP از روش دستدهی سهطرفه این است که اتصال را مقداردهی اولیه میکند تا از اتصالات قدیمی جلوگیری کند.
دلیل ۲: برای همگامسازی شمارههای ترتیب اولیه هر دو طرف
هر دو طرف پروتکل TCP باید یک شماره ترتیب را حفظ کنند، که یک عامل کلیدی برای اطمینان از انتقال قابل اعتماد است. شماره ترتیب نقش مهمی در اتصالات TCP ایفا میکند. آنها موارد زیر را انجام میدهند:
گیرنده میتواند دادههای تکراری را حذف کرده و صحت دادهها را تضمین کند.
گیرنده میتواند بستهها را به ترتیب شماره ترتیب دریافت کند تا از صحت دادهها اطمینان حاصل شود.
● شماره ترتیب میتواند بسته دادهای را که توسط طرف مقابل دریافت شده است، شناسایی کند و انتقال داده قابل اعتماد را امکانپذیر سازد.
بنابراین، پس از برقراری اتصال TCP، کلاینت بستههای SYN را با شماره ترتیب اولیه ارسال میکند و از سرور میخواهد که با یک بسته ACK که نشاندهنده دریافت موفقیتآمیز بسته SYN کلاینت است، پاسخ دهد. سپس، سرور بسته SYN را با شماره ترتیب اولیه به کلاینت ارسال میکند و منتظر میماند تا کلاینت، یک بار برای همیشه، پاسخ دهد تا از همگامسازی قابل اعتماد شمارههای ترتیب اولیه اطمینان حاصل شود.
اگرچه یک دستدهی چهار مرحلهای نیز برای همگامسازی قابل اعتماد شمارههای ترتیب اولیه هر دو طرف امکانپذیر است، اما مراحل دوم و سوم را میتوان در یک مرحله ترکیب کرد و در نتیجه یک دستدهی سه مرحلهای ایجاد کرد. با این حال، دو دستدهی فقط میتوانند تضمین کنند که شماره ترتیب اولیه یک طرف با موفقیت توسط طرف دیگر دریافت میشود، اما هیچ تضمینی وجود ندارد که شماره ترتیب اولیه هر دو طرف قابل تأیید باشد. بنابراین، دستدهی سه مرحلهای بهترین انتخاب برای اطمینان از پایداری و قابلیت اطمینان اتصالات TCP است.
دلیل ۳: جلوگیری از هدر رفتن منابع
اگر فقط یک "دو-دست دادن" وجود داشته باشد، وقتی درخواست SYN کلاینت در شبکه مسدود میشود، کلاینت نمیتواند بسته ACK ارسال شده توسط سرور را دریافت کند، بنابراین SYN دوباره ارسال میشود. با این حال، از آنجایی که دست دادن سومی وجود ندارد، سرور نمیتواند تشخیص دهد که آیا کلاینت برای برقراری اتصال، تأیید ACK را دریافت کرده است یا خیر. بنابراین، سرور فقط میتواند پس از دریافت هر درخواست SYN، به صورت پیشگیرانه اتصال را برقرار کند. این امر منجر به موارد زیر میشود:
اتلاف منابع: اگر درخواست SYN کلاینت مسدود شود و منجر به ارسال مکرر چندین بسته SYN شود، سرور پس از دریافت درخواست، چندین اتصال نامعتبر و اضافی برقرار میکند. این امر منجر به اتلاف غیرضروری منابع سرور میشود.
نگهداری پیام: به دلیل عدم وجود یک handshake سوم، سرور هیچ راهی برای فهمیدن اینکه آیا کلاینت به درستی تایید ACK را برای برقراری اتصال دریافت کرده است یا خیر، ندارد. در نتیجه، اگر پیامها در شبکه گیر کنند، کلاینت بارها و بارها درخواستهای SYN ارسال میکند و باعث میشود سرور دائماً اتصالات جدید برقرار کند. این امر باعث افزایش ازدحام و تأخیر در شبکه میشود و بر عملکرد کلی شبکه تأثیر منفی میگذارد.
بنابراین، به منظور اطمینان از پایداری و قابلیت اطمینان اتصال شبکه، TCP از روش دستدهی سهجانبه برای برقراری اتصال استفاده میکند تا از بروز این مشکلات جلوگیری شود.
خلاصه
کارگزار بسته شبکهبرقراری اتصال TCP با یک دستدهی سهطرفه انجام میشود. در طول دستدهی سهطرفه، کلاینت ابتدا یک بسته با پرچم SYN به سرور ارسال میکند که نشان میدهد میخواهد اتصال برقرار کند. پس از دریافت درخواست از کلاینت، سرور بستهای با پرچمهای SYN و ACK به کلاینت پاسخ میدهد که نشان میدهد درخواست اتصال پذیرفته شده است و شماره ترتیب اولیه خود را ارسال میکند. در نهایت، کلاینت با یک پرچم ACK به سرور پاسخ میدهد تا نشان دهد که اتصال با موفقیت برقرار شده است. بنابراین، دو طرف در حالت ESTABLISHED قرار دارند و میتوانند شروع به ارسال داده به یکدیگر کنند.
به طور کلی، فرآیند دستدهی سهجانبه برای برقراری اتصال TCP به گونهای طراحی شده است که پایداری و قابلیت اطمینان اتصال را تضمین کند، از سردرگمی و اتلاف منابع در طول اتصالات قبلی جلوگیری کند و اطمینان حاصل کند که هر دو طرف قادر به دریافت و ارسال دادهها هستند.
زمان ارسال: ژانویه-08-2025