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 мәні 1 MSS мәніне инициализацияланады және берілген пакет сегменті расталған сайын cwnd мәні бір MSS мәніне артады, яғни cwnd мәні 2 MSS болады. Осыдан кейін пакет сегментінің әрбір сәтті берілуі үшін cwnd мәні екі еселенеді және т.б. Нақты өсу процесі келесі суретте көрсетілген.
Дегенмен, жіберу жылдамдығы әрқашан өсе бермейді; өсу бір кездері аяқталуы керек. Сонымен, жіберу жылдамдығының артуы қашан аяқталады? Баяу бастау әдетте жіберу жылдамдығының артуын бірнеше жолмен тоқтатады:
Бірінші әдіс - баяу іске қосуды жіберу процесінде пакеттің жоғалуы. Пакет жоғалған кезде, TCP жіберушінің жүктеме терезесін cwnd мәнін 1-ге орнатады және баяу іске қосу процесін қайта бастайды. Осы кезде бастапқы мәні пакеттің жоғалуын тудыратын cwnd мәнінің жартысына тең болатын баяу іске қосу шегі ssthresh тұжырымдамасы енгізіледі. Яғни, жүктеме анықталған кезде, ssthresh мәні терезе мәнінің жартысына тең.
Екінші әдіс - баяу іске қосу шегінің ssthresh мәнімен тікелей корреляциялау. Тығындық анықталған кезде ssthresh мәні терезе мәнінің жартысы болғандықтан, cwnd ssthresh-тен үлкен болған кезде әрбір екі еселенген сайын пакет жоғалуы мүмкін. Сондықтан, cwnd-ті ssthresh-ке орнатқан дұрыс, бұл TCP-нің тығыздықты басқару режиміне ауысуына және баяу іске қосуды тоқтатуына әкеледі.
Баяу іске қосудың аяқталуының соңғы жолы - үш артық акті анықталған жағдайда TCP жылдам қайта жіберуді жүзеге асырады және қалпына келтіру күйіне өтеді. (Егер неге үш ACK пакеті бар екені түсініксіз болса, бұл қайта жіберу механизмінде бөлек түсіндіріледі.)
Тығылудың алдын алу
TCP жүктемені басқару күйіне өткенде, cwnd жүктеме шегінің жартысына орнатылады (sthresh). Бұл cwnd мәні пакет сегменті алынған сайын екі еселенбейді дегенді білдіреді. Оның орнына, әрбір беру аяқталғаннан кейін cwnd мәні тек бір MSS-ке (пакет сегментінің максималды ұзындығы) артатын салыстырмалы түрде консервативті тәсіл қолданылады. Мысалы, 10 пакет сегменті танылса да, cwnd мәні тек бір MSS-ке артады. Бұл сызықтық өсу моделі және оның өсудің жоғарғы шегі бар. Пакет жоғалуы орын алған кезде, cwnd мәні MSS-ке өзгертіледі, ал sthresh мәні cwnd-тің жартысына орнатылады. Немесе ол 3 артық ACK жауабы алынған кезде MSS өсуін тоқтатады. Егер cwnd мәні екі еселенгеннен кейін де үш артық ACK алынса, ssthresh мәні cwnd мәнінің жартысы ретінде жазылады және жылдам қалпына келтіру күйі енгізіледі.
Жылдам қалпына келтіру
Жылдам қалпына келтіру күйінде, әрбір алынған артық ACK, яғни тізбектей келмейтін ACK үшін кептеліс терезесінің cwnd мәні бір MSS-ке артады. Бұл желіде сәтті жіберілген пакет сегменттерін пайдалану арқылы беру тиімділігін мүмкіндігінше арттыру үшін жасалады.
Жоғалған пакет сегментінің ACK келген кезде, TCP cwnd мәнін азайтады және содан кейін кептелісті болдырмау күйіне өтеді. Бұл кептеліс терезесінің өлшемін басқару және желі кептелісінің одан әрі артуына жол бермеу үшін жасалады.
Егер жүктемені бақылау күйінен кейін тайм-аут орын алса, желі жағдайы күрделене түседі және TCP жүктемені болдырмау күйінен баяу іске қосу күйіне ауысады. Бұл жағдайда, жүктеме терезесінің cwnd мәні 1 MSS-ке, пакет сегментінің максималды ұзындығына, ал баяу іске қосу шегінің ssthresh мәні cwnd-тің жартысына орнатылады. Мұның мақсаты - желі қалпына келгеннен кейін беріліс жылдамдығы мен желінің жүктеме дәрежесін теңестіру үшін жүктеме терезесінің өлшемін біртіндеп арттыру.
Қысқаша мазмұны
Сенімді тасымалдау хаттамасы ретінде TCP реттік нөмір, растау, қайта таратуды басқару, қосылымды басқару және терезені басқару арқылы сенімді тасымалдауды жүзеге асырады. Олардың ішінде ағынды басқару механизмі жіберуші жіберген деректер көлемін қабылдағыштың нақты қабылдау сыйымдылығына сәйкес басқарады, бұл желінің жүктелуі мен өнімділіктің төмендеуі мәселелерін болдырмайды. Жүктелуді басқару механизмі жіберуші жіберген деректер көлемін реттеу арқылы желінің жүктелуінің алдын алады. Жүктелу терезесі және жіберу терезесі ұғымдары бір-бірімен байланысты, ал жіберушідегі деректер көлемі жүктелу терезесінің өлшемін динамикалық түрде реттеу арқылы басқарылады. Баяу іске қосу, жүктелуді болдырмау және жылдам қалпына келтіру - TCP жүктелуді басқару алгоритмінің үш негізгі бөлігі, олар желінің сыйымдылығы мен жүктелу дәрежесіне бейімделу үшін жүктелу терезесінің өлшемін әртүрлі стратегиялар арқылы реттейді.
Келесі бөлімде біз TCP қайта жіберу механизмін егжей-тегжейлі қарастырамыз. Қайта жіберу механизмі сенімді беруді қамтамасыз ету үшін TCP-нің маңызды бөлігі болып табылады. Ол жоғалған, бүлінген немесе кешіктірілген деректерді қайта жіберу арқылы деректердің сенімді берілуін қамтамасыз етеді. Қайта жіберу механизмін іске асыру принципі мен стратегиясы келесі бөлімде егжей-тегжейлі таныстырылады және талданады. Хабардар болыңыз!
Жарияланған уақыты: 2025 жылғы 24 ақпан

