TCP soketi zaman aşımı nasıl yapılır


20

Sunucu ortamımızın ağ felaket simülasyonları için, bir TCP soketini kasıtlı olarak zaman aşımına uğratmanın bir yolunu arıyoruz. Mevcut prizler için basit yollar var mı? Ayrıca, küçük C test senaryosu programı bir artı olacaktır.

TCP arabellek okuma sırasında ve ağa bağlı olmayan kaynaklardan (samba) okuma sırasında ağ arabirimlerini bırakmayı zaten denedik.

Çıkış testi sunucusu Ubuntu 12.04.4'tür.

Yanıtlar:


19

Zaman aşımına giden bir bağlantıya neden olmak için kullanabilirsiniz iptables. Devre DROPdışı bırakmak istediğiniz bağlantı noktasında bir kural etkinleştirmeniz yeterlidir. Etkin bir bağlantı varken Samaba sunucunuz için bir zaman aşımı benzetimi yapmak için, sunucuda aşağıdakileri yürütün:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

DROPHedef bir yanıtla olmayacak RSTpaket veya ICMPpaketin gönderene hata. İstemci, sunucudan paket almayı durduracak ve zaman aşımına uğrayacaktır.

iptablesYapılandırıp yapılandırmamanıza / nasıl yapılandırdığınıza bağlı olarak , kuralı INPUTkural kümesine daha yüksek eklemek isteyebilirsiniz .


Netcat (veri dinlemek / göndermek için) kullanarak bunu denedim ve sonsuza kadar bekledi ... zaman aşımı yok: / Ve veri düştü teyit edebilir. Hatta /proc/sys/net/ipv4/tcp_keepalive_timegerçekten küçük bir sayıya
dönüştüm

@ er453r ncat -vtam olarak ne ncatyaptığını görmek için ayrıntılı çıktıyı etkinleştirmeyi deneyin . Zaman aşımı için bir vanilya Ubuntu 12.04 kurulumunda 2m7.291s aldı
Creek

doğru - İlk test sırasında soketten hiçbir şey göndermiyordum. Sonunda zaman aşımlarına hakim oldum ve bunları aşağıda ayrıntılı olarak açıkladım :)
er453r

16

İlk cevap doğrudur, ancak bu zaman aşımlarının nasıl çalıştığını keşfettim, böylece onları gözlemleyebilir ve test edebilirsiniz (bağlantı noktasını engellemeyi unutmayın!).

TCP zaman aşımlarıyla ilgilenen en ilginç 4 çekirdek parametresi vardır:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Şimdi 2 senaryo var:

  1. Soket açılır ve iletmeye çalışır - o zaman (diğer taraftan yanıt yoksa), sistem tcp_retries2süreleri yeniden dener . Varsayılan emekli değeri ile 2 dakikadan uzun bir süre alır ve soket zaman aşımına uğrar.

  2. Soket açılır ve boşta kalır - daha sonra tutma sınırları ilginçtir. Boş bir soket sistemi ile tcp_keepalive_timesaniye bekler ve bundan sonra saniye tcp_keepalive_probesaralıklarla bir TCP KEEPALIVE göndermeyi dener tcp_keepalive_intvl. Ve sadece bundan sonra soket zaman aşımına uğrar.


1
Ayrıca,netstat -o
er453r
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.