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.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Stream interleave
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- İ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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?
- Stream 1 önce başladığı için bütün stream 3 frame’leri bekler.
- Ö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}]
- Yeni x-mode 62 olur; eski x-course bir sıra geriye gider.
- 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