Nagle'ın algoritması - Nagle's algorithm

Nagle'ın algoritması , ağ üzerinden gönderilmesi gereken paket sayısını azaltarak TCP/IP ağlarının verimliliğini artırmanın bir yoludur . John Nagle tarafından Ford Aerospace için çalışırken tanımlandı . Bu bir şekilde 1984 yılında yayınlandı açıklama isteği başlık ile (RFC) IP / TCP Internetworks Tıkanıklık Kontrolü içinde RFC  896 .

RFC, bir uygulamanın tekrar tekrar küçük parçalar halinde, genellikle yalnızca 1 bayt boyutunda veri yaydığı "küçük paket sorunu" olarak adlandırdığı şeyi açıklar . Yana TCP paketleri bir 40 byte'lık başlığının (TCP için 20 bayt, 20 bayt olan IPv4 ), yararlı bilgiler, çok büyük bir yük 1 byte için bir 41-bayt paket içine sonuçlanır. Bu durum genellikle , çoğu tuşa basmanın anında iletilen tek bir bayt veri oluşturduğu Telnet oturumlarında ortaya çıkar . Daha da kötüsü, yavaş bağlantılar üzerinden, bu tür birçok paket aynı anda geçiş halinde olabilir ve bu da potansiyel olarak tıkanıklık çökmesine yol açabilir .

Nagle'ın algoritması, bir dizi küçük giden mesajı birleştirerek ve hepsini bir kerede göndererek çalışır. Spesifik olarak, gönderenin hiçbir onay almadığı gönderilmiş bir paket olduğu sürece, gönderen, tam bir paketin çıktı değerine sahip olana kadar çıktısını arabelleğe almaya devam etmeli, böylece çıktının bir kerede gönderilmesine izin vermelidir.

algoritma

RFC, algoritmayı şu şekilde tanımlar:

Bağlantıda önceden iletilen herhangi bir veri onaylanmadan kalırsa, kullanıcıdan yeni giden veriler geldiğinde yeni TCP bölümlerinin gönderilmesini engeller.

MSS'nin maksimum segment boyutu olduğu , bu bağlantıda gönderilebilecek en büyük segment olduğu ve pencere boyutunun kabul edilmeyen verilerin şu anda kabul edilebilir penceresi olduğu durumlarda, bu sözde kodda şu şekilde yazılabilir:

if there is new data to send then
    if the window size ≥ MSS and available data is ≥ MSS then
        send complete MSS segment now
    else
        if there is unconfirmed data still in the pipe then
            enqueue data in the buffer until an acknowledge is received
        else
            send data immediately
        end if
    end if
end if

Gecikmeli ACK ile etkileşim

Bu algoritma, TCP'ye 1980'lerin başında kabaca aynı zamanda, ancak farklı bir grup tarafından tanıtılan bir özellik olan TCP gecikmeli alındı bildirimleri (gecikmeli ACK) ile kötü bir şekilde etkileşime girer. Her iki algoritma da etkinleştirildiğinde, bir TCP bağlantısına art arda iki yazma ve ardından ikinci yazmadan gelen veriler hedefe ulaşana kadar gerçekleştirilmeyecek bir okuma yapan uygulamalar, 500 milisaniyeye kadar sabit bir gecikme yaşar, " ACK gecikmesi". Her ikisinin de devre dışı bırakılması önerilir, ancak geleneksel olarak Nagle'ı devre dışı bırakmak daha kolaydır, çünkü böyle bir anahtar gerçek zamanlı uygulamalar için zaten mevcuttur.

Nagle tarafından önerilen bir çözüm, uygulama yazmalarını arabelleğe alarak ve ardından arabelleği temizleyerek algoritmanın erken paketler göndermesini önlemektir:

Kullanıcı düzeyindeki çözüm, soketlerde yazma-yazma-okuma dizilerinden kaçınmaktır. Yaz-oku-yaz-oku iyidir. Yaz-yaz-yaz tamam. Ama yaz-yaz-oku bir katildir. Bu nedenle, mümkünse, küçük yazmalarınızı TCP'ye arabelleğe alın ve hepsini bir kerede gönderin. Standart UNIX I/O paketini kullanmak ve her okumadan önce yazma işlemini temizlemek genellikle işe yarar.

Nagle, gecikmeli ACK'leri "kötü bir fikir" olarak değerlendirir, çünkü uygulama katmanı genellikle zaman penceresi içinde yanıt vermez. Tipik kullanım durumları için, "hızlı" ACK'ler birçok küçük paketin yaptığı kadar fazla ek yük oluşturmadığından, algoritması yerine "gecikmeli ACK"yi devre dışı bırakmanızı önerir.

Nagle veya gecikmeli ACK'yi devre dışı bırakma

TCP uygulamaları genellikle uygulamalara Nagle algoritmasını devre dışı bırakmak için bir arabirim sağlar. Buna genellikle TCP_NODELAYseçenek denir . Microsoft Windows'ta TcpNoDelaykayıt defteri anahtarı varsayılana karar verir. TCP_NODELAY1983'ün 4.2BSD'sindeki TCP/IP yığınından beri mevcuttur, birçok alt türü olan bir yığın.

Gecikmeli ACK'yi devre dışı bırakma arabirimi, sistemler arasında tutarlı değildir. TCP_QUICKACKBayrak 2001 (2.4.4) beri Linux üzerinde kullanılabilir ve potansiyel olarak resmi arayüz Windows üzerindedir SIO_TCP_SET_ACK_FREQUENCY. TcpAckFrequencyWindows kayıt defterinde 1 olarak ayarlamak , varsayılan olarak gecikmeli ACK'yi kapatır.

Daha büyük yazmalar üzerinde olumsuz etki

Nagle algoritması, herhangi bir boyuttaki veri yazma işlemleri için geçerlidir. Tek bir yazma işlemindeki veriler , 2 n -1 tam boyutlu TCP segmentinin ardından kısmi bir TCP segmentinin bulunduğu 2 n paketi kapsıyorsa , orijinal Nagle algoritması, ya daha fazla verinin gönderilmesini bekleyerek son paketi alıkoyacaktır. paketi doldurun) veya önceki paket için ACK (önceki tüm paketlerin ağdan ayrıldığını gösterir).

İstek verilerinin bir paketten daha büyük olabileceği ardışık düzenlenmemiş herhangi bir dur-ve-bekle istek-yanıt uygulama protokolünde, bu istekte bulunan ve yanıtlayan arasında yapay olarak birkaç yüz milisaniye gecikmeye neden olabilir. Başlangıçta bu bir sorun olarak hissedilmiyordu, çünkü herhangi bir ardışık düzenlenmemiş dur ve bekle protokolü muhtemelen ilk etapta yüksek performans elde etmek için tasarlanmamıştır, bu nedenle birkaç yüz milisaniyelik fazladan gecikme çok az fark yaratacaktır. Nagle'ın algoritmasında Minshall'ın Modifikasyonu adı verilen daha sonraki bir iyileştirme, bir mesaj gönderen ve ardından bir sonrakini göndermeden önce bir onay bekleyen dur ve bekle protokolleriyle bu sorunu çözdü ve Nagle'ın algoritmasını devre dışı bırakma teşvikini ortadan kaldırdı (bu tür protokoller yine de tasarımları nedeniyle ağ gidiş-dönüş süresi başına bir mesaj alışverişi ile sınırlı olabilir).

Genel olarak, Nagle'ın algoritması yalnızca dikkatsiz uygulamalara karşı bir savunma olduğundan, Nagle'ın algoritmasını devre dışı bırakmak, arabelleğe almaya özen gösteren dikkatli yazılmış uygulamaların çoğuna fayda sağlamayacaktır. Nagle'ın algoritmasını devre dışı bırakmak, uygulamanın ağ üzerindeki yükü artırabilecek ve uygulama performansına fayda sağlayabilecek veya etmeyebilecek daha az sayıda büyük paketler yerine ağ üzerinde aynı anda uçuş halinde olan birçok küçük pakete sahip olmasını sağlayacaktır.

Gerçek zamanlı sistemlerle etkileşimler

Gerçek zamanlı yanıtlar ve düşük gecikme süresi bekleyen uygulamalar, Nagle'ın algoritmasıyla zayıf tepki verebilir. Ağa bağlı çok oyunculu video oyunları veya uzaktan kontrol edilen bir işletim sisteminde farenin hareketi gibi uygulamalar, eylemlerin hemen gönderilmesini beklerken, algoritma kasıtlı olarak iletimi geciktirir ve gecikme pahasına bant genişliği verimliliğini artırır . Bu nedenle, düşük bant genişliğine sahip zamana duyarlı aktarımlara sahip uygulamalar tipik olarak Nagle gecikmeli ACK gecikmesini atlamak için kullanır . TCP_NODELAY

Başka bir seçenek de bunun yerine UDP kullanmaktır.

İşletim sistemleri uygulaması

Çoğu modern işletim sistemi Nagle'ın algoritmalarını uygular. AIX, Linux ve Windows'ta varsayılan olarak etkindir ve TCP_NODELAYseçenek kullanılarak soket bazında devre dışı bırakılabilir .

Referanslar

Dış bağlantılar