TCP套接字中的 I/O 緩存
由於TCP套接字中數據收發無邊界。
假設服務器端調用write函數一次傳輸100字節數據,客戶端可能分兩次調用read函數每次讀取100字節的數據。
那麼第一次讀取完50字節的數據後,剩下的50字節的數據在何處呢?難道在網絡中徘徊並等待接收?
實際上write函數調用後並非立即傳輸數據,read函數調用後也並非馬上接收數據。
更準確地說,write函數調用瞬間,將數據轉移至輸出緩衝;read函數調用瞬間,從輸入緩衝中讀取數據.
調用write函數時,數據將轉移到輸出緩衝,在適當的時候(不管是分別傳輸還是一次性傳輸)傳向對方的輸入緩衝,這些I/O緩衝特性可整理如下。
- I/O 緩衝在每個TCP套接字中單獨存在。
- I/O 緩衝在創建套接字時自動生成。
- 即使關閉套接字也會繼續傳遞輸出緩衝中的遺留數據。
- 關閉套接字將丟失輸入緩衝中的數據。
那麼如果之前問題中的客戶端的輸入緩衝爲50字節.而服務器卻傳輸了100字節呢?可能有同學會想在填滿輸入緩衝之前讀取數據,這樣就會騰出一部分控件,問題就解決了。這是錯誤的!
不會發生超過輸入緩衝大小的數據傳輸。
也就是說,根本不會發生這類問題。因爲TCP會控制數據流。TCP中有滑動窗口(Sliding Window)協議,對話簡單呈現具體流程如下。
- 套接字A:我最多能接收50字節。
- 套接字B:OK。
- 套接字A:我騰出了20字節的空間,最多可以接收70字節。
- 套接字B:OK
數據收發也是如此。
因此TCP不會因爲緩衝溢出而丟失數據。