TCP Найдвартай Тээвэрлэлт
Бид бүгд TCP протоколыг найдвартай тээврийн протокол гэж мэддэг боловч энэ нь тээврийн найдвартай байдлыг хэрхэн хангадаг вэ?
Найдвартай дамжуулалтыг хангахын тулд өгөгдлийн эвдрэл, алдагдал, давхардал, дараалал алдагдсан хэсгүүд гэх мэт олон хүчин зүйлийг харгалзан үзэх шаардлагатай. Хэрэв эдгээр асуудлыг шийдэж чадахгүй бол найдвартай дамжуулалтыг бий болгож чадахгүй.
Тиймээс TCP нь найдвартай дамжуулалтыг хангахын тулд дарааллын дугаар, баталгаажуулалтын хариу, дахин илгээх хяналт, холболтын удирдлага, цонхны хяналт зэрэг механизмуудыг ашигладаг.
Энэ өгүүлэлд бид TCP-ийн гулсах цонх, урсгалын хяналт болон түгжрэлийн хяналтад анхаарлаа хандуулах болно. Дахин дамжуулах механизмыг дараагийн хэсэгт тусад нь авч үзэх болно.
Сүлжээний урсгалын хяналт
Сүлжээний урсгалын хяналт буюу Сүлжээний урсгалын хяналт гэж нэрлэгддэг нь үнэндээ үйлдвэрлэгчид болон хэрэглэгчдийн хоорондох нарийн харилцааны илрэл юм. Та энэ нөхцөл байдалтай ажил дээрээ эсвэл ярилцлагад олон удаа таарсан байх. Хэрэв үйлдвэрлэгчийн үйлдвэрлэх хүчин чадал нь хэрэглэгчийн хэрэглэх чадвараас хамаагүй давсан бол дараалал хязгааргүй нэмэгдэх болно. Илүү ноцтой тохиолдолд RabbitMQ мессежүүд хэт их овоолсон тохиолдолд MQ серверийн гүйцэтгэл муудаж болзошгүйг та мэдэж магадгүй юм. TCP-ийн хувьд ч мөн адил; хэрэв шалгахгүй орхивол сүлжээнд хэт олон мессеж илгээгдэж, хэрэглэгчид хүчин чадлаасаа хэтэрсэн байх бол үйлдвэрлэгчид давхардсан мессеж илгээсээр байх бөгөөд энэ нь сүлжээний гүйцэтгэлд ихээхэн нөлөөлнө.
Энэ үзэгдлийг шийдвэрлэхийн тулд TCP нь илгээгч нь хүлээн авагчийн бодит хүлээн авах хүчин чадал дээр үндэслэн илгээсэн өгөгдлийн хэмжээг хянах механизмыг олгодог бөгөөд үүнийг урсгалын хяналт гэж нэрлэдэг. Хүлээн авагч нь хүлээн авах цонхыг хадгалдаг бол илгээгч нь илгээх цонхыг хадгалдаг. Эдгээр цонхнууд нь зөвхөн ганц TCP холболтод зориулагдсан бөгөөд бүх холболтууд нэг цонх хуваалцдаггүй гэдгийг тэмдэглэх нь зүйтэй.
TCP нь хүлээн авах цонхны хувьсагчийг ашиглан урсгалын хяналтыг хангадаг. Хүлээн авах цонх нь илгээгчид хэр их кэш зай байгаа талаар мэдээлэл өгдөг. Илгээгч нь хүлээн авагчийн бодит хүлээн авах хүчин чадлын дагуу илгээсэн өгөгдлийн хэмжээг хянадаг.
Хүлээн авагч хост нь илгээгчид хүлээн авч болох өгөгдлийн хэмжээг мэдэгдэх бөгөөд илгээгч нь энэ хязгаарт хүртэл илгээдэг. Энэ хязгаар нь цонхны хэмжээ юм, TCP толгой хэсгийг санаж байна уу? Хүлээн авагч хүлээн авах боломжтой эсвэл хүлээн авахыг хүсч буй байтын тоог заахад ашигладаг хүлээн авах цонхны талбар байдаг.
Илгээгч хост нь хүлээн авагч хост өгөгдөл хүлээн авах боломжтой эсэхийг илрүүлэхэд ашигладаг цонхны датчикийн багцыг үе үе илгээдэг. Хүлээн авагчийн буфер халих аюулд орсон үед илгээгчид илгээсэн өгөгдлийн хэмжээг хянах зааварчилгааны үүднээс цонхны хэмжээг бага утгаар тохируулдаг.
Сүлжээний урсгалын хяналтын диаграммыг энд харуулав:
Сүлжээний ачааллыг хянах
Түгжрэлийн хяналтыг нэвтрүүлэхээс өмнө хүлээн авах цонх болон илгээх цонхноос гадна түгжрэлийн цонх байдаг гэдгийг ойлгох хэрэгтэй бөгөөд энэ нь голчлон илгээгч хүлээн авах цонх руу өгөгдөл илгээж эхлэх хурдны асуудлыг шийдвэрлэхэд ашиглагддаг. Тиймээс түгжрэлийн цонхыг TCP илгээгч мөн хадгалдаг. Хэт бага эсвэл хэт их өгөгдөл илгээх нь тохиромжтой биш тул бидэнд хэр их өгөгдөл илгээх нь тохиромжтойг шийдэх алгоритм хэрэгтэй тул түгжрэлийн цонх гэсэн ойлголт гарч ирж байна.
Өмнөх сүлжээний урсгалын хяналтад бид илгээгч хүлээн авагчийн кэшийг өгөгдлөөр дүүргэхээс зайлсхийдэг байсан ч сүлжээнд юу болж байгааг бид мэдэхгүй байсан. Ерөнхийдөө компьютерын сүлжээнүүд нь хуваалцсан орчинд байдаг. Үүний үр дүнд бусад хостуудын хоорондох харилцаа холбооноос болж сүлжээний ачаалал үүсч болзошгүй.
Сүлжээ ачаалалтай үед олон тооны пакет илгээсээр байвал пакетууд саатах, алдагдах зэрэг асуудал үүсгэж болзошгүй. Энэ үед TCP өгөгдлийг дахин дамжуулах боловч дахин дамжуулалт нь сүлжээнд ачааллыг нэмэгдүүлж, улмаар саатал ихсэх, пакетууд их хэмжээгээр алдагдах болно. Энэ нь харгис тойрогт орж, улам бүр томорсоор байж болно.
Тиймээс TCP нь сүлжээнд юу болж байгааг үл тоомсорлож чадахгүй. Сүлжээ хэт ачаалалтай үед TCP нь илгээдэг өгөгдлийн хэмжээгээ бууруулснаар өөрийгөө золиосолдог.
Тиймээс илгээгчийн илгээсэн өгөгдлөөр бүхэл бүтэн сүлжээг дүүргэхээс зайлсхийх зорилготой түгжрэлийг хянах санал болгож байна. Илгээгчийн илгээх ёстой өгөгдлийн хэмжээг зохицуулахын тулд TCP нь түгжрэлийн цонх гэж нэрлэгддэг ойлголтыг тодорхойлдог. Түгжрэлийг хянах алгоритм нь илгээгчийн илгээсэн өгөгдлийн хэмжээг хянахын тулд сүлжээний түгжрэлийн түвшингээс хамааран түгжрэлийн цонхны хэмжээг тохируулна.
Бөглөрөлттэй цонх гэж юу вэ? Энэ нь илгээх цонхтой ямар холбоотой вэ?
Түгжрэлийн цонх гэдэг нь илгээгчийн илгээж болох өгөгдлийн хэмжээг тодорхойлдог илгээгчийн хадгалдаг төлөвийн хувьсагч юм. Түгжрэлийн цонх нь сүлжээний түгжрэлийн түвшингээс хамааран динамикаар өөрчлөгддөг.
Илгээх цонх гэдэг нь илгээгч болон хүлээн авагчийн хооронд тохиролцсон цонхны хэмжээ бөгөөд хүлээн авагчийн хүлээн авч болох өгөгдлийн хэмжээг заана. Бөглөрсөн цонх болон илгээх цонх нь хоорондоо холбоотой; илгээх цонх нь ихэвчлэн бөглөрөл болон хүлээн авагч цонхны хамгийн бага хэмжээтэй тэнцүү байдаг, өөрөөр хэлбэл swnd = min(cwnd, rwnd).
Түгжрэлийн цонх дараах байдлаар өөрчлөгдөнө.
Хэрэв сүлжээнд ачаалал байхгүй, өөрөөр хэлбэл дахин дамжуулах хугацаа дуусаагүй бол ачааллын цонх нэмэгдэнэ.
Хэрэв сүлжээнд ачаалал их байвал ачааллын цонх багасна.
Илгээгч нь ACK баталгаажуулалтын багцыг заасан хугацаанд хүлээн авсан эсэхийг ажигласнаар сүлжээ ачаалалтай эсэхийг тодорхойлдог. Хэрэв илгээгч нь заасан хугацаанд ACK баталгаажуулалтын багцыг хүлээн аваагүй бол сүлжээ ачаалалтай байна гэж үзнэ.
Түгжрэлийн цонхноос гадна TCP түгжрэлийг хянах алгоритмын талаар хэлэлцэх цаг болжээ. TCP түгжрэлийг хянах алгоритм нь гурван үндсэн хэсгээс бүрдэнэ.
Удаан эхлэх:Эхэндээ cwnd ачааллын цонх харьцангуй бага бөгөөд илгээгч нь сүлжээний багтаамжид хурдан дасан зохицохын тулд ачааллын цонхыг экспоненциалаар нэмэгдүүлдэг.
Түгжрэлээс зайлсхийх:Түгжрэлийн цонх тодорхой босгыг давсны дараа илгээгч нь түгжрэлийн цонхны өсөлтийн хурдыг удаашруулж, сүлжээг хэт ачааллаас зайлсхийхийн тулд түгжрэлийн цонхыг шугаман байдлаар нэмэгдүүлдэг.
Хурдан нөхөн сэргээх:Хэрэв ачаалал үүсвэл илгээгч нь ачааллын цонхыг хагас болгож, хүлээн авсан давхардсан хариу үйлдлийн тусламжтайгаар сүлжээний сэргээлтийн байршлыг тодорхойлохын тулд хурдан сэргээх төлөвт орж, дараа нь ачааллын цонхыг үргэлжлүүлэн нэмэгдүүлдэг.
Удаан эхлэх
TCP холболт тогтоогдсон үед ачааллын цонхны cwnd нь эхлээд хамгийн бага MSS (хамгийн их сегментийн хэмжээ) утгаар тохируулагддаг. Ингэснээр анхны илгээх хурд нь ойролцоогоор MSS/RTT байт/секунд байна. Бодит боломжтой зурвасын өргөн нь ихэвчлэн MSS/RTT-ээс хамаагүй их байдаг тул TCP нь хамгийн оновчтой илгээх хурдыг олохыг хүсдэг бөгөөд үүнийг удаан эхлүүлэх замаар хийж болно.
Удаан эхлүүлэх процесст түгжрэлийн цонхны cwnd-ийн утгыг 1 MSS болгон эхлүүлэх бөгөөд дамжуулсан пакетийн сегментийг хүлээн зөвшөөрөх бүрт cwnd-ийн утга нэг MSS-ээр нэмэгдэх бөгөөд өөрөөр хэлбэл cwnd-ийн утга 2 MSS болно. Үүний дараа пакетийн сегментийг амжилттай дамжуулах бүрт cwnd-ийн утга хоёр дахин нэмэгдэнэ гэх мэт. Тодорхой өсөлтийн процессыг дараах зурагт үзүүлэв.
Гэсэн хэдий ч илгээх хурд үргэлж өсөж чадахгүй; өсөлт хэзээ нэгэн цагт дуусах ёстой. Тэгэхээр илгээх хурдны өсөлт хэзээ дуусах вэ? Удаан эхлэх нь ихэвчлэн илгээх хурдны өсөлтийг хэд хэдэн аргын аль нэгээр зогсоодог:
Эхний арга нь удаан эхлүүлэх илгээх процессын үед пакет алдагдах тохиолдол юм. Пакет алдагдах үед TCP нь илгээгчийн ачааллын цонх cwnd-г 1 болгож тохируулж, удаан эхлүүлэх процессыг дахин эхлүүлдэг. Энэ үед удаан эхлүүлэх босго ssthresh гэсэн ойлголтыг нэвтрүүлсэн бөгөөд анхны утга нь пакет алдагдлыг үүсгэдэг cwnd-ийн утгын хагастай тэнцүү байна. Өөрөөр хэлбэл, ачаалал илэрсэн үед ssthresh-ийн утга нь цонхны утгын хагастай тэнцүү байна.
Хоёр дахь арга нь удаан эхлэх босго ssthresh-ийн утгатай шууд хамааралтай байх явдал юм. ssthresh-ийн утга нь ачаалал илэрсэн үед цонхны утгын тал хувьтай тэнцүү байдаг тул cwnd нь ssthresh-ээс их байх үед хоёр дахин нэмэгдэх бүрт пакет алдагдал гарч болзошгүй. Тиймээс cwnd-ийг ssthresh болгож тохируулах нь хамгийн сайн арга бөгөөд энэ нь TCP-ийг ачааллыг хянах горимд шилжүүлж, удаан эхлэхийг зогсооход хүргэнэ.
Удаан эхлэлийг дуусгах хамгийн сүүлийн арга бол гурван илүүдэл хандалт илэрсэн тохиолдолд TCP нь хурдан дахин дамжуулалт хийж, сэргээх төлөвт орох явдал юм. (Хэрэв яагаад гурван ACK пакет байгаа нь тодорхойгүй бол үүнийг дахин дамжуулах механизмд тусад нь тайлбарлах болно.)
Түгжрэлээс зайлсхийх
TCP нь ачааллын хяналтын төлөвт ороход cwnd нь ачааллын босго ssthresh-ийн тал хувь гэж тохируулагддаг. Энэ нь пакет сегмент хүлээн авах бүрт cwnd-ийн утгыг хоёр дахин нэмэгдүүлэх боломжгүй гэсэн үг юм. Үүний оронд дамжуулалт дууссаны дараа cwnd-ийн утгыг зөвхөн нэг MSS (хамгийн их пакет сегментийн урт)-аар нэмэгдүүлэх харьцангуй консерватив аргыг хэрэглэдэг. Жишээлбэл, 10 пакет сегментийг хүлээн зөвшөөрсөн ч гэсэн cwnd-ийн утга зөвхөн нэг MSS-ээр нэмэгдэх болно. Энэ нь шугаман өсөлтийн загвар бөгөөд өсөлтийн дээд хязгаартай байдаг. Пакет алдагдал гарах үед cwnd-ийн утгыг MSS болгон өөрчилдөг бөгөөд ssthresh-ийн утгыг cwnd-ийн тал хувь гэж тохируулдаг. Эсвэл 3 илүүдэл ACK хариулт хүлээн авахад MSS-ийн өсөлтийг зогсооно. Хэрэв cwnd-ийн утгыг хоёр дахин бууруулсны дараа гурван илүүдэл ACK хүлээн авагдсан хэвээр байвал ssthresh-ийн утгыг cwnd-ийн утгын тал хувь гэж бүртгэж, хурдан сэргээх төлөвийг оруулна.
Хурдан сэргээх
Хурдан сэргээх төлөвт, хүлээн авсан илүүдэл ACK буюу дарааллаар ирээгүй ACK бүрийн хувьд түгжрэлийн цонхны cwnd-ийн утгыг нэг MSS-ээр нэмэгдүүлдэг. Энэ нь сүлжээнд амжилттай дамжуулагдсан пакет сегментүүдийг ашиглан дамжуулалтын үр ашгийг аль болох нэмэгдүүлэх зорилготой юм.
Алдагдсан пакет сегментийн ACK ирэхэд TCP нь cwnd-ийн утгыг бууруулж, дараа нь түгжрэлээс зайлсхийх төлөвт ордог. Энэ нь түгжрэлийн цонхны хэмжээг хянаж, сүлжээний түгжрэлийг цаашид нэмэгдүүлэхээс зайлсхийхийн тулд хийгддэг.
Хэрэв түгжрэлийг хянах төлөвийн дараа хугацаа дуусвал сүлжээний нөхцөл байдал улам ноцтой болж, TCP нь түгжрэлээс зайлсхийх төлөвөөс удаан эхлэх төлөв рүү шилждэг. Энэ тохиолдолд түгжрэлийн цонхны cwnd-ийн утгыг 1 MSS, пакетийн сегментийн хамгийн их урт, удаан эхлэх босго ssthresh-ийн утгыг cwnd-ийн тал хувь гэж тохируулна. Үүний зорилго нь сүлжээ сэргэсний дараа дамжуулах хурд болон сүлжээний түгжрэлийн түвшинг тэнцвэржүүлэхийн тулд түгжрэлийн цонхны хэмжээг аажмаар нэмэгдүүлэх явдал юм.
Хураангуй
Найдвартай тээвэрлэлтийн протоколын хувьд TCP нь дарааллын дугаар, хүлээн зөвшөөрөлт, дахин дамжуулалтын хяналт, холболтын удирдлага болон цонхны хяналтаар найдвартай тээвэрлэлтийг хэрэгжүүлдэг. Эдгээрийн дотор урсгалын хяналтын механизм нь хүлээн авагчийн бодит хүлээн авах хүчин чадлын дагуу илгээгчийн илгээсэн өгөгдлийн хэмжээг хянадаг бөгөөд энэ нь сүлжээний ачаалал болон гүйцэтгэлийн доройтлын асуудлаас зайлсхийдэг. Түгжрэлийн хяналтын механизм нь илгээгчийн илгээсэн өгөгдлийн хэмжээг тохируулснаар сүлжээний ачаалал үүсэхээс зайлсхийдэг. Түгжрэлийн цонх болон илгээх цонх гэсэн ойлголтууд нь хоорондоо холбоотой бөгөөд илгээгч дээрх өгөгдлийн хэмжээг түгжрэлийн цонхны хэмжээг динамикаар тохируулснаар хянадаг. Удаан эхлүүлэх, түгжрэлээс зайлсхийх, хурдан сэргээх нь TCP түгжрэлийн хяналтын алгоритмын гурван үндсэн хэсэг бөгөөд сүлжээний багтаамж болон түгжрэлийн зэрэгт тохируулан түгжрэлийн цонхны хэмжээг өөр өөр стратеги ашиглан тохируулдаг.
Дараагийн хэсэгт бид TCP-ийн дахин дамжуулах механизмыг нарийвчлан судлах болно. Дахин дамжуулах механизм нь найдвартай дамжуулалтыг хангахын тулд TCP-ийн чухал хэсэг юм. Энэ нь алдагдсан, эвдэрсэн эсвэл хойшлогдсон өгөгдлийг дахин дамжуулах замаар өгөгдлийг найдвартай дамжуулахыг баталгаажуулдаг. Дахин дамжуулах механизмын хэрэгжилтийн зарчим, стратегийг дараагийн хэсэгт дэлгэрэнгүй танилцуулж, шинжлэх болно. Хүлээж байгаарай!
Нийтэлсэн цаг: 2025 оны 2-р сарын 24

