TCP SACK ne zaman kapatılır?


28

Linux ayar paramlarına bakıyordum ve SACK'in kapalı olduğu bazı yapılandırmaları görüyorum. Bunu kimse açıklayabilir mi?

Bu yoğun bir web sunucusu için ayarlama olurdu.

Yanıtlar:


34

Temel bir TCP ACK "X'e kadar tüm baytları aldım" diyor. Seçici ACK "Bayt XY ve VZ aldım" demenizi sağlar.

Örneğin, eğer bir ev sahibi size 10.000 bayt gönderdiyse ve 3000-5000 bayt aktarılırsa, ACK "3000'e kadar her şeyi aldım" derdi. Diğer uca tekrar 3001-10000 bayt göndermek zorunda kalacaktı. SACK "1000-2999 ve 5001-10000'üm var" diyebilir ve ev sahibi 3000-5000'i gönderir.

Bu, yüksek bant genişliği, kayıplı (veya yüksek gecikmeli) bir bağlantı için harikadır. Sorun, belirli durumlarda ciddi performans sorunlarına neden olabilmesidir. Normal TCP ACK'ları, sunucunun çocuk eldivenleriyle yüksek bant genişliğine sahip, kayıplı bir bağlantı kurmasını sağlar (500 bayt gönder, bekle, 500 bayt gönder, bekle, vb.). SACK, yüksek gecikmeye uyum sağlamasına izin verir çünkü kaç paketin gerçekten kaybolduğunu bilir .

İşte kötü şeyler olabilir. Bir saldırgan sunucunuzu uzun süre büyük bir yeniden iletim kuyruğu tutmaya zorlayabilir, sonra tüm bu şeyleri tekrar tekrar işleyebilir. Bu işlemciyi sabitleyebilir, RAM yiyebilir ve olması gerekenden daha fazla bant genişliği tüketebilir. Özet olarak, hafif bir sistem daha zayıf bir sunucuya karşı bir DoS başlatabilir.

Sunucunuz sağlamsa ve büyük dosyalar sunmuyorsa, buna karşı oldukça yalıtımlısınız.

Çoğunlukla bir intranete veya diğer düşük gecikmeli kullanıcı grubuna hizmet veriyorsanız, SACK size hiçbir şey satın almaz ve güvenlik nedeniyle performans kaybı olmadan kapatılabilir.

Bant genişliği düşük bir bağlantı kullanıyorsanız (tamamen isteğe bağlı bir başparmak kuralı olarak 1 Mbps veya daha az söyleyin), SACK, bağlantınızı doyurarak normal işlemlerde sorunlara neden olabilir ve kapatılmalıdır.

Nihayetinde size kalmış. Neye hizmet ettiğinize, kime, neye göre ve SACK'in performans etkilerine karşı riskinizin derecesini tartın.

SACK ve güvenlik açığı hakkında genel bir bakış burada.


FTR: Linux 4.18'den beri SACK sıkıştırması etkin. Örneğin, kablosuz ağlarda performansı artırabilir. Ayrıca, biraz alakalı: orijinal geliştiricinin yorumu .
Hi-Angel

12

TCP SACK'in sıklıkla devre dışı bırakılmasının bir başka nedeni de, bu seçeneği doğru şekilde yerine getiremeyen şaşırtıcı miktarda ağ donanımı olmasıdır. Bunu her zaman TCP kullandığımız yüksek hızlı bir dosya aktarım ürünü ile görüyoruz. En yaygın sorun, aygıt üzerinden dahili ağlardan dışa geçiş yapan TCP paketlerinin sıra numaralarını rasgele hale getirme gibi işlemleri yapan, ancak uzaktan kumandadan gönderilebilecek TCP SACK seçeneklerini "rasgele" hale getirmeyen şeylerdir. son. Gerçek SACK değerleri bu cihazlar tarafından uygun değerlere geri çevrilmezse, uzak uç seçici ACK avantajlarını elde etmek için SACK kullanmaya çalıştığında, TCP oturumu hiçbir zaman paket kaybı karşısında tamamlanmaz.

Muhtemelen, eğer insanlar bu donanıma önleyici yazılım bakımları daha agresif bir şekilde uygulayacaklarsa, bu sorun daha az olacaktır, ancak yapma eğilimindedirler.


2
Bu RedHat KB makalesine bakın: Neden bir ADSL yönlendiricisinin arkasındaki istemci sistemden gelen TCP bağlantıları Red Hat Enterprise Linux altında zaman zaman kilitleniyor? kbase.redhat.com/faq/docs/DOC-26683
Davey

6

Bazı Cisco ASA güvenlik duvarı araçlarını kullanırken, tcp_sack = 1'in sftp / rsync / scp vb. Üzerinde 12 MB'yi aşan dosyalarda durgun veri aktarımına yol açtığını doğrulayabilirim.

HER Zaman durdu olurdu.

Hem cisco firewall kullanarak hem de centos ile donanımı değiştirerek iki farklı veri merkezinde, ana bilgisayar A ile ana bilgisayar B arasında ayrılmış 100 MBps'lik bir bağlantı üzerinden aktarıyorduk.

Tampon boyutlarını değiştirerek bu durum hafifletilebilir - örneğin, sftp arabelleğini 2048 olarak ayarlamadığım sürece 1ft dosyasını sftp aracılığıyla ana bilgisayar A'dan B ana bilgisayarına aktaramadım, ancak ana bilgisayar B'nin A dosyasını çekip çekmediğinden bağımsız olarak

Aynı dosyayı rsync ve gönder / al arabellek ayarı kullanarak yapılan deneyler, A'dan B'ye itilen 1 GB'lık bir dosyanın yaklaşık 70 MB'ında kalmamı sağladı.

Bununla birlikte, nihai cevap, ana bilgisayar A'daki tcp_sack'i devre dışı bırakmaktı. Başlangıçta, çekirdekte çekirdekte tcp_sack = 0 değerini ayarlayarak - ama nihayetinde /etc/sysctl.conf dosyasına ekledim.


1
fwiw, Cisco ASA Firewall da burada. Sorunun tek yönlü doğası rahatsız edici oldu, bunu aylardır takip ediyoruz. scp az ya da çok 'az' bir şekilde çalıştı, ancak düzenli olarak durdu ve diğer yöne zaman aşımına uğradı. Devre dışı bırakmak tcp_sack bir tedavi oldu.

@ jean-loup Ekipman değiştirmeyi önermediğinizi umarız. Son meslekte bu sorunu yaşadım ve yapılandırma değişiklikleriyle düzelttim. unix.stackexchange.com/questions/391125/…
Rui F Ribeiro
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.