1 操作系統socket內核緩沖區是tcp協議buffer(滑動窗口)的具體實現
2 用戶緩沖區即是局部的byte[]
https://www.zhihu.com/question/48454744
3 內核緩沖區(滑動窗口)大小占16位,最大65536長度字節數,三次握手時通知對方
4 滑動窗口不完全等於內核緩沖區,應描述為內核緩沖區剩余可用字節數
https://www.cnblogs.com/lisuyun/articles/5803352.html
3+ https://www.icode9.com/content-4-267226.html
factor 3次握手時協商,之后不可改變
如9tcp緩沖區大小設置中就有130k的window size
3++ https://www.cnblogs.com/daimadebanyungong/p/5300790.html
一、TCP的滑動窗口大小實際上就是socket的接收緩沖區大小的字節數 二、 對於server端的socket一定要在listen之前設置緩沖區大小,因為,accept時新產生的socket會繼承監聽socket的緩沖區大 小。對於client端的socket一定要在connet之前設置緩沖區大小,因為connet時需要進行三次握手過程,會通知對方自己的窗口大小。在 connet之后再設置緩沖區,已經沒有什么意義。 三、由於緩沖區大小在TCP頭部只有16位來表示,所以它的最大值是65536,但是對於一些情況來說需要使用更大的滑動窗口,這時候就要使用擴展的滑動窗口,如光纖高速通信網絡,或者是衛星長連接網絡,需要窗口盡可能的大。這時會使用擴展的32位的滑動窗口大小。
5 每個tcp連接都有各自大小、相互獨立的內核緩沖區
https://blog.csdn.net/stpeace/article/details/43777287
6 socket的flush,只是將數據寫入操作系統緩存中,並不保證數據會立即發送,在tcp層面,由操作系統控制發送
關於tcp delayedack實踐(一)tcp 14讀緩沖區(滑動窗口)耗盡與write阻塞、拆包、延遲(三)
我們現在來回看2018年9月12日的思考:
“發送心跳消息,並在發送失敗時關閉該連接”
一般情況下,數據會成功拷貝到操作系統內核發送緩沖區,后返回,無視你斷網發不出去,直到發送緩沖區積壓滿
7 每個tcp連接的內核發送緩沖區SNDBUF與內核接收緩沖區RCVBUF互不干擾
8 過程
為了簡便起見, 我們僅考慮單向的數據流, 即A(客戶端)向B(服務端)發送數據。
在應用程序Program A中, 我們定義一個數組char szBuf[100] = "tcp"; 那么這個szBuf就是應用程序緩沖區(對應上圖的Program A中的某塊內存), send函數對應上面藍色的Socket API, 內核緩沖區對應上面的黃色部分。 我們看到, send函數的作用是把應用程序緩沖區中的數據拷貝到內核緩沖區, 僅此而已。 內核緩沖區中的數據經過(DMA拷貝到)網卡, 經歷網絡傳到B端的網卡(TCP協議), 然后(DMA拷貝)進入B的內核緩沖區, 然后由recv函數剪切/復制到Program B的應用程序緩沖區。
https://blog.csdn.net/stpeace/article/details/43719449
對於java,還有一個jvm內存拷貝到直接內存的過程 ,更具體的,參考----- 0拷貝nio直接內存