SORU
21 EYLÜL 2010, Salı


O'in gereken zaman TCP seçeneği SO_LİNGER (sıfır) -

Bu seçenek resmi anlamını anladım. Şimdi hallediyorum bazı eski kod, seçeneği kullanılır. Müşteri bağlantıda taraftan bir taraftan yakın FİN yanıt olarak İLK şikayet ediyor.

Zaman kullanılması gerektiğini anlamıyorum beri güvenle kaldırabilir miyim emin değilim.

Bu seçenek gerekli olduğunda bir örnek verebilir misiniz?

CEVAP
26 EKİM 2012, Cuma


Benim önerim, lütfen son bölümünü okuyun:Zaman aşımı 0 ile SO_LİNGER“”.

Biz gelmeden önce biraz hakkında anlatım:

  • Normal TCP sonlandırma
  • TIME_WAIT
  • FIN, ACK ve RST

Normal TCP sonlandırma

Normal TCP sonlandırma sırası böyle (basit) görünüyor:

İki eş var: A ve B

  1. *4 aramalar*
    • FIN B gönderir
    • FIN_WAIT_1 duruma geçer
  2. B FINalır
    • Bir B ACK gönderir
    • B CLOSE_WAIT duruma geçer
  3. ACKalır
    • FIN_WAIT_2 duruma geçer
  4. B close()aramalar
    • Bir B FIN gönderir
    • B LAST_ACK duruma geçer
  5. FINalır
    • Bir B ACK gönderir
    • TIME_WAIT duruma geçer
  6. B ACKalır
    • B CLOSED gider devlet – yani soket tablodan kaldırılır

TIME_WAIT

Fesih – yani close() aradığı ilk başlatan yani peer – TIME_WAIT devlet içinde sona erecek.

TIME_WAIT devlet bizim dostumuz sebebini anlamak için, lütfen bölüm 2.7 oku "UNİX Ağ Programlama" Stevens ve ark (sayfa 43) üçüncü baskı.

Ancak, eninde sonunda kabul edilen yeni bağlantıları engelle gibi bir sunucu üzerinde TIME_WAIT devlet içinde yuva sürü ile ilgili bir sorun olabilir.

Bu soruna geçici bir çözüm bulmak için, birçok close() çağırmadan önce zaman aşımı 0 ile SO_LİNGER yuva seçeneği ayarlamak için düşündüren gördüm. Ancak, bu TCP bağlantısı bir hata ile sona erdirilmiş olması neden kötü bir çözümdür.

Bunun yerine, uygulama protokolü, bağlantı sonlandırma, böylece tasarım her zaman istemci tarafından başlatıldı. Eğer müşteri her zaman tüm diğer veri okuma varsa ne zaman bilen varsa sonlandırma işlemini başlatın. Örnek olarak, bir tarayıcı tüm veri okuma ve yakın başlatabilir Content-Length HTTP başlığından bilir. (HTTP 1.1 olası bir yeniden kullanım için bir süre açık tutun, ve sonra kapatın olacağını biliyorum.)

Eğer sunucu bağlantıyı gerekiyorsa, sunucu istemci close() aramak ister uygulama protokolü tasarımı.

Kullanmak için zaman aşımı 0 ile SO_LİNGER

Yine, "UNIX Ağ Programlama" üçüncü 202-203, zaman aşımı 0 ile SO_LINGER ayarı close() normal sonlandırma neden aramadan önce edition sayfa sırası . göre ^em>değilbaşlatılacaktır.

Bunun yerine, eş bu seçeneği ayarlamak ve close() çağıran bir hata durumu gösteren RST (bağlantı sıfırlandı) gönderir ve bu diğer ucunda algılanan olacak. Genellikle hataları gibi göreceksiniz "Bağlantı eş tarafından sıfırlandı".

Bu nedenle, normal durumda denilen zaman aşımı 0 ile SO_LINGER close() – bundan çağırmadan önce ayarlamak için gerçekten kötü bir fikirdirabes yakın– server bir uygulama.

Ancak, bazı durum emri neyse yapıyor:

  • Eğer sunucu uygulaması, bir edepsizlik, bir istemci (zaman aşımına uğradı, geçersiz veri döndürür, vb.) abes bir yakın anlam CLOSE_WAIT sıkışmış önlemek için veya TIME_WAIT bu durumda sona yapar.
  • Eğer gerekir yeniden sunucu uygulaması, şu an sahip olduğu binlerce istemci bağlantıları şöyle düşünebilirsin ayarı bu yuva seçeneği önlemek için binlerce sunucu soketi TIME_WAIT (zaman arama close() sunucu son olarak bu olabilir önlemek sunucudan almak kullanılabilir bağlantı noktaları için yeni istemci bağlantılarını olduktan sonra yeniden.
  • Sayfa 202 özellikle söylüyor: "Bu özellik, abes bir yakın göndermek için kullanma izni olan bazı durumlar vardır. Bir örnektir bir RS-232 terminal server, hangi olabilir sonsuza kadar CLOSE_WAIT Çalışırken veri iletmek için bir sıkışmış terminal port, ama düzgün sıfırlama sıkışmış port eğer var RST atmak için bekleyen veri."

Sorunuza çok güzel bir cevap verir inandığım this uzun bir makale var tavsiye ederim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • FullMag

    FullMag

    15 ŞUBAT 2007
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012