TCP/IP 讀書筆記

本文是本人在閱讀《TCP/IP 詳解:卷一》時所做的一些筆記,記錄一些我認爲比較重要的知識點或者句子,較爲凌亂,僅爲本人蔘考使用,並非是分享知識的博客文章。

第19章 TCP 的交互數據流

經受時延

  • 通常 TCP 在收到數據後並不立即進行確認,而是推遲發送 ACK 確認,以便與同一方向上的數據一起發送。有時也稱這種現象爲數據捎帶 ACK。
  • 絕大多數實現採用的時延爲200ms,即操作系統每200毫秒滴答一次,在滴答的時候 TCP 檢測是否有 ACK 需要發送,如果有則發送。
  • 當一個數據包到達並被處理後,系統產生經受時延標記,ACK 暫不發送。當經受時延計時器超時後,ACK 被髮送,並且系統的經受時延標記被清除。

Nagle 算法

  • 在一個 TCP 連接上只能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能發送任何小分組。
  • TCP 連接將會收集這些小分組,在確認到達時以一個分組發送出去。
  • TCP 接口可以通過TCP_NODELAY選項關閉 Nagle 算法。

其他

  • 每當 TCP 接收到一個超出期望序號的失序數據時,它總是發送一個確認序號爲其期望序號的確認。
  • TCP 可以在應用讀取並處理所有數據前,發送所接收數據的確認。

第20章 TCP的成塊數據流

滑動窗口

  1. 發送方滑動窗口的大小隨着接收方接收緩衝區的大小變化而變化。
  2. FIN 的 ACK 可以攜帶數據,FIN 也可以攜帶數據。
  3. 不確定數據,僅更新窗口右邊緣的 ACK 稱爲窗口更新。

窗口大小

  • PUSH 標記
    • 發送方通知接收方的 TCP 立即將接收到的數據發送給應用程序,這些數據包括 PSH 標記攜帶的數據和所有 TCP 爲這個應用程序接收的數據。
  • 許多 TCP 實現在窗口大小增加了兩個最大報文段長度,或者窗口大小增加到最大可能窗口的50%後,會向對端發送窗口更新報文。

慢啓動

發送方設置一個擁塞窗口(Congestion Window)cwnd。

  1. 連接建立後 cwnd = 1, 表明可以傳發送方網絡鏈路一個 MSS 大小的數據。
  2. 每收到一個 ACK,cwnd++
  3. 每經過一個 RTT,cwnd = cwnd * 2
  4. 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
}

參考文章

  1. TCP 的那些事(下)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章