Налада TCP-злучэння
Калі мы праглядаем вэб-старонкі, адпраўляем электронныя лісты або гуляем у анлайн-гульні, мы часта не задумваемся пра складанае сеткавае падключэнне, якое за гэтым стаіць. Аднак менавіта гэтыя, здавалася б, невялікія крокі забяспечваюць стабільную сувязь паміж намі і серверам. Адным з найважнейшых крокаў з'яўляецца налада TCP-злучэння, а асновай гэтага з'яўляецца трохбаковае рукопожатие.
У гэтым артыкуле падрабязна абмяркуюцца прынцып, працэс і важнасць трохбаковага поціску. Крок за крокам мы растлумачым, чаму патрэбны трохбаковы поціск, як ён забяспечвае стабільнасць і надзейнасць злучэння і наколькі ён важны для перадачы дадзеных. Дзякуючы больш глыбокаму разуменню трохбаковага поціску, мы атрымаем лепшае разуменне асноўных механізмаў сеткавай сувязі і больш выразнае ўяўленне аб надзейнасці TCP-злучэнняў.
Працэс трохбаковага кідання TCP і пераходы станаў
TCP — гэта транспартны пратакол, арыентаваны на злучэнне, які патрабуе ўстанаўлення злучэння перад перадачай дадзеных. Гэты працэс усталявання злучэння ажыццяўляецца шляхам трохбаковага падпісвання.
Давайце больш падрабязна разгледзім TCP-пакеты, якія адпраўляюцца ў кожным злучэнні.
Спачатку і кліент, і сервер ЗАКРЫТЫЯ. Спачатку сервер актыўна праслухоўвае порт і знаходзіцца ў стане LISTEN, што азначае, што сервер павінен быць запушчаны. Далей кліент гатовы пачаць доступ да вэб-старонкі. Яму неабходна ўсталяваць злучэнне з серверам. Фармат першага пакета падключэння наступны:
Калі кліент ініцыюе злучэнне, ён генеруе выпадковы пачатковы парадкавы нумар (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 у поле «Нумар пацверджання адказу»; нарэшце, кліент адпраўляе пакет на сервер. Гэты пакет можа пераносіць дадзеныя ад кліента да сервера. Пасля завяршэння гэтых аперацый кліент пяройдзе ў стан 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 студзеня 2025 г.