轉載:http://www.cnblogs.com/jiayayao/p/6217744.htmlhtml
Nagle算法是針對網絡上存在的微小分組可能會在廣域網上形成擁塞而設計的。該算法要求一個TCP鏈接上最多隻能有一個未被確認的未完成的小分組,在該分組確認到達以前不能發送其餘的小分組。同時,TCP收集這些少許的分組,並在確認到來時以一個分組發出去。它的設計規則以下:算法
(1)若是包長度達到最大報文長度(MSS,Maximum Segment Size),則容許發送;網絡
(2)若是該包含有FIN,則容許發送;socket
(3)設置了TCP_NODELAY選項,則容許發送;性能
(4)未設置TCP_CORK選項時,若全部發出去的小數據包(包長度小於MSS)均被確認,則容許發送;設計
與Nagle算法相對應的TCP確認延遲機制(TCP Delayed acknowledge)設計的做用是接收到數據後延遲ACK的發送(40ms),使得TCP協議棧有機會合並多個ACK以提升性能。code
因爲有Nagle算法,若是發送端啓用了Nagle算法,接收端啓用了TCP Delayed Acknowledge。當發送端發起兩次寫一次讀的時候,第一次寫,因爲TCP沒有等待ACK,直接發出去了,而第二次寫的時候,第一次寫的ACK尚未接收到,從而等待;而接收端有Delayed Acknowledge機制,會等待40ms以提供合併多個ACK的機會。Nagle算法的使用在一些實時性要求比較高的場合,會引發一些問題。好比項目中設計的UI鼠標遠程控制遠端的機器時,發現遠端的鼠標操做很卡頓,這是由於鼠標消息的發送端因爲Nagle算法的默認開啓,是有延遲的,對相應的socket設置爲TCP_NODELAY便可關閉Nagle算法:htm
setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char*)&flag,sizeof(flag));