TCP 報(bào)文段所攜帶的應(yīng)用程序數(shù)據(jù)按照長度分為兩種:交互數(shù)據(jù)和成塊數(shù)據(jù)。交互數(shù)據(jù)僅包含很少的字節(jié)。使用交互數(shù)據(jù)的應(yīng)用程序(或協(xié)議)對實(shí)時(shí)性要求高,比如 Telnet、ssh 等。成塊數(shù)據(jù)的長度則通常為 TCP 報(bào)文段允許的最大數(shù)據(jù)長度。使用成塊數(shù)據(jù)的應(yīng)用程序(或協(xié)議)對傳輸效率要求高,比如 FTP。
交互數(shù)據(jù)流總是以小于最大報(bào)文段長度的分組發(fā)送,即進(jìn)行小分組數(shù)據(jù)傳輸。主要應(yīng)用在實(shí)時(shí)性要求比較高的場合。比如 Rlogin 遠(yuǎn)程登錄中,需要回顯客戶端輸入的字符,每發(fā)送一個(gè)字節(jié)到服務(wù)端,并回顯到客戶端的過程如下:
上面的過程中,雖然達(dá)到了實(shí)時(shí)性要求,但是交互數(shù)據(jù)太頻繁,并且在服務(wù)器發(fā)送的確認(rèn)報(bào)文中并沒有返回有用應(yīng)用程序數(shù)據(jù),回顯數(shù)據(jù)是服務(wù)器單獨(dú)發(fā)送,并不跟確認(rèn)報(bào)文一起發(fā)送,這樣頻繁的交互數(shù)據(jù)會(huì)導(dǎo)致網(wǎng)絡(luò)擁塞。為了防止網(wǎng)絡(luò)擁塞,在進(jìn)行交互數(shù)據(jù)流時(shí)可采用兩種方法:捎帶 ACK和Nagle 算法;
當(dāng)服務(wù)器收到遠(yuǎn)程主機(jī)的 TCP 數(shù)據(jù)報(bào)之后,通常不立即發(fā)送 ACK 確認(rèn)數(shù)據(jù)報(bào),而是推遲發(fā)送,即等待一個(gè)短暫的時(shí)間,這個(gè)時(shí)間一般是 200 ms。如果這段時(shí)間里面服務(wù)器有需要發(fā)送給遠(yuǎn)程主機(jī)的 TCP 數(shù)據(jù)報(bào),那么就把這個(gè) ACK 確認(rèn)數(shù)據(jù)報(bào)“捎帶”著發(fā)送出去,把本來兩個(gè) TCP 數(shù)據(jù)報(bào)整合成一個(gè)發(fā)送。由于 TCP 具有超時(shí)重傳機(jī)制,若等待時(shí)間超過了200 ms,若此時(shí)服務(wù)器依然沒有數(shù)據(jù)要一起發(fā)送,就直接發(fā)送 ACK 確認(rèn)報(bào)文段。這種機(jī)制可以提高 TCP 數(shù)據(jù)報(bào)的利用率。
使用捎帶 ACK 機(jī)制的交互數(shù)據(jù)流時(shí),客戶端針對服務(wù)器返回的數(shù)據(jù)所發(fā)送的確認(rèn)報(bào)文段都不攜帶任何應(yīng)用程序數(shù)據(jù)(長度為0),而服務(wù)器每次發(fā)送的確認(rèn)報(bào)文段都包含它需要發(fā)送的應(yīng)用程序數(shù)據(jù)。服務(wù)器的這種處理方式稱為延遲確認(rèn),即它不馬上確認(rèn)上次收到的數(shù)據(jù),而是在一段延遲時(shí)間后查看本端是否有數(shù)據(jù)需要發(fā)送,如果有,則和確認(rèn)信息一起發(fā)出。因?yàn)榉?wù)器對客戶請求處理得很快,所以它發(fā)送確認(rèn)報(bào)文段的時(shí)候總是有數(shù)據(jù)一起發(fā)送。延遲確認(rèn)可以減少發(fā)送 TCP 報(bào)文段的數(shù)量。而由于用戶的輸入速度明顯慢于客戶端程序的處理速度,所以客戶端的確認(rèn)報(bào)文段總是不攜帶任何應(yīng)用程序數(shù)據(jù)。
該算法要求一個(gè) TCP 連接的通信雙方在任意時(shí)刻最多只能發(fā)送一個(gè)未被確認(rèn)的 TCP 報(bào)文段,在該 TCP 報(bào)文段的確認(rèn)到達(dá)之前不能發(fā)送其他TCP報(bào)文段。另一方面,發(fā)送方在等待確認(rèn)的同時(shí)收集本端需要發(fā)送的微量數(shù)據(jù),并在確認(rèn)到來時(shí)以一個(gè) TCP 報(bào)文段將它們?nèi)堪l(fā)出。這樣就極大地減少了網(wǎng)絡(luò)上的微小 TCP 報(bào)文段的數(shù)量。該算法的另一個(gè)優(yōu)點(diǎn)在于其自適應(yīng)性:確認(rèn)到達(dá)得越快,數(shù)據(jù)也就發(fā)送得越快。
參考資料:
《TCP/IP 詳解》