# 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:

```swift
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)

```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!
