For learning purpose I have created two simple C programms to simulate the following sockets scenario: a client in the loop sends 256 bytes to the server(send function with MSG_DONTWAIT flag) but the server doesn't read the data (recv function). For simplicity the server doesn't send any other data to the client. I would like to test when send method will return an error. I use linux ss -nmtp command to see what happens with socket buffers. First the server receive buffer (Recv-Q) and skmem r parameter is growing:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 768 0 127.0.0.1:9002 127.0.0.1:34246 users:(("tcpServer",pid=16455,fd=4))
skmem:(r2048,rb131072,t0,tb2626560,f2048,w0,o0,bl0,d0)
ESTAB 0 0 127.0.0.1:34246 127.0.0.1:9002 users:(("tcpClient",pid=16482,fd=3))
skmem:(r0,rb131072,t0,tb2626560,f0,w0,o0,bl0,d0)
When the server Recv-Q reaches value 98816 the client Send-Q and skmem w start growing. When the client send function returns the error 11 (Resource temporarily unavailable) the buffers sizes looks this way:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 98816 0 127.0.0.1:9002 127.0.0.1:49744 users:(("tcpServer",pid=21644,fd=4))
skmem:(r128256,rb131072,t0,tb2626560,f2816,w0,o0,bl0,d16)
ESTAB 0 2553798 127.0.0.1:49744 127.0.0.1:9002 users:(("tcpClient",pid=22042,fd=3))
skmem:(r0,rb131072,t0,tb2626560,f570,w2653638,o0,bl0,d0)
Does skmem rb refer to the max receive buffer size and skmem tb refer to the max send buffer size ? If so, how to explain difference between Recv-Q and skmem rb and Send-Q and skmem tb?
Edit
skmem rb is the same as the default size returned by the following command:
sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096 131072 6291456
but skmem tb is different than the default size returned by this command:
sysctl net.ipv4.tcp_wmem
net.ipv4.tcp_wmem = 4096 16384 4194304
How to explain it ?