ქსელური პაკეტების ბროკერის TCP კავშირების ძირითადი საიდუმლოებები: სამმაგი ხელის ჩამორთმევის აუცილებლობის დემსტიფიკაცია

TCP კავშირის დაყენება
როდესაც ვებგვერდებს ვათვალიერებთ, ელფოსტას ვგზავნით ან ონლაინ თამაშს ვთამაშობთ, ხშირად არ ვფიქრობთ მის უკან მდგარ რთულ ქსელურ კავშირზე. თუმცა, სწორედ ეს, ერთი შეხედვით, პატარა ნაბიჯები უზრუნველყოფს ჩვენსა და სერვერს შორის სტაბილურ კომუნიკაციას. ერთ-ერთი ყველაზე მნიშვნელოვანი ნაბიჯი TCP კავშირის დაყენებაა და ამის ძირითადი ნაწილი სამმხრივი ხელის ჩამორთმევაა.

ამ სტატიაში დეტალურად იქნება განხილული სამმხრივი ხელის ჩამორთმევის პრინციპი, პროცესი და მნიშვნელობა. ეტაპობრივად ავხსნით, თუ რატომ არის საჭირო სამმხრივი ხელის ჩამორთმევა, როგორ უზრუნველყოფს ის კავშირის სტაბილურობასა და საიმედოობას და რამდენად მნიშვნელოვანია ის მონაცემთა გადაცემისთვის. სამმხრივი ხელის ჩამორთმევის უფრო ღრმა გაგებით, უკეთ გავიგებთ ქსელური კომუნიკაციის ძირითად მექანიზმებს და უფრო ნათელ წარმოდგენას შევიქმნით TCP კავშირების საიმედოობაზე.

TCP სამმხრივი ხელის შეხების პროცესი და მდგომარეობის გადასვლები
TCP არის კავშირზე ორიენტირებული სატრანსპორტო პროტოკოლი, რომელიც მონაცემთა გადაცემამდე კავშირის დამყარებას მოითხოვს. კავშირის დამყარების ეს პროცესი სამმხრივი ხელის ჩამორთმევით ხორციელდება.

 TCP სამმხრივი ხელის შეკავება

მოდით, უფრო დეტალურად განვიხილოთ თითოეული კავშირის დროს გაგზავნილი TCP პაკეტები.

თავდაპირველად, როგორც კლიენტი, ასევე სერვერი დახურულია. პირველ რიგში, სერვერი აქტიურად უსმენს პორტს და იმყოფება LISTEN მდგომარეობაში, რაც ნიშნავს, რომ სერვერი უნდა ჩაირთოს. შემდეგ, კლიენტი მზადაა ვებგვერდზე წვდომის დასაწყებად. მან უნდა დაამყაროს კავშირი სერვერთან. პირველი კავშირის პაკეტის ფორმატი შემდეგია:

 SYN პაკეტი

როდესაც კლიენტი იწყებს კავშირს, ის წარმოქმნის შემთხვევით საწყის თანმიმდევრობის ნომერს (client_isn) და ათავსებს მას TCP სათაურის „თანმიმდევრობის ნომრის“ ველში. ამავდროულად, კლიენტი SYN დროშის პოზიციას 1-ზე აყენებს, რაც მიუთითებს, რომ გამავალი პაკეტი არის SYN პაკეტი. კლიენტი მიუთითებს, რომ მას სურს სერვერთან კავშირის დამყარება პირველი SYN პაკეტის სერვერზე გაგზავნით. ეს პაკეტი არ შეიცავს აპლიკაციის დონის მონაცემებს (ანუ გაგზავნილ მონაცემებს). ამ ეტაპზე, კლიენტის სტატუსი მონიშნულია, როგორც SYN-SENT.

SYN+ACK პაკეტი

როდესაც სერვერი კლიენტისგან იღებს SYN პაკეტს, ის შემთხვევით ახდენს საკუთარი სერიული ნომრის (server_isn) ინიციალიზებას და შემდეგ ამ ნომერს TCP სათაურის „სერიული ნომრის“ ველში ათავსებს. შემდეგ, სერვერი „Acknowledgement number“ ველში client_isn + 1 შეიყვანს და SYN და ACK ბიტებს 1-ზე აყენებს. და ბოლოს, სერვერი კლიენტს უგზავნის პაკეტს, რომელიც არ შეიცავს აპლიკაციის დონის მონაცემებს (და არც სერვერის მიერ გასაგზავნ მონაცემებს). ამ დროს სერვერი SYN-RCVD მდგომარეობაშია.

ACK პაკეტი

მას შემდეგ, რაც კლიენტი სერვერისგან პაკეტს მიიღებს, საბოლოო პასუხის პაკეტზე რეაგირებისთვის მას შემდეგი ოპტიმიზაცია სჭირდება: პირველ რიგში, კლიენტი პასუხის პაკეტის TCP სათაურის ACK ბიტს 1-ზე აყენებს; მეორეც, კლიენტი "პასუხის ნომრის დადასტურების" ველში შეიყვანს მნიშვნელობას server_isn + 1; და ბოლოს, კლიენტი პაკეტს სერვერზე აგზავნის. ამ პაკეტს შეუძლია მონაცემების გადატანა კლიენტიდან სერვერზე. ამ ოპერაციების დასრულების შემდეგ, კლიენტი გადავა ESTABLISHED მდგომარეობაში.

როგორც კი სერვერი კლიენტისგან მიიღებს პასუხის პაკეტს, ის ასევე გადადის დამკვიდრებულ მდგომარეობაში.

როგორც ზემოთ მოყვანილი პროცესიდან ხედავთ, სამმხრივი ხელის ჩამორთმევის შესრულებისას, მესამე ხელის ჩამორთმევას მონაცემების გადატანის უფლება აქვს, მაგრამ პირველი ორი ხელის ჩამორთმევა - არა. ეს კითხვა ხშირად ისმის ინტერვიუების დროს. სამმხრივი ხელის ჩამორთმევის დასრულების შემდეგ, ორივე მხარე გადადის დამყარებულ მდგომარეობაში, რაც მიუთითებს, რომ კავშირი წარმატებით დამყარდა, რის შემდეგაც კლიენტს და სერვერს შეუძლიათ ერთმანეთისთვის მონაცემების გაგზავნა დაიწყონ.

რატომ სამი ხელის ჩამორთმევა? ორჯერ კი არა, ოთხჯერ?
გავრცელებული პასუხია: „რადგან სამმხრივი ხელის ჩამორთმევა იძლევა მიღებისა და გაგზავნის შესაძლებლობას“. ეს პასუხი სწორია, მაგრამ ის მხოლოდ ზედაპირული მიზეზია და არ წარმოადგენს მთავარ მიზეზს. ქვემოთ, ამ საკითხის გააზრების გასაღრმავებლად, სამმხრივი ხელის ჩამორთმევის მიზეზებს სამი ასპექტიდან გავაანალიზებ.

სამმხრივი ხელის ჩამორთმევა ეფექტურად აარიდებს თავიდან ისტორიულად განმეორებადი კავშირების ინიციალიზაციას (მთავარი მიზეზი)
სამმხრივი ხელის ჩამორთმევა იძლევა გარანტიას, რომ ორივე მხარემ მიიღო საიმედო საწყისი თანმიმდევრობის ნომერი.
სამმხრივი ხელის ჩამორთმევა რესურსების ფლანგვას თავიდან აგაცილებთ.

მიზეზი 1: ისტორიული დუბლიკატი შეერთებების თავიდან აცილება
მოკლედ რომ ვთქვათ, სამმხრივი კავშირის ინიციალიზაციის შედეგად გამოწვეული დაბნეულობის თავიდან აცილება სამმხრივი კავშირის ინიციალიზაციის მთავარი მიზეზია. რთულ ქსელურ გარემოში მონაცემთა პაკეტების გადაცემა ყოველთვის არ იგზავნება დანიშნულების ჰოსტზე მითითებული დროის შესაბამისად და ძველი მონაცემთა პაკეტები შეიძლება დანიშნულების ჰოსტზე უფრო ადრე მივიდეს ქსელის გადატვირთვისა და სხვა მიზეზების გამო. ამის თავიდან ასაცილებლად, TCP იყენებს სამმხრივ კავშირის დამყარებას.

სამმხრივი ხელის ჩამორთმევა თავიდან აგაცილებთ ისტორიულ დუბლიკატ კავშირებს

როდესაც კლიენტი ზედიზედ აგზავნის რამდენიმე SYN კავშირის დამყარების პაკეტს, ქსელის შეშუპების მსგავს სიტუაციებში შეიძლება მოხდეს შემდეგი:

1- ძველი SYN პაკეტები სერვერზე უახლეს SYN პაკეტებზე ადრე ჩადის.
2- სერვერი ძველი SYN პაკეტის მიღების შემდეგ კლიენტს გაუგზავნის SYN + ACK პაკეტს.
3- როდესაც კლიენტი იღებს SYN + ACK პაკეტს, ის საკუთარი კონტექსტის მიხედვით ადგენს, რომ კავშირი ისტორიული კავშირია (მიმდევრობის ნომრის ვადა ამოიწურა ან დროის ამოწურვაა) და შემდეგ აგზავნის RST პაკეტს სერვერზე კავშირის შესაწყვეტად.

ორმხრივი კავშირის შემთხვევაში, შეუძლებელია იმის დადგენა, არის თუ არა მიმდინარე კავშირი ისტორიული კავშირი. სამმხრივი კავშირის შემთხვევაში, კლიენტს საშუალებას აძლევს, განსაზღვროს, არის თუ არა მიმდინარე კავშირი ისტორიული კავშირი კონტექსტის საფუძველზე, როდესაც ის მზად იქნება მესამე პაკეტის გასაგზავნად:

1- თუ ეს ისტორიული კავშირია (მიმდევრობის ნომრის ვადა ამოიწურა ან დროის ამოწურვა მოხდა), მესამე ხელის შეხებით გაგზავნილი პაკეტი არის RST პაკეტი ისტორიული კავშირის შეწყვეტისთვის.
2- თუ ეს არ არის ისტორიული კავშირი, მესამედ გაგზავნილი პაკეტი არის ACK პაკეტი და ორივე კომუნიკაციის მხარე წარმატებით ამყარებს კავშირს.

ამრიგად, TCP-ის სამმხრივი ხელის შეშლის გამოყენების მთავარი მიზეზი ის არის, რომ ის ახდენს კავშირის ინიციალიზაციას ისტორიული კავშირების თავიდან ასაცილებლად.

მიზეზი 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 დროშით უგზავნის სიგნალს, რაც მიუთითებს, რომ კავშირი წარმატებით დამყარდა. ამრიგად, ორივე მხარე იმყოფება დამყარებულ მდგომარეობაში და შეუძლია ერთმანეთისთვის მონაცემების გაგზავნა დაიწყოს.

ზოგადად, TCP კავშირის დამყარების სამმხრივი ხელის შეხების პროცესი შექმნილია კავშირის სტაბილურობისა და საიმედოობის უზრუნველსაყოფად, ისტორიულ კავშირებზე დაბნეულობისა და რესურსების ფლანგვის თავიდან ასაცილებლად და იმის უზრუნველსაყოფად, რომ ორივე მხარეს შეეძლოს მონაცემების მიღება და გაგზავნა.


გამოქვეყნების დრო: 2025 წლის 8 იანვარი