Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

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.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Ordered arrival

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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

  1. 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
  2. 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
  3. 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
  4. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

  1. 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
  2. İ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
  3. İ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
  4. 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
  5. 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
  6. 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

  1. 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
  2. İ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
  3. İ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
  4. 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
  5. 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
  6. 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?

  1. 1001. Gap kapanmadan 1007’ye ilerlemez.
  2. 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}
  1. 2 byte. Congestion window sınırlandırır.
  2. 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