Клучни мистерии на 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 заглавието. Потоа, серверот внесува client_isn + 1 во полето „Број на потврда“ и ги поставува и SYN и ACK битовите на 1. Конечно, серверот го испраќа пакетот до клиентот, кој не содржи податоци од апликацискиот слој (и нема податоци што серверот треба да ги испрати). Во овој момент, серверот е во состојба SYN-RCVD.

ACK пакет

Откако клиентот ќе го прими пакетот од серверот, треба да ги изврши следните оптимизации за да одговори на конечниот пакет за одговор: Прво, клиентот го поставува ACK битот од TCP заглавието на пакетот за одговор на 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 користи тринасочно ракување за да ја воспостави врската и да избегне појава на овие проблеми.

Резиме
НаБрокер за мрежни пакетиВоспоставувањето на TCP конекција се врши со тројно ракување. За време на тројното ракување, клиентот прво испраќа пакет со SYN знаменце до серверот, што укажува дека сака да воспостави конекција. Откако ќе го прими барањето од клиентот, серверот одговара со пакет со SYN и ACK знаменца до клиентот, што укажува дека барањето за конекција е прифатено, и го испраќа својот почетен секвенцијален број. Конечно, клиентот одговара со ACK знаменце до серверот за да покаже дека конекцијата е успешно воспоставена. Така, двете страни се во состојба ESTABLISHED и можат да почнат да испраќаат податоци една до друга.

Генерално, процесот на тринасочно ракување за воспоставување TCP конекција е дизајниран да обезбеди стабилност и сигурност на конекцијата, да избегне забуна и трошење ресурси преку историски конекции и да обезбеди дека двете страни се во можност да примаат и испраќаат податоци.


Време на објавување: 08.01.2025