tcp數(shù)據(jù)傳輸分為兩種:
-
交互數(shù)據(jù)傳輸
交互數(shù)據(jù)就是發(fā)送控制命令的數(shù)據(jù)流,如telnet、ftp等;利用Nagle算法與delay-ack進(jìn)行擁塞避免
-
塊數(shù)據(jù)傳輸
塊數(shù)據(jù)是用來(lái)發(fā)送控制命令的包;利用滑動(dòng)窗口進(jìn)行流控、利用“慢啟動(dòng)與擁塞避免算法、快速重傳算法”進(jìn)行擁塞避免
為何Nagle算法和delay-ack可以使交互數(shù)據(jù)避免擁塞
交互數(shù)據(jù)流屬于多而小的數(shù)據(jù)流,如果是在局域網(wǎng)內(nèi)則沒(méi)什么問(wèn)題,但如果是在廣域網(wǎng)上,時(shí)刻充斥著大量TCP小分組,那么可能會(huì)造成網(wǎng)絡(luò)的擁塞。此二算法就是為了減少TCP小分組而產(chǎn)生的,目的即是為了提高網(wǎng)絡(luò)效率。
Nagle算法
Nagle要求一個(gè)TCP連接上最多只能有一個(gè)未被確認(rèn)的小分組,在該分組的確認(rèn)到達(dá)之前不能發(fā)送其他小分組。TCP會(huì)搜集這些小的分組,然后在之前小分組的確認(rèn)到達(dá)后將剛才搜集的小分組合并發(fā)送出去。
該算法的優(yōu)越之處在于它是自適應(yīng)的,確認(rèn)到達(dá)的越快,數(shù)據(jù)也就發(fā)送的越快;而在希望減少微小分組數(shù)目的低速?gòu)V域網(wǎng)上,則會(huì)發(fā)送更少的分組。
當(dāng)然,有些時(shí)候是需要禁用Nagle算法的,如遠(yuǎn)程連接時(shí)的鼠標(biāo)移動(dòng)操作
delay-ack
通常Server在接收到從Client發(fā)送過(guò)來(lái)的數(shù)據(jù)時(shí),并不馬上發(fā)送ACK,而是等一個(gè)規(guī)定時(shí)延,看看本機(jī)是否有數(shù)據(jù)要反饋給Client,如果有,就將數(shù)據(jù)包含在此ACK包中,以前發(fā)送給Client。一般情況下這個(gè)時(shí)延為200ms。
好處:
- 避免糊涂窗口綜合癥
- 捎帶ack,減少小分組
當(dāng)Nagle遇上延遲ACK
試想:通過(guò)多個(gè)寫小片數(shù)據(jù)向?qū)Χ税l(fā)送單個(gè)邏輯的操作,兩次寫數(shù)據(jù)長(zhǎng)度小于MSS,當(dāng)第一次寫數(shù)據(jù)到達(dá)對(duì)端后,對(duì)端延遲ack,不發(fā)送ack,而本端因?yàn)橐l(fā)送的數(shù)據(jù)長(zhǎng)度小于MSS,所以nagle算法起作用,數(shù)據(jù)并不會(huì)立即發(fā)送,而是等待對(duì)端發(fā)送的第一次數(shù)據(jù)確認(rèn)ack;這樣的情況下,需要等待對(duì)端超時(shí)發(fā)送ack,然后本段才能發(fā)送第二次寫的數(shù)據(jù),從而造成延遲;