TCP tarafından onaylanması verilerin teslim edildiğini garanti etmez


11

RFC 793'te TCP segmentlerinin onaylanması hakkında bir bölüm vardır:

TCP veri içeren bir segment ilettiğinde, yeniden iletim kuyruğuna bir kopya koyar ve bir zamanlayıcı başlatır; söz konusu verilerin onayı alındığında, segment kuyruktan silinir. Zamanlayıcı tükenmeden onay alınmazsa, segment yeniden iletilir.

TCP tarafından yapılan bir onay, verilerin son kullanıcıya teslim edildiğini garanti etmez , ancak yalnızca alıcı TCP'nin bunu yapma sorumluluğunu üstlendiğini garanti etmez .

Şimdi, bu ilginç. NOC'mizde, ağımız ve harici istemci ağımız arasındaki bağlantı sorunlarını sık sık gideririz ve bir güvenlik duvarındaki trafiği her kokladığımızda ve her iki yönde gönderilen ve alınan SYN ve ACK bitlerini gördüğümüzde, bağlantının kurulduğunu ve sorunun hiçbir şeyi olmadığını varsayarız. ağ ile yapmak.

Ama şimdi bu RFC beni düşündürdü - TCP bağlantısı kurulmuş ancak kullanıcılar hala bağlantı sorunları yaşıyorsa (Wireshark'ı ayarlamadan) başka ne kontrol etmeliyim?


5
Bu cümlenin anlamı, cümlenin gerçek İngilizce anlamıdır: ağ sürücüsünün verileri alması (ve alımı kabul etmesi), son kullanıcının verileri almasını garanti etmez. Örneğin, web sunucusunda bir hata olabilir. Kapanış sorunuzla ilgili olarak: son kullanıcının verileri alıp almadığını anlamanın tek yolu, onları aramak ve sormaktır.
Jörg W Mittag

Yanıtlar:


24

RFC'nin bu kısmı, sorumluluğu işletim sistemine veya sürecin bir sonraki aşaması ne olursa olsun, sorumluluğu üstlenmekle ilgilidir. Temel olarak katmanların ayrılması ile ilgilidir.

TCP tarafından yapılan bir onay, verilerin son kullanıcıya teslim edildiğini garanti etmez, ancak yalnızca alıcı TCP'nin bunu yapma sorumluluğunu üstlendiğini garanti etmez.

Her zaman bu şekilde düşündüm:

  • İşletim sistemi ACK gönderme ile istemci işlemine ulaşan veriler arasında çökebilir ("istemci" burada "ağ istemcisi" değil işletim sisteminin istemcisi anlamına gelir)
  • İstemci işlemi buggy veya çökme olabilir veya gelen verileriyle başa çıkmak için beklenenden çok daha yavaş olabilir veya gerçekten sadece açık olmayan koşullar altında okuyabilir
  • İstemci verileri belki de bir disk dosyasına gönderiyorsa, dosya henüz yazılmamış veya silinmemiş olabilir
  • İstemci verileri TCP ile gönderirse, uzak taraftaki TCP verileri iletmemiş, bir ACK almamış olabilir veya uzaktaki işlem başarıyla verileri tüketmiş olabilir

Tek söylediği bu, daha yüksek bir katman onayı değil , bir katman 3 onayı ("Baytlarınızı duyuyorum") . Örneğin TCP ACK arasındaki farkı düşünün , bir sonraki atlama posta ağ geçidinden sonraki SMTP bir mesaj, bir mesaj makbuz mesajı (örneğin RFC 3798 uyarınca ), mesajla açılan bir izleme pikseli, bir PA'dan teşekkür notu, ve "Evet, ben yaparım."250 OK

Bir başka somut örnek yazıcı olabilir:

  • Sonunun ne içerdiğini bilmeden önce verileri ACK yapmalıdır (TCP gönderme penceresinden daha büyük bir kitaplıkla başlayan bir Postscript dosyası olabilir)
  • Bir durum sorgusu içerebilir ("çalıştığınız kağıt var mı?").
  • Bir yazdırma komutu içerebilir ("lütfen bunu yazdırın"; kağıt bittiğinde başarısız olabilir)

Kullanıcılar ACK'ları görüyor ve gönderiyor, ancak yine de bağlantı sorunları yaşıyorsa, ağ ile ilgili herhangi bir şeyden daha fazla tıkanıklık, işletim sistemi veya uygulama sorunları olması büyük olasılıkla daha büyüktür.

Teşhis etmek için özellikle ACK'lardan ziyade yeniden iletim aramanızı öneririm.


Başka bir madde işareti öğesi: istemci işlemi iyi çalışıyor olsa bile, henüz verileri okumamış olabilir.
Barmar

1
İstemci işlemi (eğer tembel ya da sapkın hissediyorsa) hiçbir zaman recv()soketi çağıramaz , bu durumda alınan veriler süresiz olarak TCP soketinin alma arabelleğinde kalır.
Jeremy Friesner

Her ikisi de teşekkürler, istemci sürecinin yavaş, buggy, kararsız olabileceğini önermek için güncelledi.
jonathanjo

Uygulamanın girişinizi işlediğinden emin olmak için ACK'ya güvenemezsiniz, bir uygulama katmanı ACK veya Kontrol uygulamalısınız. Bunu başka bir bağlama koymak. İstemci tarafında IP Yığını olan TSN kullanan endüstriyel kontrol ağları için, TCP ACK, işlem değişkenlerinin kilitlendiğini garanti etmek için yeterli değildir. Yani, sistemi güvenli veya servis verilebilir bir duruma getirmek için TCP ACK'ya güvenemezsiniz, bir uygulama katmanı hizmetinden, elinizi makineye yapıştırmanın güvenli olduğunu onaylamanız gerekir.
crasic

10

RFC açısından, "son kullanıcı" uygulama. Uygulamanın verileri almasının garantisi yoktur, sadece TCP işleminin aldığını garanti eder.

NOC bakış açınızdan, ağ çalışıyor ve veriler son ana bilgisayara ulaştı. Muhtemelen, önemsediğiniz budur.


0

Bu şekilde görebiliyordunuz.

Siz M.Smith'siniz ve M.Toto'ya bir mektup göndermek istiyorsunuz (kişiler başvuru katmanıdır).

Mektubu göndermek için, mektubu M.Toto yerel postane B'ye gönderecek olan yerel postaneye A'ya gidersiniz (postaneler TCP katmanıdır).

A, postane A ve postane B - B arasında her şey yolunda gidebilir. Postane A'ya bir ACK gönderecektir. Postane B ve M.Toto arasında her şey olabilir.

Temel olarak RFC bunu söylüyor.

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.