قابلیت اطمینان TCP در انتقال
همه ما با پروتکل TCP به عنوان یک پروتکل انتقال قابل اعتماد آشنا هستیم، اما چگونه قابلیت اطمینان انتقال را تضمین میکند؟
برای دستیابی به انتقال قابل اعتماد، عوامل زیادی باید در نظر گرفته شوند، مانند خرابی دادهها، از دست رفتن دادهها، تکثیر دادهها و قطعات خارج از ترتیب. اگر این مشکلات قابل حل نباشند، انتقال قابل اعتمادی حاصل نمیشود.
بنابراین، TCP از مکانیسمهایی مانند شماره ترتیب، پاسخ تأیید، کنترل ارسال مجدد، مدیریت اتصال و کنترل پنجره برای دستیابی به انتقال قابل اعتماد استفاده میکند.
در این مقاله، ما بر روی پنجره کشویی، کنترل جریان و کنترل ازدحام TCP تمرکز خواهیم کرد. مکانیسم ارسال مجدد در بخش بعدی به طور جداگانه بررسی خواهد شد.
کنترل جریان شبکه
کنترل جریان شبکه یا کنترل ترافیک شبکه در واقع نمودی از رابطهی ظریف بین تولیدکنندگان و مصرفکنندگان است. احتمالاً در محل کار یا مصاحبهها با این سناریو زیاد مواجه شدهاید. اگر ظرفیت تولید تولیدکننده از ظرفیت مصرف مصرفکننده بسیار بیشتر باشد، باعث میشود صف به طور نامحدود رشد کند. در یک مورد جدیتر، ممکن است بدانید که وقتی پیامهای RabbitMQ بیش از حد انباشته میشوند، میتوانند باعث تخریب عملکرد کل سرور MQ شوند. همین امر در مورد TCP نیز صادق است. اگر کنترل نشود، پیامهای زیادی در شبکه قرار میگیرند و مصرفکنندگان از ظرفیت خود فراتر میروند، در حالی که تولیدکنندگان به ارسال پیامهای تکراری ادامه میدهند که این امر تأثیر زیادی بر عملکرد شبکه خواهد داشت.
برای مقابله با این پدیده، TCP مکانیزمی را برای فرستنده فراهم میکند تا میزان دادههای ارسالی را بر اساس ظرفیت واقعی دریافت گیرنده کنترل کند، که به عنوان کنترل جریان شناخته میشود. گیرنده یک پنجره دریافت را حفظ میکند، در حالی که فرستنده یک پنجره ارسال را حفظ میکند. لازم به ذکر است که این پنجرهها فقط برای یک اتصال TCP واحد هستند و همه اتصالات یک پنجره مشترک ندارند.
TCP با استفاده از یک متغیر برای پنجره دریافت، کنترل جریان را فراهم میکند. پنجره دریافت به فرستنده نشان میدهد که چه مقدار فضای حافظه پنهان هنوز در دسترس است. فرستنده میزان داده ارسالی را بر اساس ظرفیت پذیرش واقعی گیرنده کنترل میکند.
میزبان گیرنده، فرستنده را از اندازه دادهای که میتواند دریافت کند مطلع میکند و فرستنده تا این حد، داده ارسال میکند. این حد، اندازه پنجره است، هدر TCP را به خاطر دارید؟ یک فیلد پنجره دریافت وجود دارد که برای نشان دادن تعداد بایتهایی که گیرنده قادر یا مایل به دریافت آن است، استفاده میشود.
میزبان فرستنده به صورت دورهای یک بسته کاوشگر پنجره ارسال میکند که برای تشخیص اینکه آیا میزبان گیرنده هنوز قادر به پذیرش دادهها است یا خیر، استفاده میشود. هنگامی که بافر گیرنده در معرض خطر سرریز شدن قرار میگیرد، اندازه پنجره به مقدار کمتری تنظیم میشود تا به فرستنده دستور دهد میزان دادههای ارسالی را کنترل کند.
نمودار کنترل جریان شبکه به صورت زیر است:
کنترل ازدحام شبکه
قبل از معرفی کنترل ازدحام، باید بدانیم که علاوه بر پنجره دریافت و پنجره ارسال، یک پنجره ازدحام نیز وجود دارد که عمدتاً برای حل مشکل نرخ ارسال داده توسط فرستنده به پنجره دریافت استفاده میشود. بنابراین، پنجره ازدحام توسط فرستنده TCP نیز نگهداری میشود. ما به الگوریتمی نیاز داریم تا تصمیم بگیریم چه مقدار داده برای ارسال مناسب است، زیرا ارسال داده خیلی کم یا خیلی زیاد ایدهآل نیست، از این رو مفهوم پنجره ازدحام مطرح میشود.
در کنترل جریان شبکه قبلی، چیزی که از آن اجتناب کردیم این بود که فرستنده، حافظه پنهان گیرنده را با داده پر کند، اما نمیدانستیم چه اتفاقی در شبکه میافتد. به طور معمول، شبکههای کامپیوتری در یک محیط مشترک قرار دارند. در نتیجه، ممکن است به دلیل ارتباط بین میزبانهای دیگر، تراکم شبکه وجود داشته باشد.
وقتی شبکه شلوغ است، اگر تعداد زیادی بسته همچنان ارسال شوند، ممکن است مشکلاتی مانند تأخیر و از دست رفتن بستهها ایجاد شود. در این مرحله، TCP دادهها را دوباره ارسال میکند، اما این ارسال مجدد بار شبکه را افزایش میدهد و منجر به تأخیرهای بیشتر و از دست رفتن بستههای بیشتر میشود. این میتواند وارد یک چرخه معیوب شود و به بزرگتر شدن ادامه دهد.
بنابراین، TCP نمیتواند آنچه را که در شبکه اتفاق میافتد نادیده بگیرد. وقتی شبکه شلوغ میشود، TCP با کاهش میزان دادهای که ارسال میکند، خود را قربانی میکند.
بنابراین، کنترل ازدحام پیشنهاد میشود که هدف آن جلوگیری از پر شدن کل شبکه با دادههای فرستنده است. برای تنظیم میزان دادههایی که فرستنده باید ارسال کند، TCP مفهومی به نام پنجره ازدحام را تعریف میکند. الگوریتم کنترل ازدحام، اندازه پنجره ازدحام را با توجه به درجه ازدحام شبکه تنظیم میکند تا میزان دادههای ارسالی توسط فرستنده را کنترل کند.
پنجره ازدحام چیست؟ این چه ارتباطی با پنجره ارسال دارد؟
پنجره ازدحام یک متغیر وضعیت است که توسط فرستنده نگهداری میشود و میزان دادهای را که فرستنده میتواند ارسال کند تعیین میکند. پنجره ازدحام به صورت پویا با توجه به سطح ازدحام شبکه تغییر میکند.
پنجره ارسال، اندازه پنجرهای است که بین فرستنده و گیرنده توافق شده و میزان دادهای را که گیرنده میتواند دریافت کند، نشان میدهد. پنجره ازدحام و پنجره ارسال به هم مرتبط هستند؛ پنجره ارسال معمولاً برابر با حداقل پنجرههای ازدحام و دریافت است، یعنی swnd = min(cwnd, rwnd).
پنجرهی ازدحام cwnd به صورت زیر تغییر میکند:
اگر هیچ ازدحامی در شبکه وجود نداشته باشد، یعنی هیچ وقفه ارسال مجددی رخ ندهد، پنجره ازدحام افزایش مییابد.
اگر در شبکه ازدحام وجود داشته باشد، پنجره ازدحام کاهش مییابد.
فرستنده با مشاهده اینکه آیا بسته تأیید ACK در مدت زمان مشخص شده دریافت شده است یا خیر، تشخیص میدهد که آیا شبکه دچار ازدحام است یا خیر. اگر فرستنده بسته تأیید ACK را در مدت زمان مشخص شده دریافت نکند، شبکه دچار ازدحام در نظر گرفته میشود.
علاوه بر پنجره ازدحام، وقت آن است که الگوریتم کنترل ازدحام TCP را مورد بحث قرار دهیم. الگوریتم کنترل ازدحام TCP از سه بخش اصلی تشکیل شده است:
شروع آهسته:در ابتدا، پنجره ازدحام cwnd نسبتاً کوچک است و فرستنده پنجره ازدحام را به صورت تصاعدی افزایش میدهد تا به سرعت با ظرفیت شبکه سازگار شود.
جلوگیری از ازدحام:پس از اینکه پنجره ازدحام از یک آستانه مشخص فراتر رفت، فرستنده پنجره ازدحام را به صورت خطی افزایش میدهد تا سرعت رشد پنجره ازدحام را کاهش داده و از اضافه بار شبکه جلوگیری کند.
بازیابی سریع:در صورت بروز ازدحام، فرستنده پنجره ازدحام را نصف کرده و وارد حالت بازیابی سریع میشود تا از طریق تاییدیههای تکراری دریافتی، محل بازیابی شبکه را تعیین کند و سپس به افزایش پنجره ازدحام ادامه میدهد.
شروع آهسته
وقتی یک اتصال TCP برقرار میشود، پنجرهی ازدحام cwnd در ابتدا روی حداقل مقدار MSS (حداکثر اندازهی قطعه) تنظیم میشود. به این ترتیب، نرخ ارسال اولیه حدود MSS/RTT بایت بر ثانیه است. پهنای باند واقعی موجود معمولاً بسیار بزرگتر از MSS/RTT است، بنابراین TCP میخواهد نرخ ارسال بهینه را پیدا کند که میتوان آن را با استفاده از شروع آهسته به دست آورد.
در فرآیند شروع آهسته، مقدار پنجره ازدحام cwnd با ۱ MSS مقداردهی اولیه میشود و هر بار که قطعه بسته ارسالی تأیید میشود، مقدار cwnd یک MSS افزایش مییابد، یعنی مقدار cwnd به ۲ MSS تبدیل میشود. پس از آن، مقدار cwnd برای هر انتقال موفقیتآمیز یک قطعه بسته دو برابر میشود و به همین ترتیب ادامه مییابد. فرآیند رشد خاص در شکل زیر نشان داده شده است.
با این حال، نرخ ارسال همیشه نمیتواند افزایش یابد؛ این رشد بالاخره باید زمانی متوقف شود. بنابراین، افزایش نرخ ارسال چه زمانی پایان مییابد؟ شروع آهسته معمولاً افزایش نرخ ارسال را از یکی از چندین روش زیر متوقف میکند:
روش اول، مورد از دست رفتن بستهها در طول فرآیند ارسال با شروع آهسته است. هنگامی که یک بسته از دست میرود، TCP پنجره ازدحام فرستنده cwnd را روی ۱ تنظیم میکند و فرآیند شروع آهسته را مجدداً آغاز میکند. در این مرحله، مفهومی به نام آستانه شروع آهسته ssthresh معرفی میشود که مقدار اولیه آن نصف مقدار cwnd است که باعث از دست رفتن بستهها میشود. یعنی، هنگامی که ازدحام تشخیص داده میشود، مقدار ssthresh نصف مقدار پنجره است.
راه دوم، همبستگی مستقیم با مقدار آستانه شروع آهسته ssthresh است. از آنجایی که مقدار ssthresh نصف مقدار پنجره هنگام تشخیص ازدحام است، وقتی cwnd بزرگتر از ssthresh باشد، ممکن است با هر دو برابر شدن، بسته از بین برود. بنابراین، بهتر است cwnd را روی ssthresh تنظیم کنید، که باعث میشود TCP به حالت کنترل ازدحام تغییر حالت دهد و شروع آهسته را پایان دهد.
آخرین راهی که میتواند به شروع کند پایان دهد این است که اگر سه تاییدیه اضافی شناسایی شود، TCP یک ارسال مجدد سریع انجام میدهد و وارد حالت بازیابی میشود. (اگر مشخص نیست که چرا سه بسته ACK وجود دارد، به طور جداگانه در مکانیسم ارسال مجدد توضیح داده خواهد شد.)
اجتناب از ازدحام
وقتی TCP وارد حالت کنترل ازدحام میشود، cwnd روی نصف آستانه ازدحام ssthresh تنظیم میشود. این بدان معناست که مقدار cwnd نمیتواند هر بار که یک قطعه بسته دریافت میشود، دو برابر شود. در عوض، یک رویکرد نسبتاً محافظهکارانه اتخاذ میشود که در آن مقدار cwnd پس از تکمیل هر انتقال، تنها به اندازه یک MSS (حداکثر طول قطعه بسته) افزایش مییابد. به عنوان مثال، حتی اگر 10 قطعه بسته تأیید شوند، مقدار cwnd فقط به اندازه یک MSS افزایش مییابد. این یک مدل رشد خطی است و همچنین دارای حد بالایی برای رشد است. هنگامی که از دست دادن بسته رخ میدهد، مقدار cwnd به یک MSS تغییر میکند و مقدار ssthresh روی نصف cwnd تنظیم میشود. یا همچنین رشد MSS را هنگامی که 3 پاسخ ACK اضافی دریافت میشود، متوقف میکند. اگر پس از نصف کردن مقدار cwnd، هنوز سه ack اضافی دریافت شود، مقدار ssthresh به عنوان نصف مقدار cwnd ثبت میشود و حالت بازیابی سریع وارد میشود.
بازیابی سریع
در حالت بازیابی سریع، مقدار پنجرهی ازدحام cwnd به ازای هر ACK اضافی دریافتی، یعنی ACK که به ترتیب نمیرسد، یک MSS افزایش مییابد. این کار برای استفاده از بخشهای بستهای است که با موفقیت در شبکه منتقل شدهاند تا راندمان انتقال تا حد امکان بهبود یابد.
وقتی یک تاییدیه (ACK) از قطعه بسته گمشده میرسد، TCP مقدار cwnd را کاهش میدهد و سپس وارد حالت اجتناب از ازدحام میشود. این کار برای کنترل اندازه پنجره ازدحام و جلوگیری از افزایش بیشتر ازدحام شبکه انجام میشود.
اگر پس از حالت کنترل ازدحام، وقفه زمانی رخ دهد، وضعیت شبکه جدیتر میشود و TCP از حالت اجتناب از ازدحام به حالت شروع آهسته مهاجرت میکند. در این حالت، مقدار پنجره ازدحام cwnd روی ۱ MSS، حداکثر طول قطعه بسته، و مقدار آستانه شروع آهسته ssthresh روی نصف cwnd تنظیم میشود. هدف از این کار، افزایش تدریجی مجدد اندازه پنجره ازدحام پس از بازیابی شبکه برای ایجاد تعادل بین نرخ انتقال و درجه ازدحام شبکه است.
خلاصه
TCP به عنوان یک پروتکل انتقال قابل اعتماد، انتقال قابل اعتماد را با استفاده از شماره ترتیب، تأیید، کنترل ارسال مجدد، مدیریت اتصال و کنترل پنجره پیادهسازی میکند. در میان آنها، مکانیسم کنترل جریان، میزان دادههای ارسالی توسط فرستنده را با توجه به ظرفیت واقعی دریافت گیرنده کنترل میکند که از مشکلات تراکم شبکه و افت عملکرد جلوگیری میکند. مکانیسم کنترل تراکم با تنظیم میزان دادههای ارسالی توسط فرستنده، از وقوع تراکم شبکه جلوگیری میکند. مفاهیم پنجره تراکم و پنجره ارسال به یکدیگر مرتبط هستند و میزان دادهها در فرستنده با تنظیم پویای اندازه پنجره تراکم کنترل میشود. شروع آهسته، اجتناب از تراکم و بازیابی سریع سه بخش اصلی الگوریتم کنترل تراکم TCP هستند که اندازه پنجره تراکم را از طریق استراتژیهای مختلف برای تطبیق با ظرفیت و درجه تراکم شبکه تنظیم میکنند.
در بخش بعدی، مکانیسم ارسال مجدد TCP را به طور مفصل بررسی خواهیم کرد. مکانیسم ارسال مجدد بخش مهمی از TCP برای دستیابی به انتقال قابل اعتماد است. این مکانیسم با ارسال مجدد دادههای از دست رفته، خراب یا با تأخیر، انتقال قابل اعتماد دادهها را تضمین میکند. اصل پیادهسازی و استراتژی مکانیسم ارسال مجدد در بخش بعدی به طور مفصل معرفی و تجزیه و تحلیل خواهد شد. با ما همراه باشید!
زمان ارسال: ۲۴ فوریه ۲۰۲۵