TCP 3-посочно ръкостискане (SYN, SYN-ACK,ACK)
⚡ Умно обобщение
TCP 3-Way Handshake е ритуалът за установяване на връзка, с който започва всяка TCP сесия. Клиентът и сървърът обменят SYN, SYN-ACK и ACK пакети, за да синхронизират последователните номера и да потвърдят, че двете страни са готови, преди да бъде изпратен и един байт от данните на приложението.

Какво е TCP тристранно ръкостискане?
- TCP тристранно ръкостискане е процедурата, която клиентът и сървърът използват в TCP/IP мрежа да се установи надеждна връзка, преди да се обменят каквито и да е данни от приложението. Както подсказва името, то се състои от три стъпки, в които двете страни обменят пакети за синхронизация (SYN) и потвърждение (ACK) и се договарят за началните поредни номера, които ще използват.
Ръкостискането е проектирано така, че и двете крайни точки да могат да инициират, договарят и прекъсват TCP сокети симетрично. След като ръкостискането приключи, връзката е пълнодуплексна - и двете страни могат да изпращат и получават паралелно, докато някоя от тях не издаде FIN за затваряне на сесията.
Типове TCP съобщения
Четири контролни флага се появяват многократно по време на ръкостискането и разглобяването.
| Съобщение | Descriptйон |
|---|---|
| СИН | Инициира връзка и синхронизира последователните номера между устройствата. |
| ACK | Потвърждава на другата страна, че предишният сегмент е получен. |
| SYN-ACK | Комбинирано съобщение — SYN от локалното устройство плюс ACK на по-ранния SYN на партньора. |
| FIN | Използва се за грациозно прекратяване на връзка. |
TCP трипосочен процес на ръкостискане
TCP трафикът винаги започва с тристранно ръкостискане. Клиентът инициира разговора, като поиска сесия със сървъра.
Диаграма на 3-странно ръкостискане.
- Стъпка 1 — SYN: Клиентът изпраща сегмент с установен SYN флаг. Той казва на сървъра „Искам да започна комуникация“ и предлага начален пореден номер.
- Стъпка 2 — SYN-ACK: Сървърът отговаря със сегмент, в който са зададени и двата флага SYN, и ACK. ACK потвърждава SYN на клиента, а SYN предлага собствения начален пореден номер на сървъра.
- Стъпка 3 — ПОТВЪРЖДЕНИЕ: Клиентът потвърждава SYN-ACK на сървъра с окончателно ACK. Връзката вече е установена и двете страни могат да започнат. transmitданни от приложението.
Пример от реалния свят
Ето един работен пример с конкретни поредни номера.
- Хост X стартира връзката, като изпраща TCP SYN пакет към сървъра. Пакетът носи произволен начален пореден номер — например,
4321— това маркира началото на байтовия поток, който хост X ще изпрати. - Сървърът получава SYN и отговаря със SYN-ACK. ACK номерът е поредният номер на хост X, увеличен с 1 (
4322), а SYN предлага собствения начален пореден номер на сървъра. - Хост X отговаря с окончателно ACK, чийто номер за потвърждение е поредният номер на сървъра, увеличен с 1.
След като обменът на данни приключи, TCP прекъсва връзката с четиристранна FIN/ACK последователност, така че и двете крайни точки да могат да освободят сокета безпроблемно.
Защо TCP се нуждае от тристранно ръкостискане
Ръкостискането не е просто формалност — то решава три конкретни проблема, свързани с надеждния транспорт на байтов поток:
- Синхронизиране на поредни номера: И двамата партньори научават началния пореден номер на другата страна, който TCP използва за откриване на загубени или неподредени сегменти.
- Споразумение за състояние на връзката: Третият ACK потвърждава, че SYN-ACK на сървъра е пристигнал, така че нито една от страните не започва да изпраща данни, докато и двете не са в УСТАНОВЕН състояние.
- Защита от дублиращи се пакети: Случайните начални последователни номера и състоянията на ръкостискане с ограничено време предотвратяват погрешното приемане на остарели сегменти от предишна сесия.
Често срещани проблеми с TCP ръкостискането
Ръкостискането е стабилно, но се разпада по разпознаваеми начини. Мрежовите инженери обикновено виждат едно от следните:
- SYN flood атаки: Злонамерен клиент изпраща хиляди SYN-и, без да отговаря на SYN-ACK-и, изчерпвайки таблицата за връзки на сървъра. SYN бисквитките са стандартната защита.
- Полуотворени връзки: Когато третият ACK се загуби, връзката остава полуотворена и в крайна сметка се прекратява поради изчакване.
- Сривове на защитната стена или NAT по време на полет: Междинните кутии със състояние, които губят състояние, могат да изпуснат SYN-ACK пакети и да накарат клиента да опита отново.
- RST нулиране: Ако сървърът не слуша на заявения порт, той отговаря на SYN с RST, което незабавно прекратява опита.


