Настройка на TCP връзка
Когато разглеждаме в мрежата, изпращаме имейл или играем онлайн игра, често не мислим за сложната мрежова връзка зад нея. Именно тези на пръв поглед малки стъпки осигуряват стабилна комуникация между нас и сървъра. Една от най-важните стъпки е настройката на TCP връзката и ядрото на това е трипосочното ръкостискане.
Тази статия ще обсъди подробно принципа, процеса и значението на тристранното ръкостискане. Стъпка по стъпка, ще обясним защо е необходимо тристранното ръкостискане, как осигурява стабилността и надеждността на връзката и колко е важно за трансфера на данни. С по-задълбочено разбиране на тристранното ръкостискане ще придобием по-добро разбиране на основните механизми на мрежовата комуникация и по-ясен поглед върху надеждността на TCP връзките.
Трипосочен процес на ръкостискане на TCP и преходи на състоянието
TCP е транспортен протокол, ориентиран към връзката, който изисква установяване на връзка преди предаване на данни. Този процес на установяване на връзка се извършва от трипосочно ръкостискане.
Нека разгледаме по -подробно TCP пакетите, които се изпращат във всяка връзка.
Първоначално както клиентът, така и сървърът са затворени. Първо, сървърът активно слуша порт и е в състояние на слушане, което означава, че сървърът трябва да бъде стартиран. След това клиентът е готов да започне достъп до уеб страницата. Той трябва да установи връзка със сървъра. Форматът на първия пакет за свързване е следният:
Когато клиент инициира връзка, той генерира случаен първоначален номер на последователност (client_ISN) и я поставя в полето „Номер на последователността“ на заглавката на TCP. В същото време клиентът задава позицията на флаг на SYN на 1, за да посочи, че изходящият пакет е SYN пакет. Клиентът посочва, че желае да установи връзка със сървъра, като изпраща първия SYN пакет към сървъра. Този пакет не съдържа данни за приложения на слоя (тоест изпратени данни). В този момент състоянието на клиента е маркирано като SYN-SENT.
Когато сървърът получи SYN пакет от клиент, той на случаен принцип инициализира собствения си сериен номер (server_isn) и след това поставя този номер в полето "сериен номер" на TCP заглавката. След това сървърът въвежда client_isn + 1 в полето „Номер на потвърждение“ и задава както SYN, така и ACK битове на 1. Накрая, сървърът изпраща пакета на клиента, който не съдържа данни за приложението на приложението (и няма данни за изпращането на сървъра). По това време сървърът е в състояние на SYN-RCVD.
След като клиентът получи пакета от сървъра, той трябва да извърши следните оптимизации, за да отговори на окончателния пакет за отговор: Първо, клиентът задава ACK бита на TCP заглавката на пакета за отговор на 1; Второ, клиентът въвежда стойността server_isn + 1 в полето „Потвърдете номера на отговора“; И накрая, клиентът изпраща пакета на сървъра. Този пакет може да носи данни от клиента до сървъра. След приключване на тези операции клиентът ще влезе в установеното състояние.
След като сървърът получи пакета за отговор от клиента, той също преминава в установеното състояние.
Както можете да видите от горния процес, при извършване на трипосочно ръкостискане, третото ръкостискане е позволено да носи данни, но първите две ръкостискания не са. Това е въпрос, който често се задава в интервюта. След като тристранното ръкостискане приключи, и двете страни влизат в установеното състояние, което показва, че връзката е установена успешно, в този момент клиентът и сървърът могат да започнат да изпращат данни помежду си.
Защо три ръкостискания? Не два пъти, четири пъти?
Общият отговор е: „Защото тристранното ръкостискане гарантира възможността за получаване и изпращане“. Този отговор е правилен, но това е само повърхностната причина, не излага основната причина. По -нататък ще анализирам причините за тройното ръкостискане от три аспекта, за да задълбоча нашето разбиране по този въпрос.
Трипосочното ръкостискане може ефективно да избегне инициализацията на исторически повтарящите се връзки (основната причина)
Трипосочното ръкостискане гарантира, че и двете страни са получили надежден първоначален номер на последователност.
Трипосочното ръкостискане избягва да губи ресурси.
Причина 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 Connection се извършва с трипосочно ръкостискане. По време на тристранното ръкостискане клиентът първо изпраща пакет със SYN флаг на сървъра, което показва, че иска да установи връзка. След като получи заявката от клиента, сървърът отговаря на пакет със SYN и ACK флагове на клиента, като показва, че заявката за връзка е приета, и изпраща собствен първоначален номер на последователност. И накрая, клиентът отговаря с флаг на ACK на сървъра, за да посочи, че връзката е установена успешно. По този начин двете страни са в установената държава и могат да започнат да изпращат данни помежду си.
Като цяло, тристранният процес на ръкостискане за установяване на TCP връзка е проектиран да гарантира стабилността и надеждността на връзката, да се избегне объркване и загуба на ресурси над исторически връзки и да гарантира, че и двете страни могат да получават и изпращат данни.
Време за публикация: януари-08-2025