OpenVPN TCP to'xtab qolishi: rto_min navbat boshini tuzatmaydi
Tashqi bayt oqimi tartib bilan yetkazadi, shuning uchun yo'qolgan bitta segment har bir ichki oqimni to'xtatib qo'yishi mumkin. Uzunroq ichki taymer soatni o'zgartiradi, bu cheklovni emas.
Tunnel orqali ishlaydigan interaktiv shell fayl nusxalash jarayoni ketayotganda bir necha soniyaga muzlab qoladi, so'ng hech narsa bo'lmagandek davom etadi. Muammo faqat yuklab olishda bo'lsa ham, shell ham kutadi va ikkalasi bir vaqtda tiklanadi. Bu manzara ko'plab suhbatlarni bitta ishonchli oqim orqali tashishning belgisidir va u odamlar birinchi navbatda sinab ko'radigan deyarli har qanday sozlash o'zgarishidan keyin ham saqlanib qoladi.
Bu alomatni diqqat bilan o'rganishga arziydi, chunki u sozlamaga emas, balki mexanizmga ishora qiladi: pauza umumiy, demak sabab ham umumiy, umumiy obyekt esa tashqi ulanishdir. Bu sodir bo'layotganda jurnaldagi qolgan hamma narsa normal ko'rinadi.
Alomat: hammasi bir vaqtda to'xtaydi
Ikki ichki ulanishning birga to'xtab qolishi asosiy kalitdir. Sekin yuklab olish va sekin shell — bu alohida tartib raqamlari va alohida tiqilish holatiga ega bo'lgan mustaqil TCP suhbatlari, shuning uchun ulardan biridagi nosozlik ikkinchisiga tegmasligi kerak. Ular bir maromda to'xtaganda, ularning ustidagi biror narsa baytlarini tartibga solayotgan bo'ladi.
Bu narsa tunnelning transport qatlamidir. TCP rejimida OpenVPN inkapsulyatsiya qilingan paketlarni tengdosh bilan bitta TCP ulanishiga yozadi, TCP shartnomasi esa yagona bayt oqimini tartib bilan yetkazishdir. Keyingi baytlar qaysi ichki suhbatga tegishli bo'lishidan qat'i nazar, yo'qolgan baytlardan oldin ilovaga berilmaydi.
Alomat sizga nimani aytmayotganiga e'tibor bering. U yo'l buzilganini, server ortiqcha yuklanganini yoki shifr sekinligini bildirmaydi. Ular boshqacha ko'rinishga ega bo'ladi: bir tekis past o'tkazuvchanlik, kutish vaqtidan oshib ketish holatlari yoki faqat bir yo'nalishga ta'sir qiluvchi nosozliklar. Yo'qolgan bitta segment qayta uzatilganda tugaydigan umumiy pauza aynan tartiblash effektidir.
Bitta tashqi bayt oqimi, ko'plab ichki suhbatlar
Tunnel bir vaqtda yuklab olishni ham, shellni ham tashiydi deb tasavvur qiling. Tashqi ulanishning bir segmenti yo'qoladi. Keyingi segmentlar qabul qiluvchi hostga yetib kelishi mumkin va qabul qiluvchi TCP steki ularni tasdiqlaydi, lekin bo'shliq to'ldirilmaguncha ularni yuqoriga yetkaza olmaydi. Shuning uchun OpenVPN shell uchun o'qiydigan hech narsaga ega emas, garchi shellning o'z baytlari ancha oldin yetib kelgan bo'lsa ham.
Bu bitta ulanish ichidagi navbat boshining to'silishi (head-of-line blocking) hodisasidir va u ikki ilova bitta ichki ulanishni bo'lishishini talab qilmaydi. Ular tashqi ulanishni bo'lishadi, bu esa yetarli.
Ikkinchi darajali effekt vaziyatni yanada yomonlashtiradi. Tasdiq ko'rmagan ichki jo'natuvchi tashqi qatlam allaqachon yetkazishga urinayotgan ma'lumotni qayta uzatishi mumkin. Bu qayta uzatish segmentlarni yo'qotishi mumkinligini hozirgina isbotlagan yo'lda qo'shimcha tunnel trafigiga aylanadi, shuning uchun tiklanish ishi muhim bo'lgan tiklanish bilan raqobatlashadi.
Bularning hech biri halokatni kafolatlamaydi. Qisqa borish-kelish vaqtlari va keng navbatlarga ega toza yo'lda bu tuzilma yillar davomida bemalol ishlatilishi mumkin. Nosozlik yo'qotish, kechikish va navbat chuqurligi bir vaqtda mos kelganda namoyon bo'ladi, shuning uchun hisobotlar yaxshi jihozlangan ofislar atrofida emas, balki tiqilib qolgan uplinklar va mobil aloqalar atrofida to'planadi.
Nega uzunroq ichki taymer yordam bera olmaydi
Marshrutda minimal qayta uzatish kutish vaqtini rto_min bilan oshirish shu marshrutdan foydalanadigan, qurilmaning o'zida hosil bo'lgan TCP trafigi uchun taymerga asoslangan qayta uzatishni kechiktiradi. Bu haqiqiy effektga ega haqiqiy sozlama bo'lib, u birinchi emas, ikkinchi darajali muammoni hal qiladi.
ip route show
ip route show cache 2>/dev/null | head
ss -tin dst 10.70.0.1
U qila olmaydigan narsa — tashqi baytlarni tartibsiz chiqarish, yo'qolgan segmentni tezroq tiklash yoki masofadagi ilova serverini xuddi shu taymerni qabul qilishga majbur qilish. Qabul qiluvchi stek hali ham tartib bilan yetkazadi, uzoqdagi jo'natuvchi esa o'zining borish-kelish o'lchovlaridan foydalanadi.
Shuningdek, u boshqa barcha yo'qotishni tiklash mexanizmlarini o'chirmaydi. Haqiqiy yo'qotish taymerga asoslangan tiklashni talab qiladigan joyda kattaroq minimum ilovani harakat qilishdan oldin uzoqroq kutishga majbur qiladi, bu esa kechikishga sezgir sessiyaga kerak bo'lgan narsaning aksi.
Bu mavzudagi maslahatlarda o'n ikki soniyalik qat'iy chegara TCP tunnel mavjudligidan kelib chiqadigandek ko'rsatiladi. RFC 6298 da tasvirlangan qayta uzatish taymeri o'lchangan borish-kelish vaqtidan eksponensial ortib boruvchi kechikish bilan kelib chiqadi, shuning uchun doimiy chegara protokol talabi emas, balki muayyan yo'l uchun siyosat tanlovidir. Keng qo'llanilganda u alomatni yashiradi, shu bilan birga marshrut qamrab olgan har bir oqim uchun tiklashni o'zgartiradi.
tcp-nodelay nima qiladi va nima qilmaydi
Transport soketida Nagle uslubidagi buferlashni o'chiruvchi tunnel opsiyasi tor maqsadga ega: u kichik yozuvlarni uzatishdan oldin qo'shimcha ma'lumot kutishini to'xtatadi. Bu interaktiv trafikka aks holda sog'lom yo'lda qo'shimcha kechikishdan qochishga yordam beradi.
U transportni tartibsiz holatga aylantirmaydi va yo'qolgan segmentdan keyingi tiklanishni qisqartirmaydi. Qayta uzatish kutish vaqti tugagani uchun to'xtab qoladigan shell bu opsiya yoqilganda ham to'xtab qolaveradi, chunki opsiya tartiblash qoidasiga umuman tegmagan.
Ikkalasini chalkashtirish oson, chunki ikkalasi ham kechikishni tuzatish deb ta'riflanadi. Biri buferlash kiritgan sun'iy kutishni olib tashlaydi; ikkinchisi transport kafolatlaydigan narsani o'zgartirishni talab qilardi, buni esa hech qanday soket opsiyasi qilmaydi.
Transportlarni qanday adolatli taqqoslash kerak
Agar operator ruxsat bersa va ikkala xizmat ham mavjud bo'lsa, bir xil yuklamani tashiydigan UDP va TCP xizmatlarini bir xil kirish yo'li orqali bir xil serverga qarab taqqoslang. Ikki sinov o'rtasida mamlakat, provayder yoki server avlodini o'zgartirish natijani bosib ketadigan o'zgaruvchini kiritadi.
O'tkazuvchanlik raqamidan ko'ra umumiy pauzani kuzatib boring. Tashqi yo'qotish paytida bir necha ichki ilovaning birga to'xtab qolishi navbat boshining to'silishini aniqlaydigan kuzatuvdir; bitta past tezlik testi ko'rsatkichi esa bunday emas.
Tunnel interfeysida va jismoniy interfeysda ruxsat etilgan trafik yozuvlari ikki qatlamni aniq ajratadi, chunki ichki va tashqi qayta uzatishlar turli tartib fazolariga ega turli ulanishlarga tegishli. Tashqi oqimda bo'shliq ko'rinayotganda ichki qayta uzatishlarni ko'rish bevosita dalildir.
UDP ga o'tish qo'shimcha ishonchli oqimni olib tashlaydi va ichki TCP o'z tiklanishini o'zi bajarishiga qoldiradi. U nol yo'qotish yoki past kechikishni va'da qilmaydi va to'yingan uplink, haddan tashqari katta navbatlar yoki MTU muammosi baribir tuzatishni talab qiladi. Tunnel tashqarisidagi trafik hech qachon tunnelning tartib bo'shlig'i ortida ushlanmaydi, garchi ikkala yo'l bitta tiqilgan kanalni bo'lishsa u ham zarar ko'rishi mumkin, va bu umumiy to'siq bu ishga qo'shib yuborilishdan ko'ra alohida tekshirishga loyiqdir.