7socket用戶緩沖區、socket內核緩沖區與tcp協議buffer(滑動窗口)的關系


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直接內存


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM