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