10tcp缓冲区大小设置
在 socket用户缓冲区、socket内核缓冲区与tcp协议buffer(滑动窗口)的关系 中,我们最主要的,认为java socket的缓冲区即是tcp滑动窗口
本文予以实践认证
在之前的例子代码中,socket缓冲区与沾包 nagle in tcp,两边加上s.getReceiveBufferSize()查看默认缓冲区大小
0 腾讯 centos 7
[root@VM_0_9_centos ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
[root@VM_0_9_centos ~]# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
1 服务端 centos 7(腾讯云) 客户端 mac
服务端 centos 7(腾讯云)
flush - false
43690
^C[root@VM_0_9_centos ~]# rm -rf *
[root@VM_0_9_centos ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
客户端 mac
131860
131860
(1)默认情况
C 131840 S 28960
(2)将两边都改为100
C 17496 S 1152
(3)两边3000
C 42360 S 2896
看上去linux起作用了,client mac没起作用
因此我们将客户端也搬到linux上
2 服务端 centos 7(腾讯云) 客户端 centos 6.8(阿里云)
服务端 centos 7(腾讯云)
flush - false
43690
[root@VM_0_9_centos ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
客户端 centos 6.8(阿里云)
43690 注释read
8192 注释 write
[root@iZ8vbdtd5039a0ye0oy5o4Z ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 1970176
(1)默认情况
C 14624 S 28960
(2)两边100
C(阿里) 1472 S(腾讯) 1152
(3)两边3000
C 4284 S 2896
3 服务端 centos 6.8(阿里云)客户端 centos 7(腾讯云)
(注意,阿里云要额外配置端口准入)
服务端 centos 6.8(阿里云)
flush - false
43690
^C[root@iZ8vbdtd5039a0ye0oy5o4Z ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 1970176
客户端 centos 7(腾讯云)
43690
8192
hello
[root@VM_0_9_centos ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
做个(2)两边100
C(腾讯) 1152 S(阿里) 1448
总结:
1 本文通过抓包找Win关键字,并通过反复设置,验证了socket(java)的缓冲区即是内核缓冲区与tcp滑动窗口
2 linux 默认读缓冲区并不是网上说的8k;接受窗口最大值也不是16位,看max?!
3 CentOS Linux release 7.5.1804 (Core) (腾讯)与 CentOS release 6.8 (Final)(阿里)存在一些差异,但基本按设置值响应了setSO_RCV_BUF,腾讯的更近些
4 以100设置为SO_RCV_BUF,系统会放到1100-1400
5 mac 本地没有响应 setSO_RCV_BUF,https://www.iteye.com/blog/zhangyafeikimi-289019 该文中指出,windows也不鸟你
6 注意对于客户端,要在connect前设置,对于服务端,要在bind前设置
7 linux默认40k读、8k写
内涵7个文件
mac - linux(腾讯)默认 100 3000
linux(阿里)-linux(腾讯)默认 100 3000
linux(腾讯)-linux(阿里)100