رمز و رازهای کلیدی اتصالات TCP بروکر بسته شبکه: نیاز به دست دادن سه گانه را رفع کرد

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

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

فرآیند دست دادن سه طرفه TCP و انتقال حالت
TCP یک پروتکل حمل و نقل اتصال گرا است که نیاز به برقراری اتصال قبل از انتقال داده دارد. این فرآیند برقراری ارتباط با دست دادن سه طرفه انجام می شود.

 دست دادن سه طرفه TCP

بیایید نگاهی دقیق تر به بسته های TCP که در هر اتصال ارسال می شود بیندازیم.

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

 بسته SYN

هنگامی که یک کلاینت یک اتصال را آغاز می کند، یک شماره توالی اولیه تصادفی (client_isn) تولید می کند و آن را در قسمت "Sequence number" سربرگ TCP قرار می دهد. در همان زمان، مشتری موقعیت پرچم SYN را روی 1 تنظیم می کند تا نشان دهد بسته خروجی یک بسته SYN است. کلاینت نشان می دهد که مایل به برقراری ارتباط با سرور با ارسال اولین بسته SYN به سرور است. این بسته حاوی داده های لایه برنامه (یعنی داده های ارسال شده) نیست. در این مرحله، وضعیت مشتری به عنوان SYN-SENT علامت گذاری می شود.

بسته SYN+ACK

هنگامی که یک سرور یک بسته SYN را از یک کلاینت دریافت می کند، به طور تصادفی شماره سریال خود (server_isn) را مقداردهی اولیه می کند و سپس آن شماره را در قسمت "Serial number" هدر TCP قرار می دهد. در مرحله بعد، سرور client_isn + 1 را در قسمت "شماره تایید" وارد می کند و هر دو بیت SYN و ACK را روی 1 تنظیم می کند. در نهایت، سرور بسته را برای مشتری ارسال می کند که حاوی هیچ داده لایه برنامه (و هیچ داده ای برای سرور نیست). برای ارسال). در این زمان سرور در حالت SYN-RCVD است.

بسته ACK

هنگامی که کلاینت بسته را از سرور دریافت می کند، باید بهینه سازی های زیر را انجام دهد تا به بسته پاسخ نهایی پاسخ دهد: ابتدا، مشتری بیت ACK هدر TCP بسته پاسخ را روی 1 تنظیم می کند. دوم، مشتری مقدار server_isn + 1 را در قسمت "تأیید شماره پاسخ" وارد می کند. در نهایت مشتری بسته را به سرور ارسال می کند. این بسته می تواند داده ها را از مشتری به سرور منتقل کند. پس از اتمام این عملیات، مشتری وارد حالت ESTABLISHED می شود.

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

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

چرا سه دست دادن؟ نه دو بار، چهار بار؟
پاسخ رایج این است: «زیرا دست دادن سه طرفه توانایی دریافت و ارسال را تضمین می کند». این پاسخ صحیح است، اما فقط دلیل ظاهری است، دلیل اصلی را مطرح نمی کند. در ادامه دلایل دست دادن سه گانه را از سه جنبه تحلیل می کنم تا درک خود را از این موضوع عمیق تر کنیم.

دست دادن سه طرفه می تواند به طور موثری از شروع اتصالات تکراری تاریخی جلوگیری کند (دلیل اصلی)
دست دادن سه طرفه تضمین می کند که هر دو طرف یک شماره توالی اولیه قابل اعتماد دریافت کرده اند.
دست دادن سه طرفه از هدر رفتن منابع جلوگیری می کند.

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

دست دادن سه طرفه از اتصالات تکراری تاریخی جلوگیری می کند

هنگامی که یک کلاینت چندین بسته ایجاد اتصال SYN را پشت سر هم ارسال می کند، در شرایطی مانند تراکم شبکه، موارد زیر ممکن است رخ دهد:

1- بسته های قدیمی SYN قبل از آخرین بسته های SYN به سرور می رسند.
2- سرور پس از دریافت بسته قدیمی SYN یک بسته SYN + ACK را به مشتری پاسخ می دهد.
3- هنگامی که کلاینت بسته SYN + ACK را دریافت می کند، تشخیص می دهد که اتصال یک اتصال تاریخی است (شماره دنباله منقضی شده یا تایم اوت شده است) با توجه به زمینه خود، و سپس بسته RST را برای قطع اتصال به سرور ارسال می کند.

با اتصال دو دست، هیچ راهی برای تعیین اینکه آیا ارتباط فعلی یک ارتباط تاریخی است وجود ندارد. دست دادن سه طرفه به مشتری این امکان را می دهد که تعیین کند آیا اتصال فعلی یک اتصال تاریخی است یا نه بر اساس زمینه زمانی که آماده ارسال بسته سوم است:

1- اگر یک اتصال تاریخی باشد (شماره دنباله منقضی شده یا تایم اوت شده باشد)، بسته ارسال شده توسط سومین handshake یک بسته RST برای قطع اتصال تاریخی است.
2- اگر اتصال تاریخی نباشد، بسته ارسال شده برای بار سوم بسته ACK است و دو طرف ارتباط با موفقیت اتصال را برقرار می کنند.

بنابراین، دلیل اصلی استفاده TCP از handshake سه طرفه این است که اتصال را برای جلوگیری از اتصالات تاریخی مقداردهی اولیه می کند.

دلیل 2: برای همگام سازی اعداد ترتیب اولیه هر دو طرف
هر دو طرف پروتکل TCP باید یک شماره دنباله را حفظ کنند، که یک عامل کلیدی برای اطمینان از انتقال قابل اعتماد است. اعداد دنباله نقش مهمی در اتصالات TCP ایفا می کنند. آنها کارهای زیر را انجام می دهند:

گیرنده می تواند داده های تکراری را حذف کرده و از صحت داده ها اطمینان حاصل کند.

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

● شماره ترتیبی می تواند بسته داده ای را که توسط طرف مقابل دریافت شده است شناسایی کند و امکان انتقال داده قابل اعتماد را فراهم می کند.

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

شماره سریال اولیه هر دو طرف را همگام کنید

اگرچه یک دست دادن چهار طرفه نیز برای همگام‌سازی مطمئن شماره‌های ترتیب اولیه هر دو طرف امکان‌پذیر است، مراحل دوم و سوم را می‌توان در یک مرحله ترکیب کرد که منجر به یک دست دادن سه‌طرفه می‌شود. با این حال، دو دست دادن تنها می توانند تضمین کنند که شماره سکانس اولیه یک طرف با موفقیت توسط طرف دیگر دریافت می شود، اما هیچ تضمینی وجود ندارد که شماره ترتیب اولیه هر دو طرف تایید شود. بنابراین، دست دادن سه طرفه بهترین انتخاب برای اطمینان از پایداری و قابلیت اطمینان اتصالات TCP است.

دلیل 3: از هدر دادن منابع خودداری کنید
اگر فقط یک "دو دست دادن" وجود داشته باشد، زمانی که درخواست SYN مشتری در شبکه مسدود می شود، مشتری نمی تواند بسته ACK ارسال شده توسط سرور را دریافت کند، بنابراین SYN دوباره ارسال می شود. با این حال، از آنجایی که هیچ دست دادن سومی وجود ندارد، سرور نمی‌تواند تعیین کند که آیا کلاینت برای برقراری اتصال تأییدیه ACK را دریافت کرده است یا خیر. بنابراین، سرور تنها پس از دریافت هر درخواست SYN می تواند به طور فعال یک اتصال برقرار کند. این منجر به موارد زیر می شود:

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

حفظ پیام: به دلیل عدم دست دادن سوم، سرور راهی برای دانستن اینکه آیا کلاینت به درستی تأییدیه ACK را برای برقراری اتصال دریافت کرده است، ندارد. در نتیجه، اگر پیام‌ها در شبکه گیر کنند، کلاینت درخواست‌های SYN را بارها و بارها ارسال می‌کند و باعث می‌شود که سرور دائماً اتصالات جدیدی برقرار کند. این امر باعث افزایش تراکم و تأخیر شبکه می شود و بر عملکرد کلی شبکه تأثیر منفی می گذارد.

از هدر دادن منابع خودداری کنید

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

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

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


زمان ارسال: ژانویه-08-2025