16-bo‘lim

Kechikish, o'tkazuvchanlik va tiqilinch

Kechikish va tezlik farqi, kechikish nimalardan iborat, kanal-kechikish ko'paytmasi, sekin start va tiqilinch nazorati.

🕑 8 daqiqa o‘qish 📄 829 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Qaysi biri muhimroq?
  2. Kechikish nimalardan iborat?
  3. Kanal-kechikish ko'paytmasi
  4. Tiqilinch nazorati
  5. Xulosa

"Internetim sekin" degan gap ikki xil narsani anglatishi mumkin va ular butunlay boshqacha muammolar.

TushunchaNima o'lchaydiO'lchov birligi
O'tkazuvchanlikBir soniyada qancha ma'lumotMbit/s
KechikishBir bo'lak qancha vaqtda boradims

Quvurga o'xshatish qulay: o'tkazuvchanlik - quvurning yo'g'onligi, kechikish esa uning uzunligi.

Qaysi biri muhimroq? #

Javob vazifaga bog'liq. Hisoblab ko'ramiz:

Python
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")
Natija
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'zgarishYutuq
Tezlik ikki barobar oshdi20 ms
Kechikish ikki barobar kamaydi4000 ms

Ya'ni 200 barobar farq. Ko'p so'rovli ish uchun kechikish o'tkazuvchanlikdan ancha muhimroq.

Amaliy xulosa

Sayt sekin ochilayotgan bo'lsa, birinchi navbatda tezlikni emas, so'rovlar sonini kamaytiring.

QadamNima beradi
KeshlashSo'rov umuman yuborilmaydi
CDNKechikish kamayadi (server yaqinroq)
HTTP/2Bir ulanishda parallel so'rovlar
Keraksiz resurslarni olib tashlashTo'g'ridan-to'g'ri kam so'rov

"Tarifni oshiramiz" degan yechim odatda eng kam yordam beradiganidir.

Kechikish nimalardan iborat? #

QismiSababKamaytirish mumkinmi
TarqalishSignal masofani bosib o'tadiYo'q - fizika chegarasi
UzatishPaketni simga yozish vaqtiHa - tezlikni oshirib
NavbatMarshrutizatorda kutishHa - tiqilinchni kamaytirib
IshlovQurilma paketni o'qiydiDeyarli 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?

Python
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")
Natija
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
Bu haqiqiy tarixiy muammo edi

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.

Python
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")
Natija
 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
"Sekin start" nomi chalg'ituvchi

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.

Sekin start va kichik so'rovlar

Har yangi TCP ulanish oynani noldan boshlaydi. Bu shuni anglatadiki, qisqa ulanishlar hech qachon to'liq tezlikka chiqmaydi.

UlanishNatija
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.

Bufer shishishi (bufferbloat)

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.

Amaliy topshiriq
  1. Kechikish misolini ishga tushiring.
  2. So'rovlar sonini 10 ga tushiring - qaysi holat eng ko'p yutdi?
  3. O'z internetingiz tezligi va kechikishini o'lchang.
  4. Ularni jadvalga qo'shib, natijani hisoblang.
  5. BDP misolini ishga tushiring va o'z tarmog'ingiz uchun hisoblang.
  6. Oyna masshtablash bilan qanday tezlik olinishini hisoblang.
  7. Sekin start misolini ishga tushiring.
  8. CHEGARA ni 64 ga oshiring - necha RTT da to'yindi?
  9. ping bilan bir necha saytga RTT ni o'lchang va solishtiring.
  10. 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.

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.