Ключавыя таямніцы 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 выкарыстоўвае трохбаковае рукапацісканне для ўстанаўлення злучэння, каб пазбегнуць узнікнення гэтых праблем.

Рэзюмэ
TheБрокер сеткавых пакетаўУсталяванне злучэння TCP ажыццяўляецца з дапамогай трохбаковага рукапаціскання. Падчас трохбаковага рукапаціскання кліент спачатку адпраўляе серверу пакет са сцягам SYN, які паказвае, што ён хоча ўсталяваць злучэнне. Пасля атрымання запыту ад кліента сервер адказвае кліенту пакетам са сцягамі SYN і ACK, якія паказваюць, што запыт на злучэнне прыняты, і адпраўляе свой уласны пачатковы парадкавы нумар. Нарэшце, кліент адказвае сцягам ACK на сервер, каб паказаць, што злучэнне было паспяхова ўстаноўлена. Такім чынам, абодва бакі знаходзяцца ў стане ESTABLISHED і могуць пачаць адпраўку даных адзін аднаму.

Увогуле, трохбаковы працэс рукапаціскання для ўстанаўлення TCP-злучэння прызначаны для забеспячэння стабільнасці і надзейнасці злучэння, пазбягання блытаніны і марнавання рэсурсаў на гістарычныя злучэнні і забеспячэння таго, каб абодва бакі маглі атрымліваць і адпраўляць даныя.


Час публікацыі: 8 студзеня 2025 г