引言
在TCP進行數據傳輸時,可以分爲成塊數據流和交互數據流兩種,且處理的算法不同.
交互式輸入
每一個交互按鍵都會產生一個分組,也就是說,每次從客戶傳到服務器的是一個字節的按鍵(而不是每次一行).
報文段2可以和報文段3進行合併—按鍵確認和按鍵回顯一起發送
經受時延的確認
按鍵確認和按鍵回顯兩個報文段合併在一起發送,這種技術叫做經受時延的確認。
通常TCP在接收到數據時並不立即發送ACK;相反,他推遲發送,以便將ACK與需要沿該方向發送的數據一起發送(有時稱這種現象爲數據捎帶ACK)
絕大多數實現採用的時延爲200ms,也就是說,TCP將以最大200ms的時延等待是否有數據一起發送.
Nagle算法
目的:減少網絡上的微小分組,降低出現擁塞的可能,但也會增加延時.
Nagle算法要求一個TCP連接上最多只能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能發送其他的小分組.
流程:
1,發送端TCP將從應用進程收到的第一數據塊立即發送,不管其大小,哪怕只有一個字節.
2,發送端輸出第一塊數據後開始收集數據,並等待確認.
3,確認未到達時,若收集數據打到窗口的一半或一個MSS段,立即發送.
4,確認到達後,發緩衝區中的數據組成一個TCP段,然後發送.
Socket API用戶可以使用TCP_NODELAY選項來關閉Nagle算法.(比如當小消息需要無時延發送時)
窗口大小通告
Slip通告窗口大小爲4096字節
vangogh通告其窗口大小爲8192字節
服務器通常通告窗口大小爲8192字節,應爲服務器在讀取並回顯接收到的數據之前,其TCP沒有數據發送