1. 程式人生 > >TCP原理 I/O 快取

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不會因為緩衝溢位而丟失資料。