Yanıtlar:
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.
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.
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.