我已经做了一些unix域和tcp / ip客户端/服务器测试并找出答案 unix域比实际应用的缓冲区要多得多, 他们都使用SOCK_STREAM。
在3.10.0-327.el7.x86_64 linux中,unix域客户端连接到unix域服务器,unix域服务器每隔10秒向客户端发送44字节的包,客户端从不调用recv,以便从服务器发送所有包将 所有人都被缓冲区堵住,以下是我观察到的:
ss -ax |grep "test"
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 768 /tmp/testud 22461998 * 22461997
u_str ESTAB 0 1536 /tmp/testud 22461998 * 22461997
u_str ESTAB 0 2304 /tmp/testud 22461998 * 22461997
我在tcp / ip中进行相同的测试,如下所示:
ss -at | grep "192.168"
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 44 0 192.168.2.1:odnsp 192.168.2.2:distinct
ESTAB 88 0 192.168.2.1:odnsp 192.168.2.2:distinct
ESTAB 132 0 192.168.2.1:odnsp 192.168.2.2:distinct
如您所见,unix域Send-Q有768个字节,但实际的包只需要44个字节,而tcp / ip Recv-Q对每个包只需要44个字节。
我的问题是为什么通过SOCK_STREAM发送44字节的包,unix域缓冲区每个花费768个字节,但tcp / ip缓冲区仅花费44个字节?!