TCP原理 I/O 緩存

TCP套接字中的 I/O 緩存

由於TCP套接字中數據收發無邊界。

假設服務器端調用write函數一次傳輸100字節數據,客戶端可能分兩次調用read函數每次讀取100字節的數據。
那麼第一次讀取完50字節的數據後,剩下的50字節的數據在何處呢?難道在網絡中徘徊並等待接收?

實際上write函數調用後並非立即傳輸數據,read函數調用後也並非馬上接收數據。
更準確地說,write函數調用瞬間,將數據轉移至輸出緩衝;read函數調用瞬間,從輸入緩衝中讀取數據.

TCP套接字的I/O緩衝

調用write函數時,數據將轉移到輸出緩衝,在適當的時候(不管是分別傳輸還是一次性傳輸)傳向對方的輸入緩衝,這些I/O緩衝特性可整理如下。

  • I/O 緩衝在每個TCP套接字中單獨存在。
  • I/O 緩衝在創建套接字時自動生成。
  • 即使關閉套接字也會繼續傳遞輸出緩衝中的遺留數據。
  • 關閉套接字將丟失輸入緩衝中的數據。

那麼如果之前問題中的客戶端的輸入緩衝爲50字節.而服務器卻傳輸了100字節呢?可能有同學會想在填滿輸入緩衝之前讀取數據,這樣就會騰出一部分控件,問題就解決了。這是錯誤的!

不會發生超過輸入緩衝大小的數據傳輸。

也就是說,根本不會發生這類問題。因爲TCP會控制數據流。TCP中有滑動窗口(Sliding Window)協議,對話簡單呈現具體流程如下。

  • 套接字A:我最多能接收50字節。
  • 套接字B:OK。
  • 套接字A:我騰出了20字節的空間,最多可以接收70字節。
  • 套接字B:OK

數據收發也是如此。

因此TCP不會因爲緩衝溢出而丟失數據。

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