16-bo‘lim
Kechikish, o'tkazuvchanlik va tiqilinch
Kechikish va tezlik farqi, kechikish nimalardan iborat, kanal-kechikish ko'paytmasi, sekin start va tiqilinch nazorati.
Ushbu bo‘lim mundarijasi
"Internetim sekin" degan gap ikki xil narsani anglatishi mumkin va ular butunlay boshqacha muammolar.
| Tushuncha | Nima o'lchaydi | O'lchov birligi |
|---|---|---|
| O'tkazuvchanlik | Bir soniyada qancha ma'lumot | Mbit/s |
| Kechikish | Bir bo'lak qancha vaqtda boradi | ms |
Quvurga o'xshatish qulay: o'tkazuvchanlik - quvurning yo'g'onligi, kechikish esa uning uzunligi.
Qaysi biri muhimroq? #
Javob vazifaga bog'liq. Hisoblab ko'ramiz:
def vaqt(hajm_kb, tezlik_mbit, kechikish_ms, sorovlar):
"""Jami vaqt = kechikish * so'rovlar + uzatish vaqti."""
kutish = kechikish_ms * 2 * sorovlar # borib-kelish
uzatish = hajm_kb * 8 / (tezlik_mbit * 1000) * 1000
return kutish + uzatish
HOLATLAR = [
("optik tola, yaqin", 100, 5),
("optik tola, uzoq", 100, 80),
("mobil 4G", 20, 50),
("sun'iy yo'ldosh", 100, 600),
]
print("Bitta 500 KB lik fayl, 1 ta so'rov:")
for nom, tezlik, kechikish in HOLATLAR:
t = vaqt(500, tezlik, kechikish, 1)
print(f" {nom:<20} {tezlik:>3} Mbit/s {kechikish:>3} ms ->"
f" {t:>7.0f} ms")
print()
print("Xuddi shu hajm, lekin 50 ta kichik fayl:")
for nom, tezlik, kechikish in HOLATLAR:
t = vaqt(500, tezlik, kechikish, 50)
print(f" {nom:<20} {tezlik:>3} Mbit/s {kechikish:>3} ms ->"
f" {t:>7.0f} ms")
print()
print("tezlikni ikki barobar oshirsak (uzoq optik tola, 50 so'rov):")
a = vaqt(500, 100, 80, 50)
b = vaqt(500, 200, 80, 50)
print(f" 100 Mbit/s: {a:.0f} ms")
print(f" 200 Mbit/s: {b:.0f} ms")
print(f" yutuq : {a - b:.0f} ms")
print()
print("kechikishni ikki barobar kamaytirsak:")
c = vaqt(500, 100, 40, 50)
print(f" 80 ms -> 40 ms: {c:.0f} ms")
print(f" yutuq : {a - c:.0f} ms")
Bitta 500 KB lik fayl, 1 ta so'rov:
optik tola, yaqin 100 Mbit/s 5 ms -> 50 ms
optik tola, uzoq 100 Mbit/s 80 ms -> 200 ms
mobil 4G 20 Mbit/s 50 ms -> 300 ms
sun'iy yo'ldosh 100 Mbit/s 600 ms -> 1240 ms
Xuddi shu hajm, lekin 50 ta kichik fayl:
optik tola, yaqin 100 Mbit/s 5 ms -> 540 ms
optik tola, uzoq 100 Mbit/s 80 ms -> 8040 ms
mobil 4G 20 Mbit/s 50 ms -> 5200 ms
sun'iy yo'ldosh 100 Mbit/s 600 ms -> 60040 ms
tezlikni ikki barobar oshirsak (uzoq optik tola, 50 so'rov):
100 Mbit/s: 8040 ms
200 Mbit/s: 8020 ms
yutuq : 20 ms
kechikishni ikki barobar kamaytirsak:
80 ms -> 40 ms: 4040 ms
yutuq : 4000 ms
Oxirgi ikki blokni solishtiring:
| O'zgarish | Yutuq |
|---|---|
| Tezlik ikki barobar oshdi | 20 ms |
| Kechikish ikki barobar kamaydi | 4000 ms |
Ya'ni 200 barobar farq. Ko'p so'rovli ish uchun kechikish o'tkazuvchanlikdan ancha muhimroq.
Sayt sekin ochilayotgan bo'lsa, birinchi navbatda tezlikni emas, so'rovlar sonini kamaytiring.
| Qadam | Nima beradi |
|---|---|
| Keshlash | So'rov umuman yuborilmaydi |
| CDN | Kechikish kamayadi (server yaqinroq) |
| HTTP/2 | Bir ulanishda parallel so'rovlar |
| Keraksiz resurslarni olib tashlash | To'g'ridan-to'g'ri kam so'rov |
"Tarifni oshiramiz" degan yechim odatda eng kam yordam beradiganidir.
Kechikish nimalardan iborat? #
| Qismi | Sabab | Kamaytirish mumkinmi |
|---|---|---|
| Tarqalish | Signal masofani bosib o'tadi | Yo'q - fizika chegarasi |
| Uzatish | Paketni simga yozish vaqti | Ha - tezlikni oshirib |
| Navbat | Marshrutizatorda kutish | Ha - tiqilinchni kamaytirib |
| Ishlov | Qurilma paketni o'qiydi | Deyarli sezilmaydi |
Birinchisi eng qiziq: yorug'lik optik tolada sekundiga taxminan 200 000 km yuradi. Toshkentdan Nyu-Yorkgacha to'g'ri chiziq bo'yicha ~11 000 km, ya'ni bir tomonlama kamida 55 ms.
Hech qanday texnologiya buni o'zgartira olmaydi. Aynan shuning uchun CDN mavjud: ma'lumotni foydalanuvchiga jismonan yaqinlashtirish - yagona chora.
Kanal-kechikish ko'paytmasi #
Endi nozikroq tushuncha. Jo'natuvchi tasdiq kutmasdan qancha ma'lumot yubora oladi?
def bdp_bayt(tezlik_mbit, rtt_ms):
"""Kanalga bir vaqtda sig'adigan ma'lumot hajmi."""
return tezlik_mbit * 1_000_000 / 8 * (rtt_ms / 1000)
HOLATLAR = [
("sekin ADSL", 8, 30),
("uy tarmog'i", 100, 10),
("shahar ichida", 1000, 5),
("qit'alararo", 100, 160),
("sun'iy yo'ldosh", 100, 600),
]
ESKI_OYNA = 65535 # TCP oynasining kengaytmasiz chegarasi
print(f"{'holat':<18} {'tezlik':>8} {'RTT':>6} {'BDP':>10} {'oyna yetadimi'}")
print("-" * 62)
for nom, tezlik, rtt in HOLATLAR:
bdp = bdp_bayt(tezlik, rtt)
yetadi = "ha" if bdp <= ESKI_OYNA else "YO'Q"
print(f"{nom:<18} {tezlik:>5} Mb {rtt:>4} ms {bdp:>9.0f} B {yetadi}")
print()
print("eski TCP oynasi:", ESKI_OYNA, "bayt")
print()
print("oyna BDP dan kichik bo'lsa, jo'natuvchi TASDIQ kutib to'xtaydi")
print("va kanal to'liq ishlatilmaydi")
# Qit'alararo holatda erishish mumkin bo'lgan tezlik
rtt = 160
amaldagi = ESKI_OYNA / (rtt / 1000) * 8 / 1_000_000
print()
print(f"qit'alararo kanalda eski oyna bilan: {amaldagi:.1f} Mbit/s")
print("kanal 100 Mbit/s bo'lsa ham")
holat tezlik RTT BDP oyna yetadimi
--------------------------------------------------------------
sekin ADSL 8 Mb 30 ms 30000 B ha
uy tarmog'i 100 Mb 10 ms 125000 B YO'Q
shahar ichida 1000 Mb 5 ms 625000 B YO'Q
qit'alararo 100 Mb 160 ms 2000000 B YO'Q
sun'iy yo'ldosh 100 Mb 600 ms 7500000 B YO'Q
eski TCP oynasi: 65535 bayt
oyna BDP dan kichik bo'lsa, jo'natuvchi TASDIQ kutib to'xtaydi
va kanal to'liq ishlatilmaydi
qit'alararo kanalda eski oyna bilan: 3.3 Mbit/s
kanal 100 Mbit/s bo'lsa ham
TCP sarlavhasidagi oyna maydoni 16 bitli, ya'ni eng katta qiymati 65 535.
1980-yillarda bu ko'p edi. Kanallar tezlashgach, u jiddiy chegaraga aylandi: yuqoridagi hisobda 100 Mbit/s lik qit'alararo kanalda faqat 3,3 Mbit/s olinadi.
Yechim - oyna masshtablash kengaytmasi (RFC 1323, 1992). U qo'l berish paytida kelishiladi va oynani 1 GB gacha kengaytiradi.
Bugun u hamma joyda yoqilgan. Lekin eski yoki noto'g'ri sozlangan oraliq qurilma uni buzsa, tezlik sababsiz past qolishi mumkin - bu real nosozlik turi.
Tiqilinch nazorati #
Jo'natuvchi tarmoq qancha ko'tara olishini bilmaydi. Ko'p yuborsa - navbatlar to'ladi va paketlar yo'qoladi. Kam yuborsa - kanal bekor turadi.
Yechim: sinab ko'rish. TCP sekin boshlaydi va tezlikni asta oshiradi, yo'qotish belgisini ko'rgunicha.
MSS = 1460 # bitta segment hajmi (bayt)
CHEGARA = 32 # tarmoq ko'tara oladigan segmentlar soni
oyna = 1 # segmentlarda
bosqich = "sekin start"
ostona = None
print(f"{'RTT':>4} {'oyna':>6} {'bayt':>8} bosqich")
print("-" * 44)
for rtt in range(1, 13):
bayt = oyna * MSS
print(f"{rtt:>4} {oyna:>6} {bayt:>8} {bosqich}")
if oyna >= CHEGARA:
# Tarmoq to'ldi - paket yo'qoldi
print(f"{'':>4} {'':>6} {'':>8} PAKET YO'QOLDI")
ostona = max(2, oyna // 2)
oyna = ostona
bosqich = "tiqilinchdan qochish"
continue
if bosqich == "sekin start":
oyna *= 2 # har RTT da IKKI BAROBAR
else:
oyna += 1 # har RTT da BITTAGA
print()
print("sekin start: oyna har RTT da ikki barobar oshadi")
print("yo'qotishdan keyin: yarmiga tushadi va bittalab o'sadi")
print("oxirgi ostona:", ostona, "segment")
RTT oyna bayt bosqich
--------------------------------------------
1 1 1460 sekin start
2 2 2920 sekin start
3 4 5840 sekin start
4 8 11680 sekin start
5 16 23360 sekin start
6 32 46720 sekin start
PAKET YO'QOLDI
7 16 23360 tiqilinchdan qochish
8 17 24820 tiqilinchdan qochish
9 18 26280 tiqilinchdan qochish
10 19 27740 tiqilinchdan qochish
11 20 29200 tiqilinchdan qochish
12 21 30660 tiqilinchdan qochish
sekin start: oyna har RTT da ikki barobar oshadi
yo'qotishdan keyin: yarmiga tushadi va bittalab o'sadi
oxirgi ostona: 16 segment
U aslida tez o'sadi - har RTT da ikki barobar. "Sekin" so'zi boshlanish nuqtasiga ishora qiladi: bitta segment.
Undan oldingi TCP versiyalari darhol to'liq oyna bilan boshlardi va bu 1986-yilda internetning birinchi jiddiy tiqilinch qulashiga sabab bo'lgan edi. Tezlik 32 Kbit/s dan 40 bit/s ga tushib ketgan.
O'sha voqeadan keyin Van Jeykobson tiqilinch nazorati algoritmlarini ishlab chiqdi - bugungi TCP shularga tayanadi.
Har yangi TCP ulanish oynani noldan boshlaydi. Bu shuni anglatadiki, qisqa ulanishlar hech qachon to'liq tezlikka chiqmaydi.
| Ulanish | Natija |
|---|---|
| Uzoq (fayl yuklash) | To'liq tezlikka chiqadi |
| Qisqa (kichik JSON) | Sekin start ichida tugaydi |
Bu 13-bo'limdagi keep-alive ning yana bir foydasi: ulanish qayta ishlatilganda oyna saqlanib qoladi va keyingi so'rov darhol tez ketadi.
Marshrutizatorlarga katta bufer qo'yish mantiqiy tuyuladi: paket yo'qolmaydi-ku.
Amalda bu teskari ta'sir beradi. TCP yo'qotishni tiqilinch signali deb biladi. Bufer katta bo'lsa, paketlar yo'qolmaydi - ular shunchaki navbatda uzoq turadi.
Natijada TCP tiqilinchni sezmaydi va yuborishda davom etadi, kechikish esa soniyalarga chiqadi.
Belgisi tanish: kimdir katta fayl yuklayotganda boshqalarning video qo'ng'irog'i "sekinlashadi" - garchi tezlik yetarli bo'lsa ham.
Yechim - navbatni aqlli boshqarish (CoDel, FQ-CoDel) va BBR kabi yangi algoritmlar: ular yo'qotishga emas, kechikishning o'sishiga qaraydi.
- Kechikish misolini ishga tushiring.
- So'rovlar sonini 10 ga tushiring - qaysi holat eng ko'p yutdi?
- O'z internetingiz tezligi va kechikishini o'lchang.
- Ularni jadvalga qo'shib, natijani hisoblang.
- BDP misolini ishga tushiring va o'z tarmog'ingiz uchun hisoblang.
- Oyna masshtablash bilan qanday tezlik olinishini hisoblang.
- Sekin start misolini ishga tushiring.
CHEGARAni 64 ga oshiring - necha RTT da to'yindi?pingbilan bir necha saytga RTT ni o'lchang va solishtiring.- Nima uchun tarifni oshirish har doim ham yordam bermasligini yozing.
Xulosa #
- O'tkazuvchanlik - quvurning yo'g'onligi, kechikish - uzunligi.
- Ko'p so'rovli ishda kechikish o'tkazuvchanlikdan ancha muhimroq.
- Tezlikni ikki barobar oshirish 20 ms, kechikishni yarimlatish 4000 ms tejadi.
- Kechikishning tarqalish qismini kamaytirib bo'lmaydi - bu fizika chegarasi.
- Shuning uchun CDN ma'lumotni foydalanuvchiga jismonan yaqinlashtiradi.
- BDP - kanalga bir vaqtda sig'adigan hajm; oyna undan kichik bo'lsa kanal bo'sh turadi.
- Eski 16 bitli oyna maydoni uzoq kanallarda jiddiy chegara edi - oyna masshtablash yechdi.
- Sekin start bitta segmentdan boshlab har RTT da ikki barobar o'sadi.
- Yo'qotishdan keyin oyna yarmiga tushadi va bittalab o'sadi.
- Bufer shishishi: katta bufer yo'qotishni yashiradi va kechikishni oshiradi.
Keyingi bo'limda nosozliklarni amalda qanday topishni o'rganamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.