Azimjon Abdurasulov

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:

  1. Siz kafeda Wi-Fi ga ulangansiz (IP: 192.168.1.50). Katta fayl yuklanmoqda.
  2. Kafedan chiqdingiz. Telefon darhol 4G tarmog'iga o'tdi (IP: 178.214.12.8).
  3. TCP: Ulanish darhol o'ladi (Socket Reset - ECONNRESET).
  4. 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!

Markdown manba

iOS Lessons