bir TCP paketi kısmen onaylanırsa, yeniden iletim mekanizması nasıl tepki verecektir?


12

bir tcp istemcisi sıra numarası 10000 ile 20000 arasında olan bir paketi bir tcp sunucusuna gönderirse. tcp, seq_ack 20001 ile bir ACK ile yanıt verecektir.

TCP paketini istemciden kesersem ve paketi biri 10000'den 15000'e kadar diğeri 15001'den 20000'e kadar olan 2 tcp segmentine böldüm. Ve sonra bu 2 TCP segmenti TCP sunucusuna gönderilir. İkinci segmentin yolda kaybolduğunu varsayın. TCP sunucusu bir ACK'ya seq_ack 15001 ile yanıt verecektir.

Şimdi TCP istemcisi, seq 10000 ila 20000 ile ayrılmaz bir paket gönderdiğinden, ancak müşterinin bakış açısından 15001 ile bir ACK alır, bu garip. Nasıl tepki verecek? Teoride, müşteri baytları seq 15001'den 20000'e yeniden iletmelidir, yani istemci seq 15001'den yeni paketler iletecektir. Ama TCP yığın uygulamasında, teoride olduğu gibi uygulama nasıl?

TCP gönderme arabelleğinde, bir tcp segmenti gönderildiğinde, segment ACK'ya kadar hala orada kalır. ACK geldiğinde, segment için bu baytlar tampondan temizlenir. Gönderme arabelleğinde bir işaretçi vardır, bir ACK geldiğinde işaretçi ack_seq değerinin karşılık geldiği konumu gösterir. Ack_seq öğesinin altındaki baytlar temizlenir. Bu şekilde, tüm segmentin yeniden iletilmesine gerek yok mu?

Yanıtlar:


8

Buna seçici onay denir ve zaten RFC 2018'de tanımlanan TCP spesifikasyonuna dahil edilmiştir . Bu, müşterinin gerçekten sadece 15001 ila 20000 baytını yeniden göndermesine izin verir (çünkü bunları söylediğiniz gibi ayırırsanız farklı paketler / segmentlerde bulunurlar ), ancak daha ilginç bir şekilde, sipariş dışı onaylara bile izin verir.

RFC 2018'den:

Bir SACK seçeneği içeren bir ACK alırken, veri gönderen seçici referansı ileride başvurmak üzere kaydetmelidir. Veri göndericisinin, sıra numarası sırasına göre iletilmiş ancak henüz onaylanmamış segmentleri içeren bir yeniden iletim kuyruğu olduğu varsayılır.

Destekleyici SACKolduğu değil , TCP şartname gereği. İstemci veya sunucu seçici onayı desteklemiyorsa, 10000 ila 20000 arasındaki tüm baytların yeniden iletilmesi gerekir.

TCP yığını uygulamasında, teoride olduğu gibi mi?

Genellikle SACK olduğu performans, verimlilik gibi desteklenir ve gecikme kazançlar önemlidir - özellikle internet gibi bir ağ içinde.

Ancak, paketleri, belirttiğiniz gibi manuel olarak değiştirseniz bile, bu varsayımlar doğru olmalıdır. Gereğince RFC 793 , en azından, tüm veri penceresi yeniden iletilmek zorunda kalacak, ancak alıcısı yok alınan veriler en azından olduğunu biliyoruz geçerlidir . Uygulama ayrıntıları için Bölüm 3.3 - RFC 793'ten Sıra Numaraları .

Seçmeli onay desteği olan ve olmayan tüm sürecin ana hatları için bu makaleye bakın (bazı çok yararlı diyagramları içerir).


TCP benim için biraz garip, çünkü TCP akış tabanlı, bayt yönelimli bir protokoldür. Neden tüm segmenti yeniden iletmeli? Bana öyle geliyor ki, SAKC'siz TCP segment odaklı akış protokolüdür, ancak Sack'li TCP gerçek byte odaklıdır. Bence RFC bu konu üzerinde özellikle durmuyor.
misteryes

TCP yığının gönderme arabelleğini nasıl yönettiğini, güncel soruya yazdığımla aynı mı?
misteryes

@misteryes bu makale süreci özetliyor (bazı harika diyagramlarla da!).
Atılım

Önerdiğiniz bağlantıda, yazarın sorunu hala gerçek byte odaklı bir şekilde değil, segment odaklı bir şekilde tartıştığı görülüyor. Öyle değil mi?
misteryes

1
Bu soruyu göndermeden önce SACK'i biliyordum. En başta SACK'in bu soru ile ilgisi olduğunu düşünmüyorum. Kanımca, TCP bayt-yönelimli değil, segment-yönelimli ise, SACK de aynı olmalıdır. SACK etkin ve SACK devre dışı arasındaki fark, SACK ile TCP'nin ack_seq içinde bir dizi deliğine izin vermesidir. Ama dizi deliğinin bir segmente karşılık geldiğini düşündüm. söylemeye göre, delik bir segmentin yarısı / parçası olabilir.
misteryes

3

Segment boyutları bir bağlantının ömrü boyunca değişebilir (ve yapabilir). Neyse ki, TCP'nin daha önce tek tek paketlerin gönderdiği segment boyutunu kaydetmesine gerek yoktur. Bu nedenle, aşağıdakileri yapacaktır:

  1. Bir ACK her geldiğinde, işaretçiyi uygun şekilde ilk onaylanmamış bayta ilerletin ve şimdi gereksiz olan tüm tamponları atın.
  2. Yeniden iletim ihtiyacı ortaya çıktığında (Hızlı Yeniden İletim veya Zaman Aşımı; ilk ACK alındıktan hemen sonra DEĞİL !), Göstergeden ilk onaylanmamış bayta kadar geçerli olarak geçerli segment boyutunda yeniden gönderilir .

Her iki işlem de bu baytların başlangıçta gönderildiği segment boyutundan bağımsız olarak yapılır. Bu yüzden teori çoğu uygulama ile eşleşmelidir.

Açıklamak için biraz bilgi vereyim:

TCP bayt veya segment kullanıyor mu? TCP, uygulamaya bir bayt akışı arabirimi sunar. Ayrıca, tüm başlık alanları ve dahili değişkenler bayt cinsindendir. Bununla birlikte, bilgi iletmek için TCP teker teker bayt göndermek oldukça zahmetli olacağından, bunları bölümler halinde toplar :-). Bayt sayaçlarının her yerde kullanılması, segment boyutunun bağlantının ömrü boyunca sabit kalması gerekmemesi avantajına sahiptir:

  • Seçenekler tanıtılıyor, örneğin bir yeniden iletimde bir SACK'i piggyback etme (gerçek uygulamalar bu nadiren karşılaşırsa)
  • Yol MTU'su değişir, örneğin yol boyunca bir bağlantı daha düşük bir MTU'ya değişir veya darboğaz MTU bağlantısı kaldırılır. Bu, tüneller kurulduğunda (VPN, PPPoE) veya yönlendirme protokolü farklı bir MTU bağlantısı seçtiğinde gerçekleşir. Bu, Parçalara Ayırma ayarlı IPv4'te olur (çoğu modern TCP için geçerlidir); her zaman TCPv6'da).

BTW: SACK burada cevap değildir, çünkü alıcı (tipik olarak) sadece bayt akışındaki bir deliği algılarsa (yani bir paket kaybolduysa ancak bir paket geldiğinde) SACK kullanacaktır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.