TCP сенімділігін тасымалдау
Біз TCP протоколын сенімді тасымалдау протоколы ретінде жақсы білеміз, бірақ ол тасымалдау сенімділігін қалай қамтамасыз етеді?
Сенімді тасымалдауға қол жеткізу үшін деректердің бүлінуі, жоғалуы, қайталануы және реттелмеген бөлшектер сияқты көптеген факторларды ескеру қажет. Егер бұл мәселелерді шешу мүмкін болмаса, сенімді тасымалдауға қол жеткізу мүмкін емес.
Сондықтан TCP сенімді жіберуге қол жеткізу үшін реттік нөмір, растау жауабы, қайта жіберуді басқару, қосылымды басқару және терезені басқару сияқты механизмдерді пайдаланады.
Бұл мақалада біз жылжымалы терезеге, ағынды басқаруға және TCP-нің кептелуін бақылауға назар аударамыз. Ретрансляция механизмі келесі бөлімде бөлек қарастырылады.
Желі ағынын басқару
Желілік ағынды басқару немесе желілік трафикті басқару ретінде белгілі - бұл өндірушілер мен тұтынушылар арасындағы нәзік қарым-қатынастың көрінісі. Сіз бұл сценарийді жұмыста немесе сұхбатта көп кездестірген шығарсыз. Егер өндірушінің өнім өндіру мүмкіндігі тұтынушының тұтыну мүмкіндігінен айтарлықтай асып кетсе, бұл кезектің шексіз өсуіне әкеледі. Неғұрлым күрделі жағдайда, сіз RabbitMQ хабарлары тым көп жиналса, бұл бүкіл MQ серверінің өнімділігін төмендетуі мүмкін екенін білуіңіз мүмкін. TCP үшін де солай; бақылаусыз қалдырылған жағдайда желіге тым көп хабарламалар енгізіліп, тұтынушылар өз мүмкіндіктерінен асып кеткен болады, ал өндірушілер қайталанатын хабарламаларды жіберуді жалғастырады, бұл желінің жұмысына үлкен әсер етеді.
Бұл құбылысты шешу үшін TCP жіберушіге ағынды басқару ретінде белгілі қабылдағыштың нақты қабылдау мүмкіндігіне негізделген жіберілген деректер көлемін басқару механизмін қамтамасыз етеді. Қабылдаушы қабылдау терезесін, ал жіберуші жіберу терезесін қолдайды. Айта кету керек, бұл Windows тек бір TCP қосылымына арналған және барлық қосылымдар терезені ортақ пайдаланбайды.
TCP қабылдау терезесі үшін айнымалыны пайдалану арқылы ағынды басқаруды қамтамасыз етеді. Қабылдау терезесі жіберушіге қанша кэш кеңістігінің әлі де қолжетімді екенін көрсетеді. Жіберуші қабылдаушының нақты қабылдау мүмкіндігіне сәйкес жіберілетін деректер көлемін бақылайды.
Қабылдаушы хост жіберушіге қабылдай алатын деректердің өлшемі туралы хабарлайды және жіберуші осы шекке дейін жібереді. Бұл шектеу терезе өлшемі, TCP тақырыбы есіңізде ме? Қабылдау терезесінің өрісі бар, ол ресивер қабылдай алатын немесе қабылдауға дайын байттардың санын көрсету үшін пайдаланылады.
Жіберуші хост мезгіл-мезгіл терезе тексеру пакетін жібереді, ол қабылдаушы хост әлі де деректерді қабылдай алатынын анықтау үшін пайдаланылады. Қабылдаушы буферінің толып кету қаупі төнген кезде, жіберушіге жіберілген деректер көлемін басқаруға нұсқау беру үшін терезе өлшемі кішірек мәнге орнатылады.
Мұнда желі ағынын басқару диаграммасы берілген:
Желінің кептелуін бақылау
Кептелуді бақылауды енгізбес бұрын, қабылдау терезесі мен жіберу терезесінен басқа, негізінен жіберуші деректерді қабылдау терезесіне қандай жылдамдықпен жібере бастайтыны туралы мәселені шешу үшін қолданылатын кептелу терезесі де бар екенін түсінуіміз керек. Сондықтан кептелу терезесін TCP жіберушісі де жүргізеді. Бізге қанша деректерді жіберу орынды екенін шешу үшін алгоритм қажет, өйткені тым аз немесе тым көп деректерді жіберу идеалды емес, демек, кептеліс терезесі ұғымы.
Алдыңғы желі ағынын басқаруда жіберуші қабылдағыштың кэшін деректермен толтырады, бірақ біз желіде не болып жатқанын білмедік. Әдетте, компьютерлік желілер ортақ ортада болады. Нәтижесінде басқа хосттар арасындағы байланысқа байланысты желі кептелісі болуы мүмкін.
Желіде кептеліс болған кезде, пакеттердің көп саны жөнелтілсе, бұл пакеттердің кешігуі және жоғалуы сияқты мәселелерді тудыруы мүмкін. Бұл кезде TCP деректерді қайта жібереді, бірақ қайта жіберу желідегі жүктемені арттырады, нәтижесінде үлкен кідіріс пен пакеттік жоғалтулар артады. Бұл қатыгез циклге түсіп, одан әрі ұлғаюы мүмкін.
Осылайша, TCP желіде не болып жатқанын елемеу мүмкін емес. Желіде кептеліс болған кезде, TCP жіберілетін деректер көлемін азайту арқылы өзін құрбан етеді.
Сондықтан, бүкіл желіні жіберуші деректерімен толтыруды болдырмауға бағытталған кептелістерді бақылау ұсынылады. Жіберуші жіберуі тиіс деректер көлемін реттеу үшін TCP кептелу терезесі деп аталатын тұжырымдаманы анықтайды. Кептелуді бақылау алгоритмі жіберуші жіберген деректердің көлемін бақылау үшін желінің кептелу дәрежесіне сәйкес кептеліс терезесінің өлшемін реттейді.
Кептеліс терезесі дегеніміз не? Бұл жіберу терезесіне қандай қатысы бар?
Кептелу терезесі жіберуші жібере алатын деректер көлемін анықтайтын жіберуші қолдайтын күй айнымалысы болып табылады. Кептелу терезесі желінің кептелу деңгейіне сәйкес динамикалық түрде өзгереді.
Жіберу терезесі – қабылдаушы қабылдай алатын деректер көлемін көрсететін жіберуші мен қабылдаушы арасындағы келісілген терезе өлшемі. Кептелу терезесі мен жіберу терезесі байланысты; жіберу терезесі, әдетте, кептеліс пен қабылдау Windows-тың минимумына тең, яғни swnd = min(cwnd, rwnd).
Кептелу терезесі cwnd келесідей өзгереді:
Егер желіде кептеліс болмаса, яғни қайта жіберу күту уақыты болмаса, кептеліс терезесі артады.
Желіде кептеліс болса, кептеліс терезесі азаяды.
Жіберуші ACK растау пакетінің көрсетілген уақыт ішінде қабылданғанын бақылай отырып, желінің кептелуін анықтайды. Егер жіберуші ACK растау пакетін көрсетілген уақыт ішінде алмаса, желіде кептеліс бар деп саналады.
Кептелу терезесінен басқа, TCP кептелісін басқару алгоритмін талқылау уақыты келді. TCP кептелістерін басқару алгоритмі үш негізгі бөліктен тұрады:
Баяу бастау:Бастапқыда cwnd кептеліс терезесі салыстырмалы түрде кішкентай және жіберуші желі сыйымдылығына тез бейімделу үшін кептелу терезесін экспоненциалды түрде арттырады.
Кептелістерді болдырмау:Кептелу терезесі белгілі бір шекті мәннен асқаннан кейін жіберуші кептелу терезесінің өсу қарқынын бәсеңдету және желіні шамадан тыс жүктеуді болдырмау үшін кептелу терезесін сызықтық түрде арттырады.
Жылдам қалпына келтіру:Кептеліс орын алса, жіберуші кептелу терезесін екі есе қысқартады және алынған қайталанатын әрекеттер арқылы желіні қалпына келтіру орнын анықтау үшін жылдам қалпына келтіру күйіне кіреді, содан кейін кептелу терезесін арттыруды жалғастырады.
Баяу бастау
TCP қосылымы орнатылған кезде, cwnd кептеліс терезесі бастапқыда ең аз MSS (ең үлкен сегмент өлшемі) мәніне орнатылады. Осылайша, бастапқы жіберу жылдамдығы шамамен MSS/RTT байт/секунды құрайды. Нақты қол жетімді өткізу қабілеттілігі әдетте MSS/RTT қарағанда әлдеқайда үлкен, сондықтан TCP баяу іске қосу арқылы қол жеткізуге болатын оңтайлы жіберу жылдамдығын тапқысы келеді.
Баяу іске қосу процесінде кептелу терезесі cwnd мәні 1 АЖ-ға инициализацияланады және жіберілген пакет сегменті расталған сайын cwnd мәні бір АЖ-ға артады, яғни cwnd мәні 2 MSS болады. Осыдан кейін пакет сегментін әрбір сәтті жіберу үшін cwnd мәні екі еселенеді және т.б. Арнайы өсу процесі келесі суретте көрсетілген.
Дегенмен, жіберу жылдамдығы әрқашан өсе алмайды; өсу бір кездері аяқталуы керек. Сонымен, жіберу жылдамдығы қашан аяқталады? Баяу іске қосу әдетте бірнеше жолдардың бірімен жіберу жылдамдығын арттыруды аяқтайды:
Бірінші әдіс - баяу бастау жіберу процесі кезінде пакеттің жоғалуы. Пакеттің жоғалуы орын алған кезде, TCP жіберушінің cwnd кептелу терезесін 1 мәніне орнатады және баяу іске қосу процесін қайта бастайды. Осы кезде бастапқы мәні пакеттің жоғалуын тудыратын cwnd мәнінің жартысы болатын баяу бастау шегі ssthresh тұжырымдамасы енгізіледі. Яғни, кептеліс анықталғанда, ssthresh мәні терезе мәнінің жартысы болады.
Екінші жол - баяу іске қосу шегінің ssthresh мәнімен тікелей байланыстыру. Кептеліс анықталған кезде ssthresh мәні терезе мәнінің жартысы болғандықтан, cwnd ssthresh мәнінен үлкен болған кезде әрбір еселенген сайын пакет жоғалуы орын алуы мүмкін. Сондықтан cwnd параметрін ssthresh күйіне орнатқан дұрыс, бұл TCP кептелістерді басқару режиміне ауысып, баяу іске қосуды аяқтайды.
Баяу бастаудың аяқталуының соңғы жолы - үш артық рұқсат анықталса, TCP жылдам қайта жіберуді жүзеге асырады және қалпына келтіру күйіне өтеді. (Егер үш ACK пакетінің неліктен екені белгісіз болса, ол қайта жіберу механизмінде бөлек түсіндіріледі.)
Кептелісті болдырмау
TCP кептелуді басқару күйіне кіргенде, cwnd кептелу шегінің ssthresh жартысына орнатылады. Бұл пакет сегменті қабылданған сайын cwnd мәнін екі есе арттыруға болмайтынын білдіреді. Оның орнына, әрбір жіберу аяқталғаннан кейін cwnd мәні тек бір АЖ (пакет сегментінің максималды ұзындығы) ұлғайтылатын салыстырмалы түрде консервативті тәсіл қолданылады. Мысалы, 10 пакет сегменті расталса да, cwnd мәні тек бір АЖ-ға артады. Бұл сызықтық өсу үлгісі және оның өсудің жоғарғы шегі бар. Пакет жоғалуы орын алған кезде cwnd мәні АЖ-ға өзгертіледі және ssthresh мәні cwnd мәнінің жартысына орнатылады. Немесе ол 3 артық ACK жауабын алған кезде АЖ өсуін тоқтатады. Егер cwnd мәнін екі есе азайтқаннан кейін үш артық рұқсат әлі де алынса, ssthresh мәні cwnd мәнінің жартысы ретінде жазылады және жылдам қалпына келтіру күйі енгізіледі.
Жылдам қалпына келтіру
Жылдам қалпына келтіру күйінде кептелу терезесінің cwnd мәні әрбір алынған артық ACK үшін бір АЖ-ға артады, яғни дәйектілікпен келмейтін ACK. Бұл жіберу тиімділігін мүмкіндігінше жақсарту үшін желіде сәтті жіберілген пакет сегменттерін пайдалану.
Жоғалған пакет сегментінің ACK мәні келгенде, TCP cwnd мәнін төмендетеді, содан кейін кептелуді болдырмау күйіне өтеді. Бұл кептеліс терезесінің өлшемін бақылау және желі кептелісін одан әрі арттыруды болдырмау.
Кептелуді бақылау күйінен кейін күту уақыты орын алса, желі жағдайы күрделірек болады және TCP кептелуді болдырмау күйінен баяу іске қосу күйіне көшеді. Бұл жағдайда кептелу терезесі cwnd мәні 1 АЖ, пакет сегментінің максималды ұзындығына орнатылады және баяу іске қосу шегінің ssthresh мәні cwnd жартысына орнатылады. Мұның мақсаты – тарату жылдамдығы мен желінің кептелу дәрежесін теңестіру үшін желі қалпына келгеннен кейін кептеліс терезесінің өлшемін бірте-бірте ұлғайту.
Түйіндеме
Сенімді тасымалдау протоколы ретінде TCP реттік нөмірі, растау, ретрансляцияны басқару, қосылымды басқару және терезені басқару бойынша сенімді тасымалдауды жүзеге асырады. Олардың ішінде ағынды басқару механизмі қабылдағыштың нақты қабылдау мүмкіндігіне сәйкес жіберуші жіберетін деректер көлемін бақылайды, бұл желінің кептелуі және өнімділіктің төмендеуі проблемаларын болдырмайды. Кептелуді бақылау механизмі жіберуші жіберген деректер көлемін реттеу арқылы желідегі кептелістердің пайда болуын болдырмайды. Кептелу терезесі және жіберу терезесі ұғымдары бір-бірімен байланысты және жіберушідегі деректер көлемі кептеліс терезесінің өлшемін динамикалық реттеу арқылы бақыланады. Баяу бастау, кептелістерді болдырмау және жылдам қалпына келтіру TCP кептелістерін басқару алгоритмінің үш негізгі бөлігі болып табылады, олар желі сыйымдылығы мен кептелу дәрежесіне бейімделу үшін әртүрлі стратегиялар арқылы кептеліс терезесінің өлшемін реттейді.
Келесі бөлімде біз TCP қайта жіберу механизмін егжей-тегжейлі қарастырамыз. Қайта жіберу механизмі сенімді тасымалдауға қол жеткізу үшін TCP маңызды бөлігі болып табылады. Ол жоғалған, бүлінген немесе кешіктірілген деректерді қайта жіберу арқылы деректердің сенімді берілуін қамтамасыз етеді. Ретрансмиссия механизмін іске асыру принципі мен стратегиясы келесі бөлімде егжей-тегжейлі енгізіліп, талданатын болады. Бізбен бірге қалыңыз!
Жіберу уақыты: 24 ақпан 2025 ж