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-ზე აყენებს და ნელი გაშვების პროცესს ხელახლა იწყებს. ამ ეტაპზე შემოდის ნელი გაშვების ზღურბლის 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-ის მნიშვნელობა იზრდება ერთი MSS-ით თითოეული მიღებული ზედმეტი ACK-ისთვის, ანუ ACK-ისთვის, რომელიც თანმიმდევრობით არ მოდის. ეს კეთდება ქსელში წარმატებით გადაცემული პაკეტის სეგმენტების გამოსაყენებლად, გადაცემის ეფექტურობის მაქსიმალურად გასაუმჯობესებლად.
როდესაც დაკარგული პაკეტის სეგმენტის ACK მოდის, TCP ამცირებს cwnd-ის მნიშვნელობას და შემდეგ გადადის შეგუბების თავიდან აცილების მდგომარეობაში. ეს კეთდება შეგუბების ფანჯრის ზომის გასაკონტროლებლად და ქსელის შეგუბების შემდგომი გაზრდის თავიდან ასაცილებლად.
თუ გადატვირთვის კონტროლის მდგომარეობის შემდეგ ტაიმაუტი მოხდება, ქსელის მდგომარეობა უფრო სერიოზული ხდება და TCP გადადის გადატვირთვის თავიდან აცილების მდგომარეობიდან ნელი გაშვების მდგომარეობაში. ამ შემთხვევაში, გადატვირთვის ფანჯრის cwnd მნიშვნელობა დაყენებულია 1 MSS-ზე, პაკეტის სეგმენტის მაქსიმალური სიგრძე, ხოლო ნელი გაშვების ზღურბლის ssthresh მნიშვნელობა დაყენებულია cwnd-ის ნახევარზე. ამის მიზანია გადატვირთვის ფანჯრის ზომის თანდათანობით გაზრდა ქსელის აღდგენის შემდეგ, გადაცემის სიჩქარისა და ქსელის გადატვირთვის ხარისხის დასაბალანსებლად.
რეზიუმე
როგორც საიმედო ტრანსპორტის პროტოკოლი, TCP ახორციელებს საიმედო ტრანსპორტირებას თანმიმდევრობის ნომრის, დადასტურების, ხელახალი გადაცემის კონტროლის, კავშირის მართვისა და ფანჯრის კონტროლის მეშვეობით. მათ შორის, ნაკადის კონტროლის მექანიზმი აკონტროლებს გამგზავნის მიერ გაგზავნილი მონაცემების რაოდენობას მიმღების ფაქტობრივი მიმღები სიმძლავრის მიხედვით, რაც თავიდან აიცილებს ქსელის გადატვირთვას და მუშაობის გაუარესების პრობლემებს. გადატვირთვის კონტროლის მექანიზმი თავიდან აიცილებს ქსელის გადატვირთვას გამგზავნის მიერ გაგზავნილი მონაცემების რაოდენობის რეგულირებით. გადატვირთვის ფანჯრისა და გაგზავნის ფანჯრის კონცეფციები ერთმანეთთან არის დაკავშირებული და გამგზავნთან მონაცემების რაოდენობა კონტროლდება გადატვირთვის ფანჯრის ზომის დინამიურად რეგულირებით. ნელი დაწყება, გადატვირთვის თავიდან აცილება და სწრაფი აღდგენა TCP გადატვირთვის კონტროლის ალგორითმის სამი ძირითადი ნაწილია, რომლებიც არეგულირებენ გადატვირთვის ფანჯრის ზომას სხვადასხვა სტრატეგიის მეშვეობით, რათა მოერგოს ქსელის სიმძლავრესა და გადატვირთვის ხარისხს.
შემდეგ ნაწილში დეტალურად განვიხილავთ TCP-ის ხელახალი გადაცემის მექანიზმს. ხელახალი გადაცემის მექანიზმი TCP-ის მნიშვნელოვანი ნაწილია საიმედო გადაცემის მისაღწევად. ის უზრუნველყოფს მონაცემთა საიმედო გადაცემას დაკარგული, დაზიანებული ან დაგვიანებული მონაცემების ხელახალი გადაცემით. ხელახალი გადაცემის მექანიზმის განხორციელების პრინციპი და სტრატეგია დეტალურად იქნება წარმოდგენილი და გაანალიზებული შემდეგ ნაწილში. დარჩით ჩვენთან!
გამოქვეყნების დრო: 2025 წლის 24 თებერვალი