Сүлжээний пакет зуучлагч 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 багц

Үйлчлүүлэгч серверээс пакет хүлээн авсны дараа эцсийн хариу пакетт хариу өгөхийн тулд дараах оновчлолыг хийх шаардлагатай: Нэгдүгээрт, үйлчлүүлэгч хариу пакетийн TCP толгой хэсгийн ACK битийг 1 болгож тохируулна; Хоёрдугаарт, үйлчлүүлэгч "Хариултын дугаарыг баталгаажуулах" талбарт server_isn + 1 утгыг оруулна; Эцэст нь, үйлчлүүлэгч пакетийг сервер рүү илгээнэ. Энэ пакет нь үйлчлүүлэгчээс сервер рүү өгөгдөл дамжуулж чадна. Эдгээр үйлдлүүд дууссаны дараа үйлчлүүлэгч ТОГТОЛЦООСОН төлөвт орно.

Сервер үйлчлүүлэгчээс хариу пакетийг хүлээн авсны дараа мөн STABLISHED төлөв рүү шилждэг.

Дээрх процессоос харахад гурван талын гар барих үйлдэл хийх үед гурав дахь гар барих үйлдэл нь өгөгдөл дамжуулахыг зөвшөөрдөг боловч эхний хоёр гар барих үйлдэл нь зөвшөөрдөггүй. Энэ бол ярилцлагад ихэвчлэн асуудаг асуулт юм. Гурван талын гар барих ажиллагаа дууссаны дараа хоёр тал хоёулаа ТОГТОЛЦООСОН төлөвт ордог бөгөөд энэ нь холболт амжилттай тогтсоныг илтгэдэг бөгөөд энэ үед клиент болон сервер бие биедээ өгөгдөл илгээж эхлэх боломжтой.

Яагаад гурван удаа гар барих ёстой гэж? Хоёр биш, дөрвөн удаа?
Нийтлэг хариулт бол "Учир нь гурван талын гар барих нь хүлээн авах, илгээх чадварыг баталгаажуулдаг." Энэ хариулт зөв боловч энэ нь зөвхөн өнгөц шалтгаан бөгөөд гол шалтгааныг нь гаргаж тавиагүй болно. Дараах хэсэгт би энэ асуудлын талаарх бидний ойлголтыг гүнзгийрүүлэхийн тулд гурвалсан гар барихын шалтгааныг гурван талаас нь шинжилнэ.

Гурван талын гар барих нь түүхэн давтагдсан холболтуудыг эхлүүлэхээс үр дүнтэйгээр зайлсхийж чадна (гол шалтгаан)
Гурван талын гар барих нь хоёр тал хоёулаа найдвартай анхны дарааллын дугаарыг хүлээн авсан болохыг баталгаажуулдаг.
Гурван талын гар барих нь нөөцийг үр ашиггүй зарцуулахаас зайлсхийдэг.

Шалтгаан 1: Түүхэн давхардсан нэгдлээс зайлсхий
Товчхондоо, гурван талын гар барих гол шалтгаан нь хуучин давхардсан холболтын эхлүүлэлтээс үүдэлтэй төөрөгдлөөс зайлсхийх явдал юм. Нарийн төвөгтэй сүлжээний орчинд өгөгдлийн пакет дамжуулалт нь заасан хугацааны дагуу очих хост руу үргэлж илгээгддэггүй бөгөөд сүлжээний ачаалал болон бусад шалтгааны улмаас хуучин өгөгдлийн пакетууд очих хост дээр эхэлж ирж болно. Үүнээс зайлсхийхийн тулд TCP нь холболт тогтоохын тулд гурван талын гар барих аргыг ашигладаг.

Гурван талын гар барих нь түүхэн давхардсан холболтоос зайлсхийдэг

Сүлжээний ачаалал гэх мэт нөхцөл байдалд үйлчлүүлэгч олон SYN холболт тогтоох пакетуудыг дараалан илгээх үед дараах зүйлс тохиолдож болно:

1- Хуучин SYN пакетууд хамгийн сүүлийн SYN пакетуудаас өмнө сервер дээр ирдэг.
2- Сервер нь хуучин SYN пакетийг хүлээн авсны дараа үйлчлүүлэгч рүү SYN + ACK пакет хариу илгээнэ.
3- Клиент SYN + ACK пакетийг хүлээн авахдаа өөрийн нөхцөл байдлын дагуу холболт нь түүхэн холболт (дарааллын дугаар дууссан эсвэл хугацаа дууссан) болохыг тодорхойлж, дараа нь холболтыг зогсоохын тулд RST пакетийг сервер рүү илгээдэг.

Хоёр гар барих холболттой үед одоогийн холболт нь түүхэн холболт мөн эсэхийг тодорхойлох арга байхгүй. Гурван талын гар барих нь клиент гурав дахь пакетийг илгээхэд бэлэн болсон үед тухайн нөхцөл байдалд үндэслэн одоогийн холболт нь түүхэн холболт мөн эсэхийг тодорхойлох боломжийг олгодог:

1- Хэрэв энэ нь түүхэн холболт бол (дарааллын дугаар дууссан эсвэл хугацаа дууссан), гурав дахь гар барихаар илгээсэн пакет нь түүхэн холболтыг зогсоох RST пакет юм.
2- Хэрэв энэ нь түүхэн холболт биш бол гурав дахь удаагаа илгээсэн пакет нь ACK пакет бөгөөд хоёр харилцагч тал холболтыг амжилттай тогтооно.

Тиймээс TCP нь гурван талын гар барих аргыг ашигладаг гол шалтгаан нь түүхэн холболтоос урьдчилан сэргийлэхийн тулд холболтыг эхлүүлдэгт оршино.

Шалтгаан 2: Хоёр талын анхны дарааллын дугаарыг синхрончлох
TCP протоколын хоёр тал хоёулаа найдвартай дамжуулалтыг хангах гол хүчин зүйл болох дарааллын дугаарыг хадгалах ёстой. Дарааллын дугаарууд нь TCP холболтод чухал үүрэг гүйцэтгэдэг. Тэд дараахь зүйлийг хийдэг.

Хүлээн авагч нь давхардсан өгөгдлийг арилгаж, өгөгдлийн үнэн зөвийг баталгаажуулж чадна.

Хүлээн авагч нь өгөгдлийн бүрэн бүтэн байдлыг хангахын тулд дарааллын дугаарын дарааллаар пакетуудыг хүлээн авч болно.

● Дарааллын дугаар нь нөгөө талын хүлээн авсан өгөгдлийн багцыг тодорхойлж, найдвартай өгөгдөл дамжуулах боломжийг олгодог.

Тиймээс TCP холболт тогтоосны дараа үйлчлүүлэгч анхны дарааллын дугаартай SYN пакетуудыг илгээж, серверээс үйлчлүүлэгчийн SYN пакетийг амжилттай хүлээн авсныг илтгэх ACK пакеттай хариу өгөхийг шаарддаг. Дараа нь сервер нь анхны дарааллын дугаартай SYN пакетийг үйлчлүүлэгч рүү илгээж, анхны дарааллын дугаарууд найдвартай синхрончлогдсон эсэхийг баталгаажуулахын тулд үйлчлүүлэгч нэг удаа хариу өгөхийг хүлээнэ.

Хоёр талын анхны серийн дугаарыг синк хийх

Дөрвөн талын гар барих нь хоёр талын анхны дарааллын дугаарыг найдвартай синхрончлох боломжтой боловч хоёр ба гурав дахь алхмуудыг нэг алхам болгон нэгтгэж, гурван талын гар барих боломжтой. Гэсэн хэдий ч хоёр гар барих нь зөвхөн нэг талын анхны дарааллын дугаарыг нөгөө тал амжилттай хүлээн авах баталгаа өгөх боловч хоёр талын анхны дарааллын дугаарыг баталгаажуулж чадна гэсэн баталгаа байхгүй. Тиймээс TCP холболтын тогтвортой байдал, найдвартай байдлыг хангахын тулд гурван талын гар барих нь хамгийн сайн сонголт юм.

Шалтгаан 3: Нөөцийг үрэхээс зайлсхий
Хэрэв зөвхөн "хоёр гар барих" тохиолдолд л клиентийн SYN хүсэлтийг сүлжээнд хаасан үед клиент серверийн илгээсэн ACK пакетийг хүлээн авч чадахгүй тул SYN дахин илгээгдэх болно. Гэсэн хэдий ч гурав дахь гар барих байхгүй тул сервер нь клиент холболт тогтоохын тулд ACK баталгаажуулалтыг хүлээн авсан эсэхийг тодорхойлж чадахгүй. Тиймээс сервер нь SYN хүсэлт бүрийг хүлээн авсны дараа л урьдчилан холболт үүсгэж чадна. Энэ нь дараахь зүйлд хүргэдэг.

Нөөцийн хаягдал: Хэрэв үйлчлүүлэгчийн SYN хүсэлтийг хааж, олон SYN пакетуудыг давтан дамжуулахад хүргэвэл сервер хүсэлтийг хүлээн авсны дараа олон тооны дахин хүчингүй холболт үүсгэнэ. Энэ нь серверийн нөөцийг шаардлагагүй хаягдалд хүргэдэг.

Мессеж хадгалах: Гурав дахь гар барих боломжгүйгээс болж сервер нь холболт тогтоохын тулд үйлчлүүлэгч ACK баталгаажуулалтыг зөв хүлээн авсан эсэхийг мэдэх аргагүй болдог. Үүний үр дүнд, хэрэв мессежүүд сүлжээнд гацвал үйлчлүүлэгч SYN хүсэлтийг дахин дахин илгээсээр байх бөгөөд энэ нь серверийг байнга шинэ холболт тогтооход хүргэдэг. Энэ нь сүлжээний ачаалал, саатлыг нэмэгдүүлж, сүлжээний нийт гүйцэтгэлд сөргөөр нөлөөлнө.

Нөөцийг үрэхээс зайлсхий

Тиймээс сүлжээний холболтын тогтвортой байдал, найдвартай байдлыг хангахын тулд TCP нь эдгээр асуудлууд гарахаас зайлсхийхийн тулд холболтыг тогтоохын тулд гурван талын гар барих аргыг ашигладаг.

Хураангуй
ньСүлжээний пакет зуучлагчTCP холболт тогтоох нь гурван талын гар барих замаар хийгддэг. Гурван талын гар барих үед клиент эхлээд сервер рүү SYN тугтай пакет илгээж, холболт тогтоохыг хүсч байгаагаа илэрхийлдэг. Клиентээс хүсэлтийг хүлээн авсны дараа сервер нь SYN болон ACK тугтай пакетийг клиент рүү хариулж, холболтын хүсэлтийг хүлээн авсныг харуулж, өөрийн анхны дарааллын дугаарыг илгээдэг. Эцэст нь клиент сервер рүү ACK тугтай хариу өгч холболт амжилттай тогтоогдсоныг илтгэнэ. Ингэснээр хоёр тал ТОГТМОЛ төлөвт орж, бие бие рүүгээ өгөгдөл илгээж эхлэх боломжтой болно.

Ерөнхийдөө TCP холболт тогтоох гурван талын гар барих үйл явц нь холболтын тогтвортой байдал, найдвартай байдлыг хангах, түүхэн холболтын талаарх төөрөгдөл, нөөцийн үрэлгэн байдлаас зайлсхийх, хоёр тал өгөгдөл хүлээн авах, илгээх боломжтой эсэхийг баталгаажуулах зорилготой юм.


Нийтэлсэн цаг: 2025 оны 1-р сарын 8