在 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