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
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
veRST
Normal TCP sonlandırma
Normal TCP sonlandırma sırası böyle (basit) görünüyor:
İki eş var: A ve B
- *4 aramalar*
FIN
B gönderirFIN_WAIT_1
duruma geçer
- B
FIN
alır- Bir B
ACK
gönderir - B
CLOSE_WAIT
duruma geçer
- Bir B
ACK
alırFIN_WAIT_2
duruma geçer
- B
close()
aramalar- Bir B
FIN
gönderir - B
LAST_ACK
duruma geçer
- Bir B
FIN
alır- Bir B
ACK
gönderir TIME_WAIT
duruma geçer
- Bir B
- B
ACK
alır- B
CLOSED
gider devlet – yani soket tablodan kaldırılır
- B
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 veyaTIME_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 aramaclose()
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 varRST
atmak için bekleyen veri."
Sorunuza çok güzel bir cevap verir inandığım this uzun bir makale var tavsiye ederim.
Nasıl bir bakış ölçüleri almak mı? () ...
Null karma kodu her zaman sıfır olmalı...
(X - x) her zaman çiftler için olumlu ...
Ne zaman bir &kullan;has_many :" ...
SEÇENEĞİ (YENİDEN) her Zaman daha Hızl...