TCP холболтын тохиргоо
Бид вэбээр аялах, имэйл илгээх эсвэл онлайн тоглоом тоглохдоо үүний цаана байгаа нарийн төвөгтэй сүлжээний холболтын талаар боддоггүй. Гэсэн хэдий ч бид болон серверийн хооронд тогтвортой харилцаа холбоог хангадаг эдгээр жижиг алхамууд юм. Хамгийн чухал алхамуудын нэг бол TCP холболтын тохиргоо бөгөөд үүний гол цөм нь гурван талын гар барих явдал юм.
Энэ нийтлэлд гурван талын гар барих зарчим, үйл явц, ач холбогдлын талаар дэлгэрэнгүй авч үзэх болно. Гурван талын гар барих нь яагаад хэрэгтэй, холболтын тогтвортой байдал, найдвартай байдлыг хэрхэн хангадаг, өгөгдөл дамжуулахад хэр чухал болохыг алхам алхмаар тайлбарлах болно. Гурван талын гар барихын талаар илүү гүнзгий ойлголттой болсноор бид сүлжээний харилцааны үндсэн механизмуудыг илүү сайн ойлгож, TCP холболтын найдвартай байдлын талаар илүү тодорхой ойлголттой болно.
TCP Гурван талын гар барих үйл явц ба төлөвийн шилжилтүүд
TCP нь холболтод чиглэсэн тээврийн протокол бөгөөд өгөгдөл дамжуулахын өмнө холболтыг бий болгохыг шаарддаг. Энэхүү холболтыг бий болгох үйл явц нь гурван талын гар барих замаар хийгддэг.
Холболт бүрт илгээгддэг TCP пакетуудыг нарийвчлан авч үзье.
Эхний үед үйлчлүүлэгч болон сервер хоёулаа ХААЛТАЙ байна. Нэгдүгээрт, сервер порт дээр идэвхтэй сонсож, LISTEN төлөвт байгаа бөгөөд энэ нь серверийг эхлүүлэх шаардлагатай гэсэн үг юм. Дараа нь үйлчлүүлэгч вэб хуудас руу нэвтэрч эхлэхэд бэлэн байна. Энэ нь сервертэй холболт үүсгэх шаардлагатай. Эхний холболтын багцын формат дараах байдалтай байна.
Үйлчлүүлэгч холболтыг эхлүүлэх үед санамсаргүй эхний дарааллын дугаарыг (client_isn) үүсгэж, TCP толгой хэсгийн "Sequence number" талбарт байрлуулна. Үүний зэрэгцээ үйлчлүүлэгч SYN тугийн байрлалыг 1 болгож, гарч буй пакет нь SYN пакет гэдгийг илтгэнэ. Үйлчлүүлэгч нь эхний SYN пакетийг сервер рүү илгээснээр сервертэй холбогдохыг хүсч байгаагаа илэрхийлнэ. Энэ пакет нь хэрэглээний түвшний өгөгдөл (өөрөөр хэлбэл илгээсэн өгөгдөл) агуулаагүй болно. Энэ үед үйлчлүүлэгчийн статусыг SYN-SENT гэж тэмдэглэнэ.
Сервер нь үйлчлүүлэгчээс SYN пакет хүлээн авахдаа өөрийн серийн дугаарыг (server_isn) санамсаргүй байдлаар эхлүүлж, дараа нь TCP толгойн "Серийн дугаар" талбарт энэ дугаарыг оруулна. Дараа нь сервер "Acknowledgement number" талбарт client_isn + 1 гэж оруулаад SYN болон ACK битүүдийг хоёуланг нь 1 болгож тохируулна. Эцэст нь сервер нь програмын түвшний өгөгдөл (мөн серверийн өгөгдөл байхгүй) агуулахгүй клиент рүү пакет илгээдэг. илгээх). Энэ үед сервер SYN-RCVD төлөвт байна.
Үйлчлүүлэгч серверээс пакет хүлээн авсны дараа эцсийн хариу илгээсэн багцад хариу өгөхийн тулд дараах оновчлолуудыг хийх шаардлагатай: Эхлээд үйлчлүүлэгч хариу илгээх пакетийн TCP толгойн ACK битийг 1 болгож тохируулна; Хоёрдугаарт, үйлчлүүлэгч "Хариултын дугаарыг баталгаажуулах" талбарт server_isn + 1 утгыг оруулна; Эцэст нь үйлчлүүлэгч пакетыг сервер рүү илгээдэг. Энэ пакет нь үйлчлүүлэгчээс сервер рүү өгөгдөл дамжуулах боломжтой. Эдгээр үйлдлүүдийг хийж дууссаны дараа үйлчлүүлэгч ТОГТООГДСОН төлөвт орно.
Үйлчлүүлэгчээс хариу илгээсэн багцыг сервер хүлээн авмагц ТОГТООГДСОН төлөвт шилжинэ.
Дээрх үйл явцаас харахад гурван талын гар барих үед гурав дахь гар барихад өгөгдөл дамжуулахыг зөвшөөрдөг боловч эхний хоёр гар барихад тийм биш юм. Энэ бол ярилцлагад ихэвчлэн асуудаг асуулт юм. Гурван талт гар барилцаж дууссаны дараа хоёр тал ТОГТООГДСОН төлөвт орох нь холболт амжилттай хийгдсэнийг илтгэх бөгөөд энэ үед үйлчлүүлэгч болон сервер хоорондоо өгөгдөл илгээж эхлэх боломжтой.
Яагаад гурван удаа гар барих вэ? Хоёр удаа биш, дөрвөн удаа?
Нийтлэг хариулт нь "Учир нь гурван талын гар барих нь хүлээн авах, илгээх чадварыг баталгаажуулдаг." Энэ хариулт нь зөв, гэхдээ энэ нь зөвхөн гадаргуугийн шалтгаан бөгөөд гол шалтгааныг дэвшүүлээгүй. Дараах зүйлд би энэ асуудлын талаарх ойлголтыг гүнзгийрүүлэхийн тулд гурав дахин гар барих болсон шалтгааныг гурван талаас нь шинжлэх болно.
Гурван талын гар барих нь түүхэн давтагдсан холболтыг эхлүүлэхээс үр дүнтэй зайлсхийх боломжтой (гол шалтгаан)
Гурван талын гар барих нь хоёр тал найдвартай эхний дарааллын дугаарыг хүлээн авсан гэдгийг баталгаажуулдаг.
Гурван талын гар барих нь нөөцийг дэмий үрэхээс сэргийлдэг.
Шалтгаан 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 нь эдгээр асуудлуудаас зайлсхийхийн тулд холболтыг бий болгохын тулд гурван талын гар барих аргыг ашигладаг.
Дүгнэлт
TheСүлжээний пакет брокерTCP холболтыг гурван талын гар барих замаар хийдэг. Гурван талын гар барих үед үйлчлүүлэгч эхлээд сервер рүү SYN туг бүхий пакет илгээдэг бөгөөд энэ нь холболт үүсгэхийг хүсч байгааг илтгэнэ. Үйлчлүүлэгчийн хүсэлтийг хүлээн авсны дараа сервер нь SYN болон ACK туг бүхий пакетыг үйлчлүүлэгч рүү илгээж, холболтын хүсэлтийг хүлээн авсан болохыг харуулж, өөрийн анхны дарааллын дугаарыг илгээдэг. Төгсгөлд нь үйлчлүүлэгч серверт ACK тугийг илгээж, холболт амжилттай хийгдсэнийг илтгэнэ. Ийнхүү хоёр тал ТОГТООГДСОН төлөвт байгаа бөгөөд бие биедээ мэдээлэл илгээж эхлэх боломжтой.
Ерөнхийдөө TCP холболтыг бий болгох гурван талт гар барих үйл явц нь холболтын тогтвортой байдал, найдвартай байдлыг хангах, түүхэн холболттой холбоотой төөрөгдөл, нөөцийг үрэхээс зайлсхийх, хоёр тал мэдээлэл хүлээн авах, илгээх боломжтой байх зорилготой юм.
Шуудангийн цаг: 2025-01-08