WEB / WEB-04.02
TCP veri aktarımı ve kayıp yönetimi
Sequence aralıkları üzerinden stream’i yeniden kur; ACK, retransmission ve iki sending budget’ını ayır.
1. Core · Mekanizma
Hareket olmadan bütün senaryoları oku
Ordered arrival
- Established byte context
Handshake tamamlanmış seçilir; iki peer veri aktarımına hazır.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1001
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; app unread
- Local segmentation ve sender bookkeeping
NOTES! byte’ları örnekteki iki segmente ayrılır. Sender’ın gönderim kaydı, peer’in byte’ları aldığına dair kanıt değildir.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; flight=6; segments prepared
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; app unread
- NO server’a ulaştı
Receiver range ve contiguous prefix’i günceller; uygulama read’i henüz yok.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; flight=6; segments prepared
- Server transport
- ESTABLISHED; RCV.NXT=1003; contiguous=NO; held=empty; app unread
- ACK 1003 client’a ulaştı
ACK sender’ın transport bilgisini günceller; business success bildirimi değildir.
- Client transport
- ESTABLISHED; UNA=1003; NXT=1007; ACK received=1003; flight=4
- Server transport
- ESTABLISHED; RCV.NXT=1003; contiguous=NO; held=empty; app unread
- TES! server’a ulaştı
Receiver range ve contiguous prefix’i günceller; uygulama read’i henüz yok.
- Client transport
- ESTABLISHED; UNA=1003; NXT=1007; ACK received=1003; flight=4
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; held=empty; app unread
- ACK 1007 client’a ulaştı
ACK sender’ın transport bilgisini günceller; business success bildirimi değildir.
- Client transport
- ESTABLISHED; UNA=1007; NXT=1007; ACK received=1007; flight=0
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; held=empty; app unread
- Application local read
Application byte’ları local olarak tüketir; bu yeni network transfer veya kalıcı kayıt değildir.
- Client transport
- ESTABLISHED; UNA=1007; NXT=1007; ACK received=1007; flight=0
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; app read=NOTES!; commit unmodeled
Reordered arrival
- Established byte context
Handshake tamamlanmış seçilir; iki peer veri aktarımına hazır.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1001
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; app unread
- Local segmentation ve sender bookkeeping
NOTES! byte’ları iki seçilmiş segmente ayrılır. Gönderim bookkeeping’i peer receipt kanıtı değildir.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; flight=6; segments prepared
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; app unread
- TES! server’a ulaştı
Receiver range ve contiguous prefix’i günceller; uygulama read’i henüz yok.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; flight=6; segments prepared
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; held=[1003,1007); app unread
- ACK 1001 client’a ulaştı
ACK sender’ın transport bilgisini günceller; business success bildirimi değildir.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; ACK received=1001; flight=6
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; held=[1003,1007); app unread
- NO server’a ulaştı
Receiver range ve contiguous prefix’i günceller; uygulama read’i henüz yok.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; ACK received=1001; flight=6
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; held=empty; app unread
- ACK 1007 client’a ulaştı
ACK sender’ın transport bilgisini günceller; business success bildirimi değildir.
- Client transport
- ESTABLISHED; UNA=1007; NXT=1007; ACK received=1007; flight=0
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; held=empty; app unread
- Application local read
Application byte’ları local olarak tüketir; bu yeni network transfer veya kalıcı kayıt değildir.
- Client transport
- ESTABLISHED; UNA=1007; NXT=1007; ACK received=1007; flight=0
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; app read=NOTES!; commit unmodeled
Seçilmiş RTO recovery
- Established byte context
Handshake tamamlanmış seçilir; iki peer veri aktarımına hazır.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1001
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; app unread
- Local segmentation ve sender bookkeeping
NOTES! byte’ları iki seçilmiş segmente ayrılır. Gönderim bookkeeping’i peer receipt kanıtı değildir.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; flight=6; segments prepared
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; app unread
- TES! server’a ulaştı
Receiver range ve contiguous prefix’i günceller; uygulama read’i henüz yok.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; flight=6; segments prepared
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; held=[1003,1007); app unread
- ACK 1001 client’a ulaştı
ACK sender’ın transport bilgisini günceller; business success bildirimi değildir.
- Client transport
- ESTABLISHED; UNA=1001; NXT=1007; ACK received=1001; flight=6
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; held=[1003,1007); app unread
- Local RTO kararı
Önceki NO arrival’ı görünmedi. Seçilen timer expiry yeniden gönderimi hazırlar; nedeni ölçülmez.
- Client transport
- ESTABLISHED; UNA=1001; local RTO=1000ms expired; backoff=2000ms; resend NO at 1001
- Server transport
- ESTABLISHED; RCV.NXT=1001; contiguous=empty; held=[1003,1007); app unread
- NO server’a ulaştı
Receiver range ve contiguous prefix’i günceller; uygulama read’i henüz yok.
- Client transport
- ESTABLISHED; UNA=1001; local RTO=1000ms expired; backoff=2000ms; resend NO at 1001
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; held=empty; app unread
- ACK 1007 client’a ulaştı
ACK sender’ın transport bilgisini günceller; business success bildirimi değildir.
- Client transport
- ESTABLISHED; UNA=1007; NXT=1007; ACK received=1007; flight=0
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; held=empty; app unread
- Application local read
Application byte’ları local olarak tüketir; bu yeni network transfer veya kalıcı kayıt değildir.
- Client transport
- ESTABLISHED; UNA=1007; NXT=1007; ACK received=1007; flight=0
- Server transport
- ESTABLISHED; RCV.NXT=1007; contiguous=NOTES!; app read=NOTES!; commit unmodeled
Window credit
- Zero window biliniyor
Unscaled rwnd=0; cwnd=4; flight=0. Normal yeni data bütçesi sıfır.
- Client transport
- known rwnd=0; cwnd=4; budget=0
- Server transport
- advertised rwnd=0; app buffer occupied
- Local new-data gate
Yeni data gönderimi durur; connection kapanmaz. Probe algoritması bu dalda yok.
- Client transport
- new data held; known rwnd=0; budget=0
- Server transport
- advertised rwnd=0; app buffer occupied
- Receiver local tüketim
Seçilmiş application read buffer boşaltır; receiver yeni window=6 hazırladı, client henüz bilmiyor.
- Client transport
- new data held; known rwnd=0; budget=0
- Server transport
- local window update prepared: rwnd=6
- Window update arrival
ACK/window bilgisi sender’a ulaştı. min(6,4)−0=4 yeni-data bütçesi; otomatik data arrival çizilmez.
- Client transport
- known rwnd=6; cwnd=4; flight=0; budget=4
- Server transport
- local window update prepared: rwnd=6
ROLLER · STATE · VERİ AKIŞI
Sequence sayısı byte konumudur
Handshake sonrası client stream’i 1001’den başlıyor. ASCII NOTES! altı byte’tır; ilk segment SEQ=1001 ile NO taşır, sonraki segment SEQ=1003 ile TES! taşır. Aralıklar [1001,1003) ve [1003,1007)’dir. ACK=1007, 1007 dahil değil, ondan önceki bütün contiguous byte’ların alındığını bildirir.
Sequence/ACK her yön için ayrı ilerler; ACK alanı karşı yönün sonraki beklenen konumudur. TCP’nin gerçek sequence alanı 32-bit ve hesabı modulo 2^32’dir. Bu küçük örnek wraparound sınırını geçmez. Byte sayısını UTF-8 karakter sayısıyla karıştırmamak için özellikle ASCII veri seçtik.
Segmentation, application message’i yeniden tanımlamaz
TCP byte stream’i IP datagram’larında taşınan segmentlere böler; receiver sequence aralıklarından stream’i kurar. Segment boyutu MSS, path MTU, buffer ve implementation kararlarıyla değişebilir. Artifact’in iki/dört byte’lık segmentleri hesap kolaylığı içindir; gerçek internet MSS’i veya browser packetization sonucu değildir.
TES! önce gelirse receiver seçilmiş receive-window içinde onu buffer’da tutar; NO gelmeden contiguous prefix yoktur ve ACK 1001’de kalır. NO sonra geldiğinde prefix NOTES! olur ve ACK 1007’ye ilerler. Bu model out-of-order buffering seçer; bütün stack’lerin aynı buffer policy veya ACK timing kullanacağını iddia etmez.
Retransmission yeni byte konumu üretmez
Sender henüz acknowledge edilmemiş byte’ları takip eder. Seçilmiş dalda NO arrival’ı görünmez, TES! görülür ve ACK ilerlemez. Local RTO expiry ile en eski unacknowledged aralık [1001,1003) yeniden gönderilir. Aynı NO aynı sequence konumlarını kullanır; yeni bir application message veya ek iki stream byte’ı yaratmaz.
RFC 6298 modelinde RTO, RTT tahmini ve varyasyonuyla ilişkilidir; timeout sonrası backoff uygulanır. Burada seçilen 1000 ms’den 2000 ms’ye geçiş bir aritmetik örnektir, OS default’u değildir. Eksik ACK ya da retransmission, data kaybını tek başına kanıtlamaz: gecikme, reordering veya ACK kaybı da sender’ın bilgisini etkileyebilir.
Fast recovery ile timer aynı tetikleyici değildir
RFC 5681’in temel fast retransmit profili, koşulları karşılayan üç duplicate ACK’i timer dolmadan kayıp işareti olarak kullanır. Tek bir aynı ACK’i bu eşikle eşitleme; window değişimi gibi ayrıntılar duplicate tanımını etkiler. SACK ve daha yeni loss recovery mekanizmaları başka bilgi kullanabilir; sahne bunları çalıştırmaz.
ACK timing de her segment başına anında bir ACK olmak zorunda değildir; delayed ACK mümkündür. Örnekte gösterilen ACK arrival’ları hesap anlaşılır olsun diye seçilmiştir. Bir trace yorumunda “bu stack kesin Reno kullanıyor” veya “timer şu millisecond” sonucu için ayrı implementation kanıtı gerekir.
Flow control receiver’ı, congestion control yolu gözetir
rwnd receiver’ın kabul edebileceği receive-window kapsamını; cwnd sender’ın congestion nedeniyle izin verdiği outstanding veri sınırını anlatır. Basit, unscaled snapshot’ta yeni data bütçesi max(0,min(rwnd,cwnd)−flightBytes)’tır. rwnd=6, cwnd=8, flight=2 ise 4; rwnd=16, cwnd=4, flight=2 ise 2 byte kalır.
rwnd=0, application buffer baskısını gösterebilir; connection’ın kapandığı anlamına gelmez. Normal yeni-data dalı durur, zero-window probing ayrı mekanizmadır. Slow start ve congestion avoidance cwnd’yi feedback ile değiştirir; loss/ECN sinyalleri hız kararını etkiler. Bu ders kavram ayrımı ve seçilmiş bütçeyi öğretir; bütün congestion algoritmalarını veya pacing’i tek kurala indirgemez.
Transport receipt ile application read ayrı olaydır
Receiver bütün byte’ları TCP buffer’ına almışken uygulama henüz read etmemiş olabilir. ACK 1007 bu farkı kapatmaz. Scene’in son local adımı uygulamanın NOTES! byte’larını tüketmesini gösterir; network reply veya database commit değildir.
Başarı için hangi kanıtı istediğini önce seç: contiguous transport byte’ları, application framing tamamlanması, handler sonucu veya kalıcı kayıt farklı olaylardır. Transport retransmission ile uygulamanın bir işi yeniden denemesi aynı retry kapsamı değildir.
2. Red · Güven ve etki
Hareket olmadan bütün senaryoları oku
Prefix gap
- Transport bilgi türü seçildi
İlk gelen segment TES! byte’larını seq 1003’ten başlayarak taşır. Receiver bu aralığı tutabilir, fakat daha önceki NO byte’ları eksiktir. Büyük SEQ görmek aradaki gap’i kapatmaz.
- Transport evidence
- held[1003,1007] / gap1001
- Prefix / budget gate
- Acceptance gate yok
- Business acceptance
- Business sonucu yok
- Yanlış completion gate’i durdu
rcvNxt=1001, ack=1001 ve contiguous boş kalır. Application prefix tamamlandı sonucu gap kapanmadan verilmez.
- Transport evidence
- held[1003,1007] / gap1001
- Prefix / budget gate
- ACK=1001 / prefix empty
- Business acceptance
- Business sonucu yok
- Yeni bilgi ayrı koşulda gelir
NO segmenti seq 1001’den başlayan iki byte’ı getirir ve gap’i kapatır. Tutulan TES! ile birleştirildiğinde contiguous prefix NOTES! olur; sonraki beklenen değer ve ACK 1007’ye ilerler. Arrival sırası ile byte sırası ayrıdır.
- Transport evidence
- Prefix NOTES! / ACK1007
- Prefix / budget gate
- ACK=1001 / prefix empty
- Business acceptance
- Business sonucu yok
- ACK application commit değildir
ackEvidence allThrough1006ReceivedAtTransport=true, applicationReadOrCommitProven=false verir. Transport bytes ile application read veya persistence commit ayrı kabul aşamalarıdır.
- Transport evidence
- Prefix NOTES! / ACK1007
- Prefix / budget gate
- ACK=1001 / prefix empty
- Business acceptance
- Transport received / commit unknown
- RTO bir root cause seçmez
seçilmiş RTO expiry sender’ın ACK alamama durumudur; missingArrivalCause=not-determined kalır. 1000→2000 ms teaching values OS default veya gerçek measured timeout değildir.
- Transport evidence
- Prefix NOTES! / ACK1007
- Prefix / budget gate
- Timer expired / cause unknown
- Business acceptance
- Transport received / commit unknown
- Sınırlı conclusion korundu
Gap closure ordered prefix’i destekler; retransmitted NO aynı sequence’i kullanır ve byte stream’i çoğaltmaz. Business success yine ayrı evidence ister.
- Transport evidence
- Prefix NOTES! / ACK1007
- Prefix / budget gate
- Timer expired / cause unknown
- Business acceptance
- PASS: contiguous prefix / app unknown
Send budget
- Transport bilgi türü seçildi
Congestion-limited örnekte receiver window 16, congestion window 4 byte’tır. İki byte zaten flight’tadır. Receiver’ın boş alanı geniş olsa bile sender bütçesi daha dar congestion koşuluyla sınırlanabilir.
- Transport evidence
- rwnd16 / cwnd4 / flight2
- Prefix / budget gate
- Acceptance gate yok
- Business acceptance
- Business sonucu yok
- Yanlış completion gate’i durdu
min(rwnd, cwnd)−flightBytes hesabı seçilmiş snapshot için 2 byte verir. rwnd=16’dan 14 byte sonucu çıkarılmaz; full sending scheduler ayrıca kapsam dışıdır.
- Transport evidence
- rwnd16 / cwnd4 / flight2
- Prefix / budget gate
- Budget=2
- Business acceptance
- Business sonucu yok
- Yeni bilgi ayrı koşulda gelir
Ayrı zero-window örneğinde rwnd 0 olduğu için yeni data bütçesi sıfırdır. Receiver’ın bildirdiği window update sender’a varınca rwnd 6, cwnd 4 ve flight 0 için bütçe 4 byte olur. Bu, önceki congestion-limited snapshot’ın devamı değildir.
- Transport evidence
- Zero=0 / update=4
- Prefix / budget gate
- Budget=2
- Business acceptance
- Business sonucu yok
- Gönderme izni receipt değildir
min(rwnd, cwnd) − flight hesabı sender’ın kaç yeni byte gönderebileceğini sınırlar. Bütçenin 2 veya 4 byte olması, bu byte’ların gönderildiğini, ACK alındığını ya da application’ın okuduğunu göstermez.
- Transport evidence
- Zero=0 / update=4
- Prefix / budget gate
- Budget=2
- Business acceptance
- Bütçe ≠ gönderim veya receipt
- Window sınırlarının sahipleri ayrıldı
rwnd receiver’ın ilan ettiği kapasiteyi, cwnd sender’ın congestion sınırını gösterir. Congestion-limited örnekte flight 2 düşüldüğünde bütçe 2 byte kalır. Bu branch bir timer expiry veya retransmission olayı içermiyor.
- Transport evidence
- Zero=0 / update=4
- Prefix / budget gate
- Congestion-limited bütçe: 2 byte
- Business acceptance
- Bütçe ≠ gönderim veya receipt
- Sınırlı conclusion korundu
Receiver/congestion bütçeleri ayrı tutulur; zero-window application maliciousness kanıtı değildir. Real pacing, windowscaling veya service health sonucu eklenmez.
- Transport evidence
- Zero=0 / update=4
- Prefix / budget gate
- Congestion-limited bütçe: 2 byte
- Business acceptance
- Bütçe hesaplandı / teslim bilinmiyor
VARSAYIM · SINIR · KONTROL
Kırılan varsayım: en büyük SEQ bütün önceki veri demektir
Son segmenti görmek aradaki boşluğu kapatmaz. TES! önce geldiğinde prefix boş ve ACK 1001’dir. Sequence gap bilgisini kaybeden yorum yanlış teslim kanıtı üretebilir.
Kontrol received range ile contiguous prefix’i ayrı tutmaktır. Geç gelen byte’lar ancak gap kapanınca ordered stream’e katılır.
Kırılan varsayım: timeout hatanın yerini söyler
RTO sender’ın yeni ACK bilgisi alamadığını gösterir; karşı application veya belirli router hakkında tek başına teşhis vermez. Gerekli koşul timer gözlemini neden kanıtı gibi kullanmaktır.
Kontrol data arrival, ACK arrival ve sender timer olaylarını ayırmaktır. Artifact kayıp nedenini bilinmiyor bırakır.
Kırılan varsayım: yüksek rwnd her zaman hızlı gönderimdir
Receiver boş yer bildirse de cwnd veya başka sending koşulu daha sıkı olabilir. rwnd ile cwnd’yi aynı değişken gibi tutmak path baskısıyla receiver baskısını karıştırır.
Kontrol ayrı ölçüler, byte birimleri ve outstanding miktardır. TCP ACK’i business success saymak da bu transport sınırını aşar.
3. Blue · Güvenli geliştirme ve savunma
Hareket olmadan bütün senaryoları oku
Ordered ledger
- Exclusive ends elle hesaplandı
NO segmenti seq 1001’den iki byte taşır ve exclusive end 1003’tür. TES! segmenti dört byte daha taşıyarak 1007’ye ulaşır. NOTES! ASCII olduğu için bu örnekte her karakter bir byte’dır; Unicode için aynı varsayım yapılmaz.
- Byte-range evidence
- [1001,1003) + [1003,1007)
- Prefix calculation
- Prefix calculation yok
- Recovery review
- Verdict yok
- İlk arrival prefix’i belirlendi
NO önce geldiğinde contiguous prefix NO olur. Receiver bir sonraki byte’ı 1003 konumunda bekler ve ACK 1003 verir. Application bu data’yı henüz tüketmemiştir; transport prefix, application read kanıtı değildir.
- Byte-range evidence
- [1001,1003) + [1003,1007)
- Prefix calculation
- Contiguous NO / ACK1003
- Recovery review
- Verdict yok
- İkinci arrival prefix’i tamamladı
TES! sırayla gelince contiguous=NOTES!, rcvNxt=1007 ve ACK 1007 olur. İki segmentin birleştirilmesi application message boundary üretmez.
- Byte-range evidence
- [1001,1003) + [1003,1007)
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Verdict yok
- Ayrı RTO örneğinde byte aralığı aynı
Şimdi ayrı retransmission örneği karşılaştırılıyor: NO, earliestUnacknowledgedSeq 1001’den aynı byte aralığını yeniden kullanır. Bu, yukarıdaki tamamlanmış receive ledger’ın ardından yeni bir resend yapıldığı anlamına gelmez; stream’e ikinci bir NO eklenmez.
- Byte-range evidence
- Retransmission [1001,1003) unchanged
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Verdict yok
- ACK arrival ile local timer ayrıldı
Bu ayrı RTO örneğinde timerEventCause, selected-local-expiry-not-measured olarak verilmiştir. Receiver’da data bulunması, ACK’in sender’a vardığını göstermez. Gerçek teşhis için sender timer kaydı ve ilgili ACK gözlem noktası gerekir; missingArrivalCause bilinmiyor.
- Byte-range evidence
- Retransmission [1001,1003) unchanged
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Separate receiver / sender knowledge
- Recovery sonucu kapsamıyla verildi
Verilen ordered ve reordered ledger’lar aynı NOTES! byte’larına ulaşır. Receive-prefix hesabının tutması, gerçek congestion algorithm’i, network loss nedenini veya business commit’i doğrulamaz.
- Byte-range evidence
- Retransmission [1001,1003) unchanged
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Byte hesabı tutarlı / kayıp nedeni bilinmiyor
Reordered ledger
- Exclusive ends elle hesaplandı
NO segmenti seq 1001’den iki byte taşır ve exclusive end 1003’tür. TES! segmenti dört byte daha taşıyarak 1007’ye ulaşır. NOTES! ASCII olduğu için bu örnekte her karakter bir byte’dır; Unicode için aynı varsayım yapılmaz.
- Byte-range evidence
- [1001,1003) + [1003,1007)
- Prefix calculation
- Prefix calculation yok
- Recovery review
- Verdict yok
- İlk arrival prefix’i belirlendi
TES! önce gelince held[1003, 1007], contiguous empty ve ACK 1001 verir. ACK en büyük görülen SEQ değil en küçük eksik konumdur.
- Byte-range evidence
- [1001,1003) + [1003,1007)
- Prefix calculation
- Held TES! / ACK1001
- Recovery review
- Verdict yok
- İkinci arrival prefix’i tamamladı
NO gap’i kapatınca heldRanges boşalır, contiguous=NOTES! ve ACK 1007 olur. Out-of-order buffering seçilmiş permitted condition’dır; her TCP implementation strategy’si değildir.
- Byte-range evidence
- [1001,1003) + [1003,1007)
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Verdict yok
- Ayrı RTO örneğinde byte aralığı aynı
Şimdi ayrı retransmission örneği karşılaştırılıyor: NO, earliestUnacknowledgedSeq 1001’den aynı byte aralığını yeniden kullanır. Bu, yukarıdaki tamamlanmış receive ledger’ın ardından yeni bir resend yapıldığı anlamına gelmez; stream’e ikinci bir NO eklenmez.
- Byte-range evidence
- Retransmission [1001,1003) unchanged
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Verdict yok
- ACK arrival ile local timer ayrıldı
Bu ayrı RTO örneğinde timerEventCause, selected-local-expiry-not-measured olarak verilmiştir. Receiver’da data bulunması, ACK’in sender’a vardığını göstermez. Gerçek teşhis için sender timer kaydı ve ilgili ACK gözlem noktası gerekir; missingArrivalCause bilinmiyor.
- Byte-range evidence
- Retransmission [1001,1003) unchanged
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Separate receiver / sender knowledge
- Recovery sonucu kapsamıyla verildi
Verilen ordered ve reordered ledger’lar aynı NOTES! byte’larına ulaşır. Receive-prefix hesabının tutması, gerçek congestion algorithm’i, network loss nedenini veya business commit’i doğrulamaz.
- Byte-range evidence
- Retransmission [1001,1003) unchanged
- Prefix calculation
- Contiguous NOTES! / ACK1007
- Recovery review
- Byte hesabı tutarlı / kayıp nedeni bilinmiyor
UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA
Byte ledger’ı elle tamamla
SEQ, payload byte uzunluğu ve exclusive end’i hesapla. Reordered dalda önce held range’i yaz, ardından en küçük eksik konumu ACK olarak belirle; en büyük görülen konumu seçme.
NO gap’i kapattığında 1007’ye kadar prefix’i yeniden kur. Aynı SEQ ile gelen retransmission’ın stream uzunluğunu artırmadığını doğrula.
İki bütçeyi birlikte değerlendir
Artifact’in receiver-limited, congestion-limited ve zero-window satırlarını hesapla. Seçilmiş window update yeni kapasiteyi sender’a ACK arrival ile taşır; receiver’ın local buffer tüketimi client bilgisini anında değiştirmez.
Bu bütçe full sending scheduler değildir. Gerçek pacing, SWS/Nagle, scaling ve congestion profile için ürün kanıtı gerektiğini koru.
Application producer da kendi buffer sınırına uymalıdır. Örneğin Node.js Writable üzerinde write false döndürdüğünde yeni chunk üretimini durdurup drain event’inden sonra sürdürmek gerekir. Bu sinyal application buffer’ına aittir; artifact’teki rwnd veya cwnd sayısıyla birebir aynı değer değildir. Yavaş consumer karşısında üretimin durması ve kapasite açılınca sürmesi birlikte doğrulanmalıdır. drain görülmesi de remote application’ın NOTES! verisini okuyup işlediğini veya kaydettiğini kanıtlamaz.
Gözlem ile iş sonucunu ayır
Ordered, reordered ve seçilmiş RTO recovery sonunda aynı NOTES! byte’larına ulaşılır; arrival sırası ve sender’ın bilgisi farklıdır. Application read’i ayrıca açıklayabilmek bu örneğin önemli sınırıdır.
Bu inert ledger gerçek network ölçümü değildir. Byte arithmetic ve state ownership üzerinden düşünmeyi sağlar; gerçek implementation davranışı ayrıca doğrulanır.
ŞİMDİ VAKAYA UYGULA
Received range, contiguous prefix ve sender budget hangi bilgiyi ayrı tutar?
NOTES! iki segmentte taşınır. TES! önce geldiğinde NO byte’ları gelmeden contiguous prefix tamamlanmaz. rwnd ve cwnd farklı gönderim sınırlarıdır; transport ACK’i application commit’ini kanıtlamaz.
Vakadaki response’u taşıyan bağlantı ile application sonucu hangi sınırlarda ayrılır? Network ve transport bilgisini body parsing veya DOM başarısı yerine kullanma.
Bağlı vaka dosyasını aç ↗ÖRNEĞİ BİRLİKTE OKUYALIM
Byte aralıkları, ACK ve send budget ledger
Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.
Ham kaydı ve alan açıklamalarını oku
{
"context": {
"protocol": "TCP",
"client": "192.0.2.10:51000",
"server": "198.51.100.200:443",
"bothStates": "ESTABLISHED",
"serverInitialRcvNxt": 1001,
"senderInitialUna": 1001,
"senderFinalNxt": 1007
},
"bytes": "NOTES!",
"encoding": "ASCII; one byte per character",
"segments": [
{
"seq": 1001,
"payload": "NO",
"payloadBytes": 2,
"exclusiveEnd": 1003
},
{
"seq": 1003,
"payload": "TES!",
"payloadBytes": 4,
"exclusiveEnd": 1007
}
],
"orderedArrivals": [
{
"segmentIndex": 0,
"rcvNxt": 1003,
"ack": 1003,
"contiguous": "NO",
"applicationConsumed": false
},
{
"segmentIndex": 1,
"rcvNxt": 1007,
"ack": 1007,
"contiguous": "NOTES!",
"applicationConsumed": false
}
],
"reorderedArrivals": [
{
"segmentIndex": 1,
"rcvNxt": 1001,
"ack": 1001,
"heldRanges": [
[
1003,
1007
]
],
"contiguous": ""
},
{
"segmentIndex": 0,
"rcvNxt": 1007,
"ack": 1007,
"heldRanges": [],
"contiguous": "NOTES!"
}
],
"retransmission": {
"profile": "selected RFC6298 RTO branch; no SACK/timestamp or modern loss algorithm execution",
"earliestUnacknowledgedSeq": 1001,
"retransmittedPayload": "NO",
"sequencePreserved": true,
"selectedRtoMsBefore": 1000,
"selectedRtoMsAfter": 2000,
"elapsedSincePreviousTransmissionMs": 1000,
"timerEventCause": "selected-local-expiry-not-measured",
"missingArrivalCause": "not-determined"
},
"sendBudgetCases": [
{
"label": "receiver-limited",
"rwnd": 6,
"cwnd": 8,
"flightBytes": 2,
"newDataBudget": 4
},
{
"label": "congestion-limited",
"rwnd": 16,
"cwnd": 4,
"flightBytes": 2,
"newDataBudget": 2
},
{
"label": "zero-window",
"rwnd": 0,
"cwnd": 4,
"flightBytes": 0,
"newDataBudget": 0
},
{
"label": "selected-window-update",
"rwnd": 6,
"cwnd": 4,
"flightBytes": 0,
"newDataBudget": 4
}
],
"windowUnits": "unscaled bytes; selected simple snapshot, no pacing/SWS/Nagle/ACK clock implementation",
"ackEvidence": {
"allThrough1006ReceivedAtTransport": true,
"applicationReadOrCommitProven": false,
"separateApplicationRead": "local illustrative step, no business persistence claim"
},
"limits": {
"moduloSequenceArithmetic": "not-crossed; no wraparound test",
"outOfOrderBuffering": "selected permitted buffering within receive window",
"checksumMssPmtuOffload": "omitted",
"rtoAndCongestionValues": "teaching values, not OS defaults"
}
}- segments
- ASCII payload için half-open sequence aralıkları.
- reorderedArrivals
- Buffer’da görülen aralık ile contiguous prefix ayrımı.
- retransmission
- Aynı konumdaki byte’lar ve seçilmiş RTO backoff.
- sendBudgetCases
- Unscaled byte snapshot’ında rwnd/cwnd/flight farkı.
- ackEvidence
- TCP receipt uygulama read/commit kanıtı değildir.
Tam TCP packet, socket veya timer implementation değildir. SACK, wraparound, checksums, offload ve gerçek congestion profile yürütülmez.
İki yanlış kanı
ACK en büyük görülen SEQ’den bir fazlasıdır.
Cumulative ACK ilk eksik konumu bildirir. Daha sonraki aralık buffer’da olsa da gap kapanmadan ACK ilerlemeyebilir.
rwnd sıfırsa TCP connection kapanmıştır.
Normal yeni-data budget sıfır olabilir; connection state ve zero-window probing ayrı mekanizmalardır.
SIRA SENDE
Bu hikâyeyi sen çöz.
Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.
1003–1007 aralığı, 1001–1003 aralığından önce geliyor. Cumulative ACK hangi değerde kalır?
- 1001. Gap kapanmadan 1007’ye ilerlemez.
- 1007. Görülen en yüksek segment end değeri ACK olur.
Gerekçeli cevabı oku
1001. Gap kapanmadan 1007’ye ilerlemez. — Daha ilerideki byte’lar tutulabilir. Cumulative ACK kesintisiz alınan prefix’ten sonraki beklenen byte’ı gösterir.
rwnd=16, cwnd=4 ve flight=2 için yeni data budget kaç byte?
Dersten seçilen artifact alanları; öğretim örneği
- sendBudgetCases[1]
- {"label":"congestion-limited","rwnd":16,"cwnd":4,"flightBytes":2,"newDataBudget":2}
- 2 byte. Congestion window sınırlandırır.
- 14 byte. Yalnız rwnd-flight kullanılır.
Gerekçeli cevabı oku
2 byte. Congestion window sınırlandırır. — Bu basit hesap min(16, 4)-2=2 verir. Receiver’ın 16 byte izni cwnd sınırını kaldırmaz.
ACK 1007 alındı. Application’ın NOTES! verisini okuyup kalıcı yazdığı kesin mi? RTO retransmit ile ilişkilendirerek açıkla.
Gerekçeli cevabı oku
ACK 1007 bu modelde 1006’ya kadar byte’ların kesintisiz alındığını belirtir. Application read veya commit kanıtı değildir. RTO branch’i en erken unacknowledged byte’ları aynı sequence ile yeniden gönderir. Timer expiry tek başına kaybın nerede olduğunu söylemez.
□ ACK’i application commit saymadım.
□ Retransmit sequence’ini korudum; loss nedenini bilinmeyen bıraktım.
Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç
Kaynaklar ve kapsam
- RFC 9293 — Transmission Control Protocol (TCP)3.1 Header Format; 3.4 Sequence Numbers · 3.3.2 State Machine Overview; 3.5.3 Reset Processing; 3.6 Closing a Connection; 3.6.1 Half-Closed Connections · 3.7 Segmentation; 3.8.1 Retransmission Timeout; 3.8.6 Managing the Window
- RFC 5681 — TCP Congestion Control2 Definitions; 3.1 Slow Start and Congestion Avoidance · 3.2 Fast Retransmit/Fast Recovery
- RFC 6298 — Computing TCP’s Retransmission Timer2 The Basic Algorithm; 3 Taking RTT Samples · 5 Managing the RTO Timer
- RFC 5737 — IPv4 Address Blocks Reserved for Documentation3 Documentation Address Blocks
- Node.js Stream — Writable backpressureEvent: 'drain' · writable.write(chunk[, encoding][, callback])