Nagle算法是以他的發明人John Nagle的名字命名的,它用於自動連接許多的小緩沖器消息;這一過程(稱為nagling)通過減少必須發送包的個數來增加網絡軟件系統的效率。Nagle算法於1984年定義為福特航空和通信公司IP/TCP擁塞控制方法,這是福特經營的最早的專用TCP/IP 網絡減少擁塞控制,從那以后這一方法得到了廣泛應用。Nagle的文檔里定義了處理他所謂的小包問題的方法,這種問題指的是應用程序一次產生一字節數據, 這樣會導致網絡由於太多的包而過載(一個常見的情況是發送端的"愚蠢窗口綜合症")。從鍵盤輸入的一個字符,占用一個字節,可能在傳輸上造成41字節的 包,其中包括1字節的有用信息和40字節的標題數據。這種情況轉變成了4000%的消耗,這樣的情況對於輕負載的網絡來說還是可以接受的,但是重負載的福 特網絡就受不了了,它沒有必要在經過節點和網關的時候重發,導致包丟失和妨礙傳輸速度。吞吐量可能會妨礙甚至在一定程度上會導致連接失敗。Nagle的算 法通常會在TCP程 序里添加兩行代碼,在未確認數據發送的時候讓發送器把數據送到緩存里。任何數據隨后繼續直到得到明顯的數據確認或者直到攢到了一定數量的數據了再發包。盡 管Nagle的算法解決的問題只是局限於福特網絡,然而同樣的問題也可能出現在ARPANet。這種方法在包括因特網在內的整個網絡里得到了推廣,成為了 默認的執行方式,盡管在高互動環境下有些時候是不必要的,例如在客戶/服務器情形下。在這種情況下,nagling可以通過使用TCP_NODELAY 插座選項關閉。
1. nagle算法主要目的是減少網絡流量,當你發送的數據包太小時,TCP並不立即發送該數據包,而是緩存起來直到數據包
到達一定大小后才發送。
2. 當應用程序每次發送的數據很小,特別是只發送1個字節,加上TCP和IP頭的封裝,TCP頭占20個字節,IP頭也占20個字 節,這時候發一個包是41個字節,效率太低。而nagle算法允許計算機緩沖數據,當數據緩存到一定長度后,如果之前發送 的數據得到了ACK確認且接收方有足夠空間容納數據 (當然也要考慮MSS),就發送這些數據,否則繼續等待。
3. TCP socket提供了關閉nagle算法的接口,可以通過TCP_NODELAY選項決定是否開啟該算法。
wikipedia上面關於這個算法的資料:http://en.wikipedia.org/wiki/Nagle's_algorithm
wikipedia上有一段nagle的偽代碼便於理解:
1 if there is new data to send 2 if the window size >= MSS and available data is >= MSS 3 send complete MSS segment now 4 else 5 if there is unconfirmed data still in the pipe 6 enqueue data in the buffer until an acknowledge is received 7 else 8 send data immediately 9 end if 10 end if 11 end if