Nagle算法要求一條TCP連接上最多只有一個未被確認的報文,發送方發送一個TCP報文,接收方確認該報文,發送方再發送下一個報文,若發送方在一定時間內未收到確認,則再重發報文。相對來說Nagle算法相對簡單且不容易出錯,但卻降低了網絡的吞吐量,也增加了網絡流量。
在實際的TCP實現中,接收方往往一次確認一批的TCP報文,且確認報文與接收方發往發送方的報文一同回復,以減少網絡流量,從另一方面說也就允許發送方在前一報文未確認時,可以繼續發送下一個報文,雖然這種實現提高了吞吐量,但卻帶來了另一個問題,即發送文如何確認報文被接收方正確接收?
TCP有兩種方式來保證報文被正確接收:
1:發送端在一定時期內未收到報文確認,報文重發
2:接收端檢測到某一報文丟失,重復發送ACK報文(3個以上),以促使發送端重發丟失報文。這就是快速重傳機制。
通常,發送端會重傳接收方未收到的報文,但不會重傳已經被接收方收到但並未確認的包,然後接收方將收到的報文排序後進行一並確認,
如上圖,由於某種原因,發送端發給接收端的數據包序號1025,丟失了序號為1的包(250839)
此時接收端對序號1進行了確認,發送端重發了序號1,此時接收端已經有了2484個字節,序號1中有1024個字節,序號1025中的1460個字節,接收端這時回復一個確認2485的AC包。