Paketlerin yeniden sıralanmasıyla karıştırıldı

Aug 15 2020

TCP protokolü "Seçmeli Tekrar" hakkında bir ders kitabı okuyordum:

Paketlerin gönderen ve alıcı arasındaki kanal içinde yeniden sıralanamayacağını varsaydık. Bu, genellikle gönderici ve alıcı tek bir fiziksel kabloyla bağlandığında makul bir varsayımdır. Ancak, ikisini birbirine bağlayan "kanal" bir ağ olduğunda, paket yeniden sıralama meydana gelebilir. Pratikte benimsenen yaklaşım, gönderen, sıra numarası x olan önceden gönderilen paketlerin artık ağda olmadığından "emin" oluncaya kadar bir sıra numarasının yeniden kullanılmamasını sağlamaktır. Bu, bir paketin ağda belirli bir sabit maksimum süreden daha uzun süre "yaşayamayacağı" varsayılarak yapılır.

Kafam karıştı ve aşağıda iki sorum var.

S1-Ne yapar "Kanal, esasen paketleri tamponlamak ve bu paketleri gelecekte herhangi bir noktada kendiliğinden yaymak olarak düşünülebilir." anlamına gelmek? Neden eski bir paketi arabelleğe almamız gerekiyor? Alıcının bunu görmezden gelmesi daha iyi değil mi?

S2-Pencere boyutunun 2 olduğunu ve mevcut sıra numarasının 0,1,2,3 olduğunu varsayalım. Gönderen ilk olarak paket 0, paket 1 gönderir, paket 0 bir şekilde vurulur ve gelmesi çok zaman alır, bu nedenle zaman aşımı meydana gelir, bu nedenle gönderenin paket 0'ı tekrar göndermesi gerekir, ancak bu sefer paket 0 (yeni) zamanında gelir. Daha sonra gönderen, tümü alıcı tarafından alınan paket 2, paket 3 gönderir. Ve sonra gönderici paket 0 (yeni) ve paket 1 (yeni) göndermek üzeredir, ancak eski paket 0 şimdi alıcıya ulaşır, bu nedenle alma bu paketin eski paket veya yeni paket olduğunu bilemez. Öyleyse "bir paketin ağda sabit bir maksimum süreden daha uzun süre" yaşayamayacağını varsaymak "bu sorunu nasıl çözebilir? Paket başlığının gönderildiği zamanı içerdiği anlamına mı geliyor?

Yanıtlar

2 Zac67 Aug 16 2020 at 07:31

"Kanal, esasen paketleri tamponlamak ve bu paketleri gelecekte herhangi bir noktada kendiliğinden yaymak olarak düşünülebilir." anlamına gelmek? neden eski bir paketi arabelleğe almamız gerekiyor? alıcının görmezden gelmesi daha iyi değil mi?

Bu, paket anahtarlamanın önemli bir parçası olan kuyruğa alma ve arabelleğe almanın doğasıdır - alınan paketler girişte sıraya alınır / arabelleğe alınır ve iletildikten sonra kuyruktan silinir. Tamponlama gereklidir, çünkü aksi takdirde bir paket alındığında çıkış bağlantısının her zaman serbest olması gerekir - bu, paket anahtarlamalı ağlar için, yalnızca devre anahtarlamalı olanlar için mümkün değildir.

Diyelim ki pencere boyutu 2 ve mevcut sıra numarası 0,1,2,3.

Pencere paketleri / datagramları değil baytları sayar . Ayrıca, sıra numarası yalnızca 32 bitlik alanı taştığında tekrar eder - bu yalnızca 4 GiB veriden sonra olur. Ancak bu sınır, belirsizliği önlemek için "uçuşta" 4 Gib'den fazla veri olamayacağı anlamına gelir. Olası en büyük pencere (yakın) 1 GiB olduğundan, bu bir sorun değil.

Basit, kümülatif ACK'larda, alıcının önceki bir segment hala eksik olduğunda daha sonraki segmentleri seçimli olarak ONAYlayamayacağını unutmayın. ACK, önceki tüm verilerin alındığı anlamına gelir .

Örneğin, segment boyutu 1.000 ve pencere boyutu 10.000 olan gönderici, D00-D09 datagramlarını gönderir (sıra 0-9.999). D00 ve D02-D09 alındı, ancak D01 kayboldu. Alıcı, göndericinin D0'ı pencereden dışarı taşımasını, 1.000-10.999'a ilerletmesini ve D10'u göndermesini tetikleyen 1.000'i hala ACK'lıyor (bir sonraki beklenen veri dizisi).

Bu arada alıcı bir sorun olduğuna karar verdi, bu yüzden tam da bunu işaret etmek için tekrar 1.000 ACK aldı . Gönderen, çift ACK'yı alır ve D01'i (isteksiz mod) veya D01'den (agresif mod) başlayan tüm verileri yeniden gönderir. Alıcıda zaten D10 (10.000-10.999) vardır, bu nedenle 11.000 ACK alır ve bu da gönderenin penceresini 11.000-20.999'a taşır (ve agresif mod için hala bekleyen yeniden iletimleri iptal eder).

(Süreci biraz basitleştirdim, gerçekte daha fazla paralel örtüşme ve tabii ki gönderme ve alma arasında bir gecikme var.)

DÜZENLEME: Jeff'in doğru bir şekilde işaret ettiği gibi (thx!), Seçici onaylar (SACK) için destek bugün neredeyse veriliyor. Bu seçeneği kullanarak, alıcı ayrıca 2.000-9.999'u (D02-D09'dan) hemen SACK yapabilir, böylece gönderici bunları yeniden iletmeye başlamaz. Ayrıca 11.000-20.999 daha önce de iletmeye başlayabilir.