05. UDP Asosidagi HTTP/3 va Connection Migration
gRPC & High-Performance System Design
05. UDP Asosidagi HTTP/3: Connection Migration va QUIC
Mobil ilovalar bilan ishlashda eng katta boshog'riq — bu beqaror tarmoqdir. Foydalanuvchi uydan ko'chaga chiqadi: telefon Wi-Fi'dan uzilib, 4G (LTE) mobil internetiga ulanadi. Natijada nima bo'ladi? An'anaviy TCP va HTTP/2 da: Barcha ulanishlar uziladi, yuklanayotgan fayllar to'xtaydi, video qotadi va qaytadan yuklash talab qilinadi!
Nima uchun? Chunki TCP ulanish IP-manzil va Portga (Socket tuple) bog'langan. Bu muammoni hal qilish uchun Google va IETF HTTP/3 va QUIC (Quick UDP Internet Connections) protokolini yaratdi.
1. TCP ning Qotili: Head-of-Line (HoL) Blocking
HTTP/2 bitta TCP ulanish ustida ko'plab oqimlarni (Streams) parallel yuborish imkonini berdi. Ammo TCP darajasida jiddiy muammo qoldi: Agar tarmoqda 1 dona paket yo'qolsa (Packet Loss), TCP yo'qolgan paket qayta yuborilmaguncha butun oqimni to'xtatib qo'yadi!
HTTP/2 (TCP Ustida):
Oqim 1: [Paket A] [Paket B] [YO'QOLDI!] -------------> BARCHA OQIMLAR TO'XTAB TURADI!
Oqim 2: [Paket X] [Paket Y] [KUTMOQDA...] ----------->
Oqim 3: [Paket 1] [Paket 2] [KUTMOQDA...] ----------->
HTTP/3 (QUIC / UDP Ustida):
Oqim 1: [Paket A] [Paket B] [YO'QOLDI!] -------------> Faqat Oqim 1 qayta so'raydi
Oqim 2: [Paket X] [Paket Y] [YETIB BORDI!] ----------> Davom etaveradi! (Hech qanday to'xtash yo'q)
Oqim 3: [Paket 1] [Paket 2] [YETIB BORDI!] ----------> Davom etaveradi!
2. Mobil Qurilmalar Uchun Mo'jiza: Connection Migration
QUIC protokoli ulanishni aniqlash uchun IP-manzil yoki portga emas, balki 64-bitlik Connection ID (CID) ga tayanadi.
Amaliy Ssenariy:
- Siz kafeda Wi-Fi ga ulangansiz (
IP: 192.168.1.50). Katta fayl yuklanmoqda. - Kafedan chiqdingiz. Telefon darhol 4G tarmog'iga o'tdi (
IP: 178.214.12.8). - TCP: Ulanish darhol o'ladi (Socket Reset - ECONNRESET).
- QUIC (HTTP/3): Ilova serverga shunchaki yangi IP orqali o'sha Connection ID bilan paket jo'natadi. Server ulanishni darhol davom ettiradi — hech qanday qayta ulanishsiz, 0 sekundlik kechikish bilan!
3. Swift 6 da HTTP/3 va QUIC dan Foydalanish
Apple kompaniyasi iOS 15 dan boshlab Network.framework va URLSession da HTTP/3 ni sukut bo'yicha qo'llab-quvvatlaydi:
import Foundation
import Network
public final class HTTP3NetworkManager {
public static let shared = HTTP3NetworkManager()
private let session: URLSession
private init() {
let config = URLSessionConfiguration.default
// HTTP/3 (QUIC) ni yoqish
config.assumesHTTP3Capable = true
config.multipathServiceType = .handover // Wi-Fi dan Cellular ga uzluksiz o'tish
self.session = URLSession(configuration: config)
}
public func executeRequest(url: URL) async throws -> Data {
var request = URLRequest(url: url)
request.httpMethod = "GET"
let (data, response) = try await session.data(for: request)
if let httpResponse = response as? HTTPURLResponse {
print("HTTP Status: \(httpResponse.statusCode)")
// HTTP/3 orqali kelganini tekshirish
print("Protokol: \(httpResponse.allHeaderFields["Alt-Svc"] ?? "HTTP/3")")
}
return data
}
}
4. Go Backend da QUIC Server (quic-go)
package main
import (
"crypto/tls"
"log"
"net/http"
"github.com/quic-go/quic-go/http3"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api/v1/ping", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"protocol":"HTTP/3","status":"blazing_fast"}`))
})
server := http3.Server{
Addr: ":443",
Handler: mux,
TLSConfig: &tls.Config{
// TLS 1.3 QUIC uchun majburiy hisoblanadi
MinVersion: tls.VersionTLS13,
},
}
log.Println("🚀 HTTP/3 QUIC Server :443 portida ishga tushdi...")
log.Fatal(server.ListenAndServeTLS("server.crt", "server.key"))
}
Keyingi darsda biz mobil ilovalar va bank tizimlari uchun eng yuqori xavfsizlik darajasi bo'lgan mTLS va Certificate Pinning texnologiyalarini o'rganamiz!