TCP კავშირის დაყენება
როდესაც ჩვენ ვათვალიერებთ ინტერნეტს, ვაგზავნით ელ.წერილს ან ვთამაშობთ ონლაინ თამაშს, ხშირად არ ვფიქრობთ მის უკან არსებულ რთულ ქსელურ კავშირზე. თუმცა, სწორედ ეს ერთი შეხედვით მცირე ნაბიჯები უზრუნველყოფს ჩვენსა და სერვერს შორის სტაბილურ კომუნიკაციას. ერთ-ერთი ყველაზე მნიშვნელოვანი ნაბიჯი არის TCP კავშირის დაყენება და ამის მთავარია სამმხრივი ხელის ჩამორთმევა.
ამ სტატიაში დეტალურად იქნება განხილული სამმხრივი ხელის ჩამორთმევის პრინციპი, პროცესი და მნიშვნელობა. ეტაპობრივად განვმარტავთ, რატომ არის საჭირო სამმხრივი ხელის ჩამორთმევა, როგორ უზრუნველყოფს კავშირის სტაბილურობასა და საიმედოობას და რამდენად მნიშვნელოვანია ის მონაცემთა გადაცემისთვის. სამმხრივი ხელის ჩამორთმევის უფრო ღრმა გაგებით, ჩვენ უკეთ გავიგებთ ქსელური კომუნიკაციის ძირითად მექანიზმებს და უფრო ნათელ ხედვას TCP კავშირების საიმედოობის შესახებ.
TCP სამმხრივი ხელის ჩამორთმევის პროცესი და მდგომარეობის გადასვლები
TCP არის კავშირზე ორიენტირებული სატრანსპორტო პროტოკოლი, რომელიც მოითხოვს კავშირის დამყარებას მონაცემთა გადაცემამდე. კავშირის დამყარების ეს პროცესი ხდება სამმხრივი ხელის ჩამორთმევით.
მოდით უფრო ახლოს მივხედოთ TCP პაკეტებს, რომლებიც იგზავნება თითოეულ კავშირში.
თავდაპირველად, კლიენტიც და სერვერიც დახურულია. პირველ რიგში, სერვერი აქტიურად უსმენს პორტს და იმყოფება LISTEN მდგომარეობაში, რაც ნიშნავს, რომ სერვერი უნდა დაიწყოს. შემდეგი, კლიენტი მზად არის დაიწყოს ვებგვერდზე წვდომა. მას სჭირდება სერვერთან კავშირის დამყარება. პირველი კავშირის პაკეტის ფორმატი შემდეგია:
როდესაც კლიენტი იწყებს კავშირს, ის წარმოქმნის შემთხვევით საწყის მიმდევრობის ნომერს (client_isn) და ათავსებს მას TCP სათაურის ველში "Sequence number". ამავდროულად, კლიენტი აყენებს SYN დროშის პოზიციას 1-ზე, რათა მიუთითოს, რომ გამავალი პაკეტი არის SYN პაკეტი. კლიენტი მიუთითებს, რომ მას სურს სერვერთან კავშირის დამყარება სერვერზე პირველი SYN პაკეტის გაგზავნით. ეს პაკეტი არ შეიცავს აპლიკაციის ფენის მონაცემებს (ანუ გაგზავნილ მონაცემებს). ამ ეტაპზე, კლიენტის სტატუსი მონიშნულია როგორც SYN-SENT.
როდესაც სერვერი იღებს SYN პაკეტს კლიენტისგან, ის შემთხვევით ახდენს საკუთარი სერიული ნომრის ინიციალიზაციას (server_isn) და შემდეგ დებს ამ ნომერს TCP სათაურის ველში "სერიული ნომერი". შემდეგ სერვერი შეიყვანს client_isn + 1 ველში "Acknowledgement number" და აყენებს SYN და ACK ბიტებს 1-ზე. ბოლოს სერვერი აგზავნის პაკეტს კლიენტს, რომელიც არ შეიცავს აპლიკაციის ფენის მონაცემებს (და არ შეიცავს მონაცემებს სერვერისთვის. გაგზავნა). ამ დროს სერვერი SYN-RCVD მდგომარეობაშია.
მას შემდეგ, რაც კლიენტი მიიღებს პაკეტს სერვერიდან, მას სჭირდება შემდეგი ოპტიმიზაცია, რათა უპასუხოს საბოლოო საპასუხო პაკეტს: პირველი, კლიენტი აყენებს საპასუხო პაკეტის TCP სათაურის ACK ბიტს 1-ზე; მეორეც, კლიენტი შეაქვს მნიშვნელობა server_isn + 1 ველში „პასუხის დადასტურების ნომერი“; საბოლოოდ, კლიენტი აგზავნის პაკეტს სერვერზე. ამ პაკეტს შეუძლია გადაიტანოს მონაცემები კლიენტიდან სერვერზე. ამ ოპერაციების დასრულების შემდეგ კლიენტი შევა ESTABLISHED მდგომარეობაში.
როგორც კი სერვერი მიიღებს საპასუხო პაკეტს კლიენტისგან, ის ასევე გადადის ESTABLISHED მდგომარეობაში.
როგორც ზემოაღნიშნული პროცესიდან ხედავთ, სამმხრივი ხელის ჩამორთმევისას, მესამე ხელის ჩამორთმევას ეძლევა მონაცემების გადატანა, მაგრამ პირველი ორი ხელის ჩამორთმევა არა. ეს არის კითხვა, რომელსაც ხშირად სვამენ ინტერვიუებში. სამმხრივი ხელის ჩამორთმევის დასრულების შემდეგ, ორივე მხარე შედის ESTABLISHED მდგომარეობაში, რაც მიუთითებს, რომ კავშირი წარმატებით დამყარდა, რა დროსაც კლიენტს და სერვერს შეუძლიათ დაიწყონ მონაცემთა გაგზავნა ერთმანეთთან.
რატომ სამი ხელის ჩამორთმევა? ორჯერ არა, ოთხჯერ?
საერთო პასუხია: „რადგან სამმხრივი ხელის ჩამორთმევა გარანტიას იძლევა მიღებისა და გაგზავნის უნარს“. ეს პასუხი სწორია, მაგრამ ეს მხოლოდ ზედაპირული მიზეზია, არ წამოაყენებს მთავარ მიზეზს. შემდგომში გავაანალიზებ სამმაგი ხელის ჩამორთმევის მიზეზებს სამი ასპექტიდან, რათა გავაღრმავოთ ამ საკითხის გაგება.
სამმხრივი ხელის ჩამორთმევას შეუძლია ეფექტურად აიცილოს თავიდან ისტორიულად განმეორებითი კავშირების ინიციალიზაცია (მთავარი მიზეზი)
სამმხრივი ხელის ჩამორთმევა გარანტიას იძლევა, რომ ორივე მხარემ მიიღო სანდო საწყისი რიგითობის ნომერი.
სამმხრივი ხელის ჩამორთმევა თავიდან აიცილებს რესურსების დაკარგვას.
მიზეზი 1: მოერიდეთ ისტორიულ დუბლიკატებს
მოკლედ, სამმხრივი ხელის ჩამორთმევის მთავარი მიზეზი არის ძველი დუბლიკატი კავშირის ინიციალიზაციის შედეგად გამოწვეული დაბნეულობის თავიდან აცილება. კომპლექსურ ქსელურ გარემოში, მონაცემთა პაკეტების გადაცემა ყოველთვის არ იგზავნება დანიშნულების ჰოსტში მითითებული დროის შესაბამისად, და ძველი მონაცემთა პაკეტები შესაძლოა პირველ რიგში მივიდეს დანიშნულების ჰოსტში ქსელის გადატვირთულობის და სხვა მიზეზების გამო. ამის თავიდან ასაცილებლად, TCP იყენებს სამმხრივ ხელის ჩამორთმევას კავშირის დასამყარებლად.
როდესაც კლიენტი აგზავნის რამდენიმე SYN კავშირის დამყარების პაკეტს ზედიზედ, ისეთ სიტუაციებში, როგორიცაა ქსელის გადატვირთულობა, შეიძლება მოხდეს შემდეგი:
1- ძველი SYN პაკეტები მიდის სერვერზე უახლესი SYN პაკეტების წინ.
2- სერვერი უპასუხებს SYN + ACK პაკეტს კლიენტს ძველი SYN პაკეტის მიღების შემდეგ.
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 იყენებს სამმხრივ ხელის ჩამორთმევას კავშირის დასამყარებლად, რათა თავიდან აიცილოს ეს პრობლემები.
რეზიუმე
Theქსელის პაკეტის ბროკერიTCP კავშირის დამყარება ხდება სამმხრივი ხელის ჩამორთმევით. სამმხრივი ხელის ჩამორთმევის დროს კლიენტი ჯერ აგზავნის პაკეტს SYN დროშით სერვერზე, რაც მიუთითებს, რომ მას სურს კავშირის დამყარება. კლიენტისგან მოთხოვნის მიღების შემდეგ, სერვერი უპასუხებს პაკეტს SYN და ACK დროშებით კლიენტს, რაც მიუთითებს, რომ კავშირის მოთხოვნა მიღებულია და აგზავნის საკუთარ თავდაპირველ მიმდევრობის ნომერს. და ბოლოს, კლიენტი პასუხობს სერვერს ACK დროშით, რათა მიუთითოს, რომ კავშირი წარმატებით დამყარდა. ამრიგად, ორი მხარე იმყოფება ESTABLISHED მდგომარეობაში და შეუძლიათ დაიწყონ მონაცემთა გაგზავნა ერთმანეთისთვის.
ზოგადად, TCP კავშირის დამყარების სამმხრივი ხელის ჩამორთმევის პროცესი შექმნილია კავშირის სტაბილურობისა და საიმედოობის უზრუნველსაყოფად, თავიდან აიცილოს დაბნეულობა და რესურსების დაკარგვა ისტორიულ კავშირებზე და უზრუნველყოს, რომ ორივე მხარეს შეუძლია მიიღოს და გაგზავნოს მონაცემები.
გამოქვეყნების დრო: იან-08-2025