Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-08.02

HTTP/2 streams, frames ve HPACK

Bir connection içinde bağımsız stream’leri izle; frame payload, field compression ve TCP ordering farklı katmanlardır.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Stream interleave

  1. İki request stream

    Established connection’da GET streams 1/3 alındı; response fields ve content henüz client’a ulaşmadı.

    Client / Duru
    1/3 awaiting fields
    Atlas server
    GET 1/3 received
    Yerel connection state
    Context established
  2. Responses hazır

    Server iki representation hazırlar; content’i stream IDs ile ilişkilendirir, tek body’de birleştirmez.

    Client / Duru
    1/3 awaiting fields
    Atlas server
    1:10 bytes; 3:4 bytes ready
    Yerel connection state
    Context established
  3. HEADERS ulaştı

    İki complete response field section client’a ulaştı; END_HEADERS var fakat body’ler complete değildir.

    Client / Duru
    1/3 status 200; body 0
    Atlas server
    Fields delivered
    Yerel connection state
    HPACK contexts synchronized
  4. DATA 1 parçası

    Stream 1’in ilk altı content byte’ı ulaştı; END_STREAM yok, onun response’u tamamlanmadı.

    Client / Duru
    1:6/10; 3:0/4
    Atlas server
    DATA 1 first delivered
    Yerel connection state
    TCP ordered delivery
  5. DATA 3 tamam

    Stream 3 Çay’ın dört byte’ını END_STREAM ile alır; stream 1 hâlâ altı byte state’inde kalır.

    Client / Duru
    1:6/10; 3 complete: Çay
    Atlas server
    DATA 3 delivered
    Yerel connection state
    Completion order: 3
  6. DATA 1 son parça

    Stream 1 son dört byte’ı END_STREAM ile alır; accumulated content Atlas note ve 10 byte olur.

    Client / Duru
    1 complete: Atlas note; 3 complete
    Atlas server
    DATA 1 final delivered
    Yerel connection state
    Completion order: 3,1
  7. Correlation sonucu

    Client her stream’i kendi request’ine bağlar; arrival array’nin tamamını tek body yapmaz.

    Client / Duru
    Two separate responses complete
    Atlas server
    No pending DATA
    Yerel connection state
    Connection remains shared

HPACK context

  1. Encoder ilk literal’ı hazırladı

    Capacity 128 ve başlangıçta boş table verilmiştir. Client encoder x-course: atlas incremental literal’ını hazırlarken kendi table’ına 62 olarak ekler. Server decoder henüz bu fragment’ı almamıştır; onun table’ı boştur.

    Client / Duru
    Literal x-course hazır; encoder62=x-course
    Atlas server
    No fragment received
    Yerel connection state
    Decoder dynamic empty
  2. İlk literal ulaştı

    Benign field representation bytes decoder’a ulaştı; field decode local step’te table’ı güncelleyecek.

    Client / Duru
    Literal x-course hazır; encoder62=x-course
    Atlas server
    Literal bytes received
    Yerel connection state
    Decoder dynamic empty
  3. Entry 62 eklendi

    Decoder incremental literal’ı açar: x-course: atlas, accounting 45 byte ve combined index 62 olur.

    Client / Duru
    Literal x-course hazır; encoder62=x-course
    Atlas server
    x-course decoded
    Yerel connection state
    62=x-course; size45
  4. Encoder sonraki alanları hazırladı

    Client encoder x-mode: demo literal’ını ekler; kendi table’ında x-mode 62, x-course 63 olur. İkinci literal ve onu izleyen bf indexed fragment hazırdır. Server decoder hâlâ ilk insertion sonrası 62=x-course state’indedir.

    Client / Duru
    x-mode literal + bf hazır; encoder62/63
    Atlas server
    x-course decoded
    Yerel connection state
    62=x-course; size45
  5. İkinci literal ulaştı

    İkinci field representation ulaşınca eski table henüz aynı kalır; update processing ayrıca yapılır.

    Client / Duru
    x-mode literal + bf hazır; encoder62/63
    Atlas server
    Second literal bytes received
    Yerel connection state
    62=x-course; size45
  6. Indices kaydı

    x-mode: demo newest entry 62 olur, x-course 63’e kayar; toplam accounting 87 byte capacity içinde kalır.

    Client / Duru
    x-mode literal + bf hazır; encoder62/63
    Atlas server
    x-mode decoded
    Yerel connection state
    62=x-mode; 63=x-course; size87
  7. Indexed 63 ulaştı

    bf indexed representation current decoder context’ine ulaştı; literal field veya static index değildir.

    Client / Duru
    x-mode literal + bf hazır; encoder62/63
    Atlas server
    bf bytes received
    Yerel connection state
    62=x-mode; 63=x-course; size87
  8. Context ile çözüldü

    Decoder 63’ü x-course: atlas olarak çözer; table mutation yok, header fragment’in anlamı context’e bağlıdır.

    Client / Duru
    Fragment sequence complete
    Atlas server
    Decoded x-course: atlas
    Yerel connection state
    Table size87 unchanged

DATA credit

  1. Credit sınırı

    Stream 3 için pending DATA dört byte; remaining stream credit iki, connection credit on byte’dır.

    Client / Duru
    Peer credit2
    Atlas server
    DATA4 pending
    Yerel connection state
    stream2 / connection10
  2. Gönderim bekler

    Bu örnek dört byte’ı tek DATA frame olarak göndermeyi seçer ve credit 2 iken bekler. Daha küçük bir DATA frame ile kısmi gönderim protocol tarafından mümkündür; burada gösterilmez. Connection credit 10, stream limit’ini kaldırmaz.

    Client / Duru
    Peer credit2
    Atlas server
    DATA4 blocked by stream
    Yerel connection state
    stream2 / connection10
  3. Peer update hazırlandı

    Client stream 3 için WINDOW_UPDATE +2 hazırlar. Bu update henüz server’a ulaşmamıştır; server’ın kalan credit’i 2 olarak kalır. Dört byte’lık tek DATA frame’i bu aşamada gönderilemez.

    Client / Duru
    WINDOW_UPDATE 3 +2 hazır
    Atlas server
    DATA4 blocked by stream
    Yerel connection state
    stream2 / connection10
  4. WINDOW_UPDATE ulaştı

    Client’ın stream 3 için +2 update’i sender’a ulaştı; sender current remaining stream credit’ini dört yapar.

    Client / Duru
    Update +2 sent
    Atlas server
    DATA4 now allowed
    Yerel connection state
    stream4 / connection10
  5. DATA hazırlanır

    Local sender dört-byte valid DATA’yı seçer ve sending için her iki window’dan dört byte tüketir.

    Client / Duru
    Awaiting DATA
    Atlas server
    DATA4 ready; END_STREAM
    Yerel connection state
    stream0 / connection6
  6. DATA ulaştı

    Client Çay content’ini END_STREAM ile alır; peer update’in arrival’ı olmadan bu branch gönderime geçmemiştir.

    Client / Duru
    3 complete: Çay
    Atlas server
    DATA4 delivered
    Yerel connection state
    stream0 / connection6

TCP gap

  1. Fields zaten known

    Response fields önce decoded; yeni content frames shared TCP stream’in sonraki bytes’ındadır.

    Client / Duru
    Bodies pending
    Atlas server
    Later DATA prepared
    Yerel connection state
    TCP earlier bytes missing
  2. TCP gap beklenir

    Verilen TCP byte gap’i nedeniyle stream 1 ve 3’ün sonraki frame’leri parser’a ilerleyemez. DATA’nın alındığı varsayılmaz.

    Client / Duru
    Bodies pending
    Atlas server
    Later DATA prepared
    Yerel connection state
    Later parser delivery blocked
  3. Gap çözüldü

    Örnekteki transport olayı, önceki byte’ları ordered delivery için hazır hale getirir. HTTP frame’in alınması bir sonraki adımdır.

    Client / Duru
    Bodies pending
    Atlas server
    Later DATA prepared
    Yerel connection state
    TCP parser delivery available
  4. Stream 3 DATA ulaştı

    Ordered bytes parser’a ilerledikten sonra stream 3’ün DATA frame’i client state’ini değiştirebilir.

    Client / Duru
    3 complete: Çay; 1 pending
    Atlas server
    DATA3 delivered
    Yerel connection state
    TCP gap resolved
  5. Wait reason ayrıldı

    Client önceki beklemeyi HTTP response sırası yerine TCP delivery olarak işaretler; network timing ölçülmez.

    Client / Duru
    3 complete; 1 pending
    Atlas server
    No new DATA event
    Yerel connection state
    Reason: TCP ordered delivery

ROLLER · STATE · VERİ AKIŞI

HTTP semantics kalır; message taşıması değişir

Duru Atlas’tan /atlas-notes ve /tea ister. HTTP/2 yine GET ve 200 semantics’ini taşır, fakat text request/status-line yerine control data pseudo-headers ve binary frames kullanır. :method, :scheme, :authority, :path ile :status okunur gösterimde fields gibi görünür; bunlar literal HTTP/1.1 start-line değildir.

Bir request/response exchange bir HTTP/2 stream tüketir. Client başlatılmış streams 1, 3, 5 gibi odd IDs kullanır; stream 0 connection control için ayrılır. ID connection içinde correlation sağlar; user identity, global request ID veya tenant permission değildir. Buradaki 1 ve 3 aynı client’ın iki safe GET exchange’idir.

Connection setup, preface ve SETTINGS normal protocol operation’ın parçalarıdır. Sahneler established connection ve açılmış request streams’den başlar; setup’ın atlanması setup olmadan valid HTTP/2 çalıştığı anlamına gelmez. Shared HTTP semantics WEB-07’deki method/media/permission sınırlarını korur.

Multiplexing response order’ı stream’e bağlar

Server stream 1’in Atlas note content’ini iki DATA frame’e böler: Atlas boşluk dahil 6 byte, note 4 byte. Aralarına stream 3’ün dört-byte Çay DATA frame’i girer. Stream 3 END_STREAM ile önce complete olur; stream 1’in son dört byte’ı sonra gelir. HTTP/1.1 pipeline’ın response-order kuyruğu burada aynı biçimde zorunlu değildir.

Frames’ın her stream içindeki sırası hâlâ anlamlıdır. Response fields HEADERS ile gelir, content DATA ile, completion ilgili END_STREAM veya uygun trailer section ile anlaşılır. END_HEADERS field block’un bittiğini söyler; END_STREAM ile aynı sonuç değildir. Bir field section birden fazla HEADERS/CONTINUATION parçasıysa block contiguous kalır; bütün frame türleri serbestçe araya sokulamaz.

Multiplexing TCP’deki tek ordered byte stream’i değiştirmez. Connection’ın başındaki missing TCP bytes daha sonraki HTTP/2 frames’ın parser’a ilerlemesini bekletebilir; frame başka stream’e ait olsa da TCP delivery boundary ortaktır. Bu transport head-of-line, stream response-order’dan farklıdır. Sahnede tcp-gap branch supplied transport condition kullanır; paket kaybı göndererek üretmez.

Frame header ile content length ayrı ölçülür

HTTP/2 frame header sabit 9 octet’tir: 24-bit payload Length, Type, Flags ve reserved bit ile 31-bit Stream Identifier. Length bu dokuz byte’ı içermez. Artifact stream 3 için type DATA=0, flags END_STREAM=1, payloadLength=4 verir; UTF-8 Çay ile toplam 13-byte frame fragment’i oluşur.

Bu fragment valid established response context’inde bir DATA frame’dir; tek başına complete connection capture değildir. HEADERS semantic projections’ı ayrı verilmiştir; HPACK bytes’ın tamamı o ledger’dan türetilmiş sayılmaz. HTTP content length birçok DATA payload’ın toplamıyla ilgili olabilir, tek frame header’ın Length’i ise sadece o frame’i sayar.

DATA için flow-control stream ve connection windows birlikte uygulanır. Fixture’da stream credit=2 iken 4-byte DATA gönderilmez; connection credit=10 olsa bile stream boundary engeldir. Peer’dan WINDOW_UPDATE +2 ulaşınca credit=4 olur, frame gönderilir ve iki window da 4 azalır. Bu kalan credit örneğidir; protocol initial window size veya production tuning önerisi değildir. Bu bekleme, dört byte’ın tek frame olarak seçilmesine aittir; implementation credit’e sığan daha küçük DATA frame’leri kullanarak kısmi ilerleyebilir.

HPACK, peer’ların paylaştığı field context’idir

HPACK body’yi compress etmez; field sections için static table, dynamic table ve literal representations kullanır. Static table 61 entry içerir; :method GET index=2, :path / index=4, :scheme https index=7, :status 200 index=8’dir. Indexed encoding table’daki name/value pair’i kullanır; string literal’ları gerektiğinde static Huffman coding kullanabilir.

Fixture Huffman kullanmadan x-course: atlas literal’ını incremental indexing ile ekler. Dynamic table başlangıçta boştur; yeni entry combined index=62 olur. Sonra x-mode: demo eklenince newest 62, önceki x-course 63 olur. 62 kalıcı x-course kodu değildir: index current context’e göre çözülür. Decoder field blocks’u sıralı işleyerek aynı context’i üretir.

Entry boyutu, decoded name byte length + value byte length + 32 olarak hesaplanır. İlk entry 45, ikinci 42, toplam 87 byte’tır. Verilen capacity 128 olduğu için eviction gerekmez. Encoder ve decoder her yön için ayrı context tutar; her stream’e bağımsız table kurulmaz. Bu örnek yalnız belirtilen header fragment’lerini çözer; tam HPACK codec, TLS koruması veya bütün HTTP/2 validation kurallarını çalıştırmaz.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Index context

  1. İlk insertion index’i snapshot’a bağlandı

    Static table 61 entry taşır. x-course: atlas ilk dynamic entry olur ve combined index 62 alır. Index’in anlamı bu directional context’in state’ine bağlıdır.

    Frame/field record
    First: 62=x-course:atlas
    Context/credit gate
    Kontrol bekliyor
    Acceptance boundary
    Hüküm yok
  2. Yeni insertion eski index’i kaydırdı

    x-mode: demo eklenince index 62’yi alır; x-course: atlas index 63’e kayar. Eski snapshot’taki 62 anlamını yeni field block’a taşımak yanlış field üretir.

    Frame/field record
    First: 62=x-course:atlas
    Context/credit gate
    Now: 62=x-mode:demo / 63=x-course:atlas
    Acceptance boundary
    Hüküm yok
  3. Field anlamı current context’te çözüldü

    bf fragment’ı bu snapshot’ta index 63’ü, yani x-course: atlas alanını seçer. Hex tek başına table history sağlamaz; yanlış context routing veya audit yorumunu yanıltabilir.

    Frame/field record
    First: 62=x-course:atlas
    Context/credit gate
    Now: 62=x-mode:demo / 63=x-course:atlas
    Acceptance boundary
    bf→63→x-course:atlas
  4. Entry accounting DATA credit’ten ayrıldı

    Entry sizes 45 ve 42’dir; toplam 87, verilmiş capacity 128’in altındadır. Bu HPACK accounting, DATA flow credit veya bütün application memory sınırı değildir.

    Frame/field record
    45+42=87 / capacity 128
    Context/credit gate
    Now: 62=x-mode:demo / 63=x-course:atlas
    Acceptance boundary
    bf→63→x-course:atlas
  5. Decoder ownership yön ve sırayla korundu

    Decoder direction ve field-block order birlikte korunur. Bu isolated fragment’lar complete HEADERS değildir; synchronized capacity verilmiştir. Field decode user permission sağlamaz.

    Frame/field record
    45+42=87 / capacity 128
    Context/credit gate
    Directional context required
    Acceptance boundary
    bf→63→x-course:atlas
  6. Compression sonucu permission’a taşmadı

    Index 63 bu context’te doğru çözülür. Decoded size limits, sensitive field policy ve exchange authorization’ı ayrı gate’lerdir. Compression encryption veya tenant isolation kanıtı değildir.

    Frame/field record
    45+42=87 / capacity 128
    Context/credit gate
    Directional context required
    Acceptance boundary
    Field resolved / permission separate

DATA credit

  1. Pending DATA iki credit ile ilişkilendirildi

    Stream 3’te pending DATA 4 byte, remaining stream credit 2 ve connection credit 10’dur. Bunlar önceki activity sonrasında verilmiştir; protocol initial-window default değerleri değildir.

    Frame/field record
    Pending 4 / stream 2 / connection 10
    Context/credit gate
    Kontrol bekliyor
    Acceptance boundary
    Hüküm yok
  2. Ready ile send eligibility ayrıldı

    Seçilen dört byte’lık tek frame, stream credit 2’ye sığmaz; connection credit 10 bu sınırı telafi etmez. Daha küçük DATA frame ile kısmi ilerleme mümkündür. Bu örnek o seçeneği değil, peer update’ini bekleyen gönderimi gösterir.

    Frame/field record
    Pending 4 / stream 2 / connection 10
    Context/credit gate
    Four-byte send blocked by stream credit
    Acceptance boundary
    Hüküm yok
  3. Wait application deny sayılmadı

    blockedInitially true, peer-credit koşulunu anlatır; authorization deny değildir. DATA flow control, decoded headers veya bütün business work için yeterli resource limit sayılmaz.

    Frame/field record
    Pending 4 / stream 2 / connection 10
    Context/credit gate
    Four-byte send blocked by stream credit
    Acceptance boundary
    Credit wait / permission unknown
  4. Window update verilmiş scope’uyla okundu

    windowUpdateIncrement 2 verilmiştir; updatedStreamCredit 4 olur. Bu local review gerçek packet arrival ölçmez. Peer update alınmadan sender credit’i artmış gibi gösterilmez.

    Frame/field record
    Supplied update 2 / stream credit 4
    Context/credit gate
    Stream credit 4; dört byte gönderilebilir
    Acceptance boundary
    Credit wait / permission unknown
  5. Send hesabı iki window’dan düşüldü

    Dört DATA byte sonrasında stream credit 0, connection credit 6 olur. Ayrı TCP gap case’i earlier bytes eksikliğidir. Credit wait ile ordered-delivery wait aynı reason değildir.

    Frame/field record
    Supplied update 2 / stream credit 4
    Context/credit gate
    After send: stream 0 / connection 6
    Acceptance boundary
    Credit wait / permission unknown
  6. Arithmetic ölçülmeyen runtime’a genellenmedi

    Hesap bu verilmiş credits için tutarlıdır. Gerçek throughput veya TCP recovery sonucu çıkarılmaz. Her stream’in trusted request context ve resource authorization kararı credit’ten bağımsız kalır.

    Frame/field record
    Supplied update 2 / stream credit 4
    Context/credit gate
    After send: stream 0 / connection 6
    Acceptance boundary
    Credit known / application separate

VARSAYIM · SINIR · KONTROL

Transport state, subject state değildir

Stream 1 ve 3 farklı exchange’leri ayırır; aynı connection üzerinde oldukları için authorization bir kez yapılmış sayılmaz. Hata koşulu stream ID veya connection reuse’u trusted user/resource policy yerine kullanmaktır. Etki hangi protected response’un yanlış subject’e bağlandığına göre belirlenir.

Connection-specific HTTP/1.1 fields burada geçerli değildir: Connection, Keep-Alive ve Transfer-Encoding HTTP/2 field sections’ında üretilmez; request TE: trailers ayrı narrow exception’dır. Version conversion maintained stack’in sorumluluğudur, bir display’de text header görünmesi wire’ın aynı syntax’ta olduğunu kanıtlamaz.

Kontrol her exchange’in request context’ini canonical routing, trusted authentication ve resource permission ile ilişkilendirmektir. TLS connection peer’i ile application subject ayrımı sürer. Fixture yalnız benign metadata ve content kullanır; stream isolation tek başına tenant isolation testi değildir.

Compression ve multiplexing resource sınırlarını kaldırmaz

Dynamic table index’ini current context olmadan çözmek farklı field üretir. Böyle bir yanlış inceleme cache/routing veya policy input’unu hatalı okutur. Decoder state, direction ve field-block order birlikte bilinmelidir; yalnız son byte hex’i yeterli değildir.

Stream count, buffered DATA, decoded field size ve compression context farklı resource dimensions’dır. Flow control yalnız DATA için credit sağlar; decoded headers veya bütün application work için sınırsız koruma oluşturmaz. Default değerleri bağlam dışı production limit gibi kopyalama.

Savunma maintained codec, explicit bounded decoded fields/work ve privacy-aware compression policy’dir. Sensitive fields için never-indexed literal semantics yardımcı olabilir; bu encryption değildir ve intermediary’lerin de o representation kuralını koruması gerekir. Bu derste secret field örneği veya compression probing çalıştırılmaz.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

Per-stream body

  1. Interleaved DATA stream’e göre işaretlendi

    DATA sırası stream 1’de Atlas , stream 3’te Çay, ardından stream 1’de note’tur. Global concatenation yanlış body üretir; payload kendi streamId’siyle ilişkilendirilir.

    Frame ledger
    DATA1(6), DATA3(4), DATA1(4)
    Stream correlation
    Kontrol bekliyor
    Evidence verdict
    Hüküm yok
  2. Content ayrı accumulator’larda toplandı

    Stream 1’de 6+4 byte Atlas note, stream 3’te 4 byte Çay olur. DATA payloadLength content’i sayar; frame başına 9 byte header overhead’i content-length’e eklenmez.

    Frame ledger
    DATA1(6), DATA3(4), DATA1(4)
    Stream correlation
    Stream1=10 / stream3=4
    Evidence verdict
    Hüküm yok
  3. END_HEADERS body completion olmadı

    İlk HEADERS gözleminde endHeaders=true ve endStream=false’tur; o anda iki body’de de sıfır byte vardır. Ardından DATA1 ile 6 byte birikir; DATA3 END_STREAM ile 4/4 tamamlanırken stream 1 yalnız 6/10’dadır. Önceki toplamlar final sonuçtur, bu ara an değildir.

    Frame ledger
    Header complete / body state per stream
    Stream correlation
    DATA3 bittiğinde: stream1 6/10; stream3 4/4
    Evidence verdict
    Hüküm yok
  4. Completion order kendi stream’leriyle hesaplandı

    Stream 3 son DATA’sını önce alır; completionOrder 3,1’dir. HTTP/1.1 pipeline order kuralı burada uygulanmaz. Stream correlation korununca bu farklı completion sırası normaldir.

    Frame ledger
    Header complete / body state per stream
    Stream correlation
    Completion 3,1 / lengths match
    Evidence verdict
    Hüküm yok
  5. Length oracle controls ile sınırlandı

    Normal XML endStream true için 4/4 ve 10/10 byte verir; mismatch sıfırdır. Positive control 2/4 verir ve bir match üretir. Bu authored observations gerçek capture fields değildir.

    Frame ledger
    Header complete / body state per stream
    Stream correlation
    Completion 3,1 / lengths match
    Evidence verdict
    Normal 0 / positive 1
  6. Correlation tenant isolation claim’i olmadı

    Receiver HTTP/2 parser’ı, aynı connection ve response yönünde streamId, DATA payload byte sayısı ve END_STREAM’i birlikte gözlemlemelidir. Bu alanlar iki body’yi ve 3,1 completion sırasını destekler; user/tenant permission’ı application’ın ayrı kaydıdır.

    Frame ledger
    Header complete / body state per stream
    Stream correlation
    Completion 3,1 / lengths match
    Evidence verdict
    Bodies correlated / tenant policy unverified

Observer gap

  1. TCP gap decoder wait’inden ayrıldı

    tcpGap headersPreviouslyDecoded true verir; earlier TCP bytes parser’a ilerlememiştir. Later streamId’ler 1 ve 3’tür. Bu ordered-byte dependency, HPACK field decode wait’i değildir.

    Frame ledger
    Fields decoded / earlier bytes unavailable
    Stream correlation
    Kontrol bekliyor
    Evidence verdict
    Hüküm yok
  2. TCP dependency birden fazla stream’i etkiledi

    allLaterFramesParserBlocked true’tur. Multiplexing TCP’nin ordered delivery koşulunu kaldırmaz. Stream 3’ün farklı ID’si aynı connection’daki missing earlier bytes’ı atlatmaz.

    Frame ledger
    Fields decoded / earlier bytes unavailable
    Stream correlation
    Later frames 1 and 3 blocked by TCP
    Evidence verdict
    Hüküm yok
  3. Gap cause ölçülmüş gibi yazılmadı

    Verilen gap resolution sonrasında parser ilerleyebilir. Gerçek missing packet veya timing ölçümü yoktur. Dependency bilinirken cause bilinmeyebilir; otomatik network loss teşhisi eklenmez.

    Frame ledger
    Dependency known / loss cause unmeasured
    Stream correlation
    Later frames 1 and 3 blocked by TCP
    Evidence verdict
    Hüküm yok
  4. Receiver coverage ayrıca sorgulandı

    Alternatif review’de complete receiver ledger yoktur. expectedBodies kopyalamak missing frame’i observation’a çevirmez. endStream ve accumulated content birlikte gözlenmeden completion hükmü verilmez.

    Frame ledger
    Dependency known / loss cause unmeasured
    Stream correlation
    Receiver completion coverage missing
    Evidence verdict
    Hüküm yok
  5. Zero mismatch unknown sonucu kapatmadı

    Missing stream observation selector’da mismatch üretmeyebilir. Completion verdict UNKNOWN kalır. Stream ID, direction, frame type ve receiver coverage olmadan tam validation sonucu çıkarılmaz.

    Frame ledger
    Dependency known / loss cause unmeasured
    Stream correlation
    Receiver completion coverage missing
    Evidence verdict
    UNKNOWN: receiver completion
  6. Minimum evidence ve wait reason korundu

    Yeni review için scoped completion flags ve content count gerekir; sensitive body gerekli değildir. Credit wait ile TCP-byte wait ayrı reason kalır. Yeni evidence gelmeden normal fixture sonucu aktarılmaz.

    Frame ledger
    Dependency known / loss cause unmeasured
    Stream correlation
    Receiver completion coverage missing
    Evidence verdict
    Needed: scoped frame/flag/count coverage

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Frame ledger’ını stream’e göre birleştir

Manual exercise’de önce stream 1 ve 3 headers projection’ını ayır, sonra DATA content’i stream ID’ye göre birleştir. Arrival order DATA1(6), DATA3(4), DATA1(4) olsa da text sonuçları Atlas note ve Çay’dır. Global arrival array’den tek concatenated body üretmek yanlış correlation olur.

END_HEADERS, END_STREAM ve Content-Length’i ayrı sütunlarda izle. İlk ikisi flags/context, üçüncüsü HTTP field semantics’tir. Artifact selector END_STREAM gözlemi varken accumulated content bytes’ın expected length’e eşit olmadığını söyleyen satırı seçer; normal 0, inconsistent positive 1 verir.

Missing frame veya yanlış capture direction sonucu 0 görünebilir; bu complete validation değildir. Diagnostic record protocol, connection alias, stream ID, frame type ve accumulated content count içerebilir. Sensitive body’yi tamamen loglamadan completion boundary’si değerlendirilebilir.

Wait reason ve compression context’i görünür tut

Window branch’te stream credit 2, connection credit 10 ve pending content 4’tür. İki credit’ten küçük olan DATA progress’i sınırlar; peer update’i arrival olmadan sender window değişmez. Yeni credit geldikten sonra kullanılan amount iki window’dan da çıkarılır; server’ın “ready” state’i gönderilmiş sayılmaz.

TCP gap branch’te decoded fields zaten vardır fakat sıradaki bytes parser’a ilerlememiştir; bu pending field decode ile aynı wait reason değildir. HPACK branch’te 62/63 değerlerini table snapshot’ıyla eşleştir. Fragment’in context’i olmadan header meaning tahmin etme.

Native local HTTP/2 check plaintext loopback üzerinde iki safe GET stream’inin completion order’ını gözleyebilir. Binary fragment ve HPACK subset ayrıca bounded byte exercise’dır. TLS, browser negotiation, frame capture, proxy behavior ve resource-limit stress kendi ayrı doğrulama kapsamlarıdır.

ŞİMDİ VAKAYA UYGULA

Multiplexing, HPACK ve flow control hangi sınırları değiştirmez?

Atlas note stream 1’de, Çay stream 3’te taşınır. Stream 3 önce complete olabilir. HPACK index 63 current table’da x-course: atlas seçer; DATA credit ve TCP ordered bytes farklı wait koşullarıdır.

Vakadaki response başka bir HTTP transport üzerinde gelseydi hangi application koşulları yine gerekli olurdu? Stream veya packet completion’ını başarılı note parsing’le eşitleme.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Stream/frame ve HPACK context ledger

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "connectionEstablishedSupplied": true,
  "requestStreams": [
    {
      "id": 1,
      "method": "GET",
      "path": "/atlas-notes"
    },
    {
      "id": 3,
      "method": "GET",
      "path": "/tea"
    }
  ],
  "responseHeadersProjection": [
    {
      "streamId": 1,
      "fields": {
        ":status": "200",
        "content-type": "text/plain; charset=utf-8",
        "content-length": "10"
      },
      "endHeaders": true,
      "endStream": false
    },
    {
      "streamId": 3,
      "fields": {
        ":status": "200",
        "content-type": "text/plain; charset=utf-8",
        "content-length": "4"
      },
      "endHeaders": true,
      "endStream": false
    }
  ],
  "dataFrames": [
    {
      "streamId": 1,
      "type": "DATA",
      "typeValue": 0,
      "flags": 0,
      "endStream": false,
      "payloadLength": 6,
      "content": "Atlas ",
      "payloadHex": "41746c617320",
      "frameHex": "00000600000000000141746c617320",
      "frameOctets": 15
    },
    {
      "streamId": 3,
      "type": "DATA",
      "typeValue": 0,
      "flags": 1,
      "endStream": true,
      "payloadLength": 4,
      "content": "Çay",
      "payloadHex": "c3876179",
      "frameHex": "000004000100000003c3876179",
      "frameOctets": 13
    },
    {
      "streamId": 1,
      "type": "DATA",
      "typeValue": 0,
      "flags": 1,
      "endStream": true,
      "payloadLength": 4,
      "content": "note",
      "payloadHex": "6e6f7465",
      "frameHex": "0000040001000000016e6f7465",
      "frameOctets": 13
    }
  ],
  "expectedBodies": {
    "1": "Atlas note",
    "3": "Çay"
  },
  "completionOrder": [
    3,
    1
  ],
  "hpack": {
    "staticTableLength": 61,
    "staticEntries": [
      {
        "index": 2,
        "name": ":method",
        "value": "GET"
      },
      {
        "index": 4,
        "name": ":path",
        "value": "/"
      },
      {
        "index": 7,
        "name": ":scheme",
        "value": "https"
      },
      {
        "index": 8,
        "name": ":status",
        "value": "200"
      }
    ],
    "capacitySupplied": 128,
    "initialDynamicEntries": [],
    "huffman": false,
    "fragmentScope": "Isolated benign HPACK field representations, not complete request HEADERS or a connection capture. Capacity already synchronized and supplied; no table-size update fragment is shown.",
    "operations": [
      {
        "kind": "literal-incremental",
        "name": "x-course",
        "value": "atlas",
        "hex": "4008782d636f757273650561746c6173",
        "entrySize": 45,
        "entriesNewestFirst": [
          {
            "name": "x-course",
            "value": "atlas",
            "combinedIndex": 62
          }
        ]
      },
      {
        "kind": "literal-incremental",
        "name": "x-mode",
        "value": "demo",
        "hex": "4006782d6d6f64650464656d6f",
        "entrySize": 42,
        "entriesNewestFirst": [
          {
            "name": "x-mode",
            "value": "demo",
            "combinedIndex": 62
          },
          {
            "name": "x-course",
            "value": "atlas",
            "combinedIndex": 63
          }
        ]
      },
      {
        "kind": "indexed",
        "index": 63,
        "hex": "bf",
        "resolvedName": "x-course",
        "resolvedValue": "atlas",
        "tableSize": 87
      }
    ]
  },
  "flow": {
    "streamId": 3,
    "pendingDataOctets": 4,
    "initialRemainingStreamCredit": 2,
    "initialRemainingConnectionCredit": 10,
    "blockedInitially": true,
    "windowUpdateIncrement": 2,
    "updatedStreamCredit": 4,
    "afterSendStreamCredit": 0,
    "afterSendConnectionCredit": 6,
    "scope": "Remaining credits supplied after previous activity, not protocol initial-window defaults."
  },
  "tcpGap": {
    "condition": "Earlier TCP bytes unavailable to parser",
    "headersPreviouslyDecoded": true,
    "laterFrameStreamIds": [
      1,
      3
    ],
    "allLaterFramesParserBlocked": true,
    "afterSuppliedGapResolutionParserCanProgress": true,
    "scope": "Logical ordered-delivery dependency; no missing packet, congestion algorithm, or timing measurement."
  },
  "selector": {
    "language": "XPath",
    "xml": "<observations><stream id=\"3\" endStream=\"true\" contentOctets=\"4\" expectedOctets=\"4\"/><stream id=\"1\" endStream=\"true\" contentOctets=\"10\" expectedOctets=\"10\"/></observations>",
    "xpath": "count(/observations/stream[@endStream=\"true\" and @contentOctets!=@expectedOctets])",
    "expected": 0,
    "positiveFixtureXml": "<observations><stream id=\"3\" endStream=\"true\" contentOctets=\"2\" expectedOctets=\"4\"/></observations>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
dataFrames
Valid DATA fragments: Length payload’ı sayar, frame header ayrıca 9 byte.
hpack.operations
Current shared directional context ile newest-first dynamic indices.
flow / tcpGap
Peer credit wait ile ordered TCP delivery wait ayrı conditions.

HEADERS semantic projection, DATA valid fragment ve HPACK bounded subset farklı kanıtlardır. Established contexts supplied; TLS/Browser/packet-loss reproduction yoktur. Native local HTTP2 sonucu ayrı bir doğrulama kapsamıdır.

İki yanlış kanı

HTTP/2 bütün head-of-line blocking’i bitirir.

Stream response-order interleave edilebilir; TCP ordered-delivery ve flow-control boundaries yine bekletebilir. Wait reason ayrı okunmalıdır.

HPACK index 62 her zaman aynı header’dır.

61 static entry sonrası 62 current newest dynamic entry’dir. Bu fixture ikinci insertion sonrası x-course’u 63’e taşır; table direction/context gerekir.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

DATA sırası stream 1 Atlas , stream 3 Çay, stream 1 note. Hangi response önce tamamlanır?

  1. Stream 1 önce başladığı için bütün stream 3 frame’leri bekler.
  2. Önce stream 3 Çay, sonra stream 1 Atlas note.
Gerekçeli cevabı oku

Önce stream 3 Çay, sonra stream 1 Atlas note. — İç içe gelen frame’ler stream ID’ye göre birleştirilir. completionOrder=[3, 1].

Dynamic entry eklenince x-course index’i neden 62’den 63’e geçer?

Dersten seçilen artifact alanları; öğretim örneği

hpack.operations[0].entriesNewestFirst
[{"name":"x-course","value":"atlas","combinedIndex":62}]
hpack.operations[1].entriesNewestFirst
[{"name":"x-mode","value":"demo","combinedIndex":62},{"name":"x-course","value":"atlas","combinedIndex":63}]
  1. Yeni x-mode 62 olur; eski x-course bir sıra geriye gider.
  2. Index değişmez; 62 her connection’da x-course demektir.
Gerekçeli cevabı oku

Yeni x-mode 62 olur; eski x-course bir sıra geriye gider. — 61 static entry sonrasındaki dynamic index’ler table context’ine bağlıdır. Index global header ID değildir.

HTTP/2 stream’leri ayrıysa TCP gap neden sonraki iki stream’in parser’ını da durdurabilir?

Gerekçeli cevabı oku

HTTP frame’leri ayrı stream ID’leri taşır, fakat TCP parser’a tek sıralı byte stream verir. Önceki gap kapanmadan sonraki frame byte’ları kullanılamayabilir. Bu model gerçek loss nedeni veya timer ölçmez. Her stream’in flow credit sınırı da ayrı değerlendirilir.

□ Transport gap ile HTTP stream ordering’i ayırdım.

□ Modeldeki blocking sonucunu gerçek loss teşhisi saymadım.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam

  • RFC 9113 — HTTP/21 Introduction · 4.1 Frame Format · 4.3 Field Section Compression and Decompression · 4.3.1 Compression State · 5 Streams and Multiplexing · 5.1.1 Stream Identifiers · 5.2.1 Flow-Control Principles · 6.1 DATA · 6.2 HEADERS · 6.9 WINDOW_UPDATE · 8.1 HTTP Message Framing · 8.2.2 Connection-Specific Header Fields
  • RFC 7541 — HPACK2.3 Indexing Tables · 2.3.3 Index Address Space · 4.1 Calculating Table Size · 5.2 String Literal Representation · 6.1 Indexed Header Field Representation · 6.2.1 Literal Header Field with Incremental Indexing · 6.2.3 Literal Header Field Never Indexed · Appendix A Static Table Definition