Ключови мистерии на TCP връзките на мрежовия брокер на пакети: Демистифицира необходимостта от тройно ръкостискане

Настройка на TCP връзка
Когато сърфираме в интернет, изпращаме имейл или играем онлайн игра, често не мислим за сложната мрежова връзка зад това. Но именно тези на пръв поглед малки стъпки осигуряват стабилна комуникация между нас и сървъра. Една от най-важните стъпки е настройката на TCP връзката и ядрото на това е тристранното ръкостискане.

Тази статия ще обсъди подробно принципа, процеса и значението на тристранното ръкостискане. Стъпка по стъпка ще обясним защо е необходимо тристранното ръкостискане, как осигурява стабилност и надеждност на връзката и колко е важно за преноса на данни. С по-задълбочено разбиране на тристранното ръкостискане ще придобием по-добро разбиране на основните механизми на мрежовата комуникация и по-ясна представа за надеждността на TCP връзките.

TCP трипосочен процес на ръкостискане и преходи на състояния
TCP е транспортен протокол, ориентиран към връзката, който изисква установяване на връзка преди предаване на данни. Този процес на установяване на връзка се извършва чрез тристранно ръкостискане.

 TCP тристранно ръкостискане

Нека разгледаме по-подробно TCP пакетите, които се изпращат във всяка връзка.

Първоначално и клиентът, и сървърът са ЗАТВОРЕНИ. Първо, сървърът слуша активно на порт и е в състояние СЛУШАНЕ, което означава, че сървърът трябва да бъде стартиран. След това клиентът е готов да започне достъп до уеб страницата. Трябва да установи връзка със сървъра. Форматът на първия пакет за връзка е както следва:

 SYN пакет

Когато клиент инициира връзка, той генерира произволен начален пореден номер (client_isn) и го поставя в полето "Пореден номер" на TCP заглавката. В същото време клиентът задава позицията на флага SYN на 1, за да покаже, че изходящият пакет е SYN пакет. Клиентът посочва, че желае да установи връзка със сървъра, като изпрати първия SYN пакет към сървъра. Този пакет не съдържа данни от приложния слой (т.е. изпратени данни). В този момент статусът на клиента е маркиран като SYN-SENT.

Пакет SYN+ACK

Когато сървърът получи SYN пакет от клиент, той произволно инициализира собствения си сериен номер (server_isn) и след това поставя този номер в полето „Сериен номер“ на TCP заглавката. След това сървърът въвежда client_isn + 1 в полето „Acknowledgement number“ и задава битовете 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 използва тристранното ръкостискане, за да установи връзката, за да избегне появата на тези проблеми.

Резюме
TheБрокер на мрежови пакетиУстановяването на TCP връзка се извършва с тристранно ръкостискане. По време на тристранното ръкостискане клиентът първо изпраща пакет с флага SYN към сървъра, което показва, че иска да установи връзка. След като получи заявката от клиента, сървърът отговаря на пакет с флагове SYN и ACK на клиента, което показва, че заявката за връзка е приета, и изпраща свой собствен първоначален пореден номер. Накрая клиентът отговаря с ACK флаг на сървъра, за да покаже, че връзката е успешно установена. Така двете страни са в състояние ESTABLISHED и могат да започнат да изпращат данни една на друга.

Като цяло процесът на тристранно ръкостискане за установяване на TCP връзка е предназначен да гарантира стабилност и надеждност на връзката, да избягва объркване и загуба на ресурси при исторически връзки и да гарантира, че и двете страни могат да получават и изпращат данни.


Време на публикуване: 8 януари 2025 г