Ключови мистерии на 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 в полето „Confirm answer number“; Накрая, клиентът изпраща пакета до сървъра. Този пакет може да пренася данни от клиента до сървъра. След завършване на тези операции, клиентът ще влезе в състояние 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.01.2025 г.