以工程師John Nagle命名的Nagle算法旨在減少由TCP應用程序造成的“小包問題”引起的網絡擁塞。 UNIX實現在20世紀80年代開始使用Nagle的算法,並且它仍然是當今TCP的標準功能。
Nagle算法的工作原理
Nagle的算法通過稱為nagling的方法處理TCP應用程序發送端的數據。 它在發送數據之前檢測小型消息並將其累積到較大的TCP數據包中,從而避免產生不必要的大量小數據包。 Nagle算法的技術規範於1984年作為RFC 896發布。 需要積累大量數據的決定以及在兩次發送之間等待的時間長短對於整體性能至關重要。
Nagling能夠以增加延遲( 延遲 )為代價更有效地利用網絡連接的帶寬 。 RFC 896中描述的一個例子說明了潛在的帶寬優勢以及其創建的原因:
- 攔截鍵盤擊鍵並希望將每個要鍵入的字符傳送給接收方的TCP應用程序可以生成一系列包含1 字節數據的消息。
- 在這些消息可以通過網絡發送之前,每個消息必須與TCP / IP所要求的TCP 頭信息一起打包。 每個標題的大小在20到60個字節之間。
- 如果沒有嘮叨,這個示例應用程序將生成包含95%或更多頭信息(21個字節中至少20個)和來自發送者鍵盤的5%或更少實際數據的網絡消息。 使用Nagle算法,相同的數據可以使用更少的消息來傳遞,而且其中95%的內容是鍵盤信息,從而節省了大量帶寬。
應用程序通過TCP_NODELAY 套接字編程選項來控制對Nagle算法的使用。 Windows,Linux和Java系統通常默認啟用Nagle,因此為這些環境編寫的應用程序需要在要關閉算法時指定TCP_NODELAY。
限制
Nagle的算法僅適用於TCP。 其他協議,包括UDP不支持它。
當啟用Nagle時,需要快速網絡響應的TCP應用程序(如互聯網電話呼叫或第一人稱射擊遊戲)可能無法正常工作。 當算法花費額外時間將較小的數據組合在一起時所造成的延遲可能在屏幕上或數字音頻流中在視覺上觸發明顯的滯後 。 這些應用程序通常會禁用Nagle。
這種算法最初是在計算機網絡支持的帶寬比現在少得多的時候開發的。 上述例子是基於約翰·納格爾在20世紀80年代早期在福特航空航天公司的經歷,在他們慢速,重負荷的長途網絡上進行的折衷交易很有意義。 網絡應用程序今天可以從他的算法中受益的情況越來越少。