本文是本人在閱讀《TCP/IP 詳解:卷一》時所做的一些筆記,記錄一些我認爲比較重要的知識點或者句子,較爲凌亂,僅爲本人蔘考使用,並非是分享知識的博客文章。
第19章 TCP 的交互數據流
經受時延
- 通常 TCP 在收到數據後並不立即進行確認,而是推遲發送 ACK 確認,以便與同一方向上的數據一起發送。有時也稱這種現象爲數據捎帶 ACK。
- 絕大多數實現採用的時延爲200ms,即操作系統每200毫秒滴答一次,在滴答的時候 TCP 檢測是否有 ACK 需要發送,如果有則發送。
- 當一個數據包到達並被處理後,系統產生經受時延標記,ACK 暫不發送。當經受時延計時器超時後,ACK 被髮送,並且系統的經受時延標記被清除。
Nagle 算法
- 在一個 TCP 連接上只能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能發送任何小分組。
- TCP 連接將會收集這些小分組,在確認到達時以一個分組發送出去。
- TCP 接口可以通過
TCP_NODELAY
選項關閉 Nagle 算法。
其他
- 每當 TCP 接收到一個超出期望序號的失序數據時,它總是發送一個確認序號爲其期望序號的確認。
- TCP 可以在應用讀取並處理所有數據前,發送所接收數據的確認。
第20章 TCP的成塊數據流
滑動窗口
- 發送方滑動窗口的大小隨着接收方接收緩衝區的大小變化而變化。
- FIN 的 ACK 可以攜帶數據,FIN 也可以攜帶數據。
- 不確定數據,僅更新窗口右邊緣的 ACK 稱爲窗口更新。
窗口大小
- PUSH 標記
- 發送方通知接收方的 TCP 立即將接收到的數據發送給應用程序,這些數據包括 PSH 標記攜帶的數據和所有 TCP 爲這個應用程序接收的數據。
- 許多 TCP 實現在窗口大小增加了兩個最大報文段長度,或者窗口大小增加到最大可能窗口的50%後,會向對端發送窗口更新報文。
慢啓動
發送方設置一個擁塞窗口(Congestion Window)cwnd。
- 連接建立後 cwnd = 1, 表明可以傳發送方網絡鏈路一個 MSS 大小的數據。
- 每收到一個 ACK,cwnd++
- 每經過一個 RTT,cwnd = cwnd * 2
- 當
cwnd >= ssthresh(slow start threshold)
時,就會進入擁塞避免算法
Linux 3.0以後根據 Google 一篇論文《An Argument for Increasing TCP’s Initial CongestionWindow》的建議,將 cwnd 初始化爲10個 MSS。在 Linux 3.0之前,比如2.6,Linux 則採用了 RFC3390,cwnd 是根據 MSS 的值變化的,變化方式如下所示:
if MSS < 1095 {
cwnd = 4
} else if MSS > 2190 {
cwnd = 2
} else {
cwnd = 3
}