Linux 为什么Unix域为小程序包占用这么多缓冲区
我做了一些unix域和tcp/ip客户机/服务器测试并找到了答案 unix域占用的缓冲区比实际需要的要多得多, 他们都在使用SOCK_流 在3.10.0-327.el7.x86_64 linux中,unix域客户端连接到unix域服务器,unix域服务器每10秒向客户端发送44字节的包,客户端从不调用recv,这样从服务器发送的所有包都将 在缓冲区中,我观察到以下情况:Linux 为什么Unix域为小程序包占用这么多缓冲区,linux,sockets,tcp,unix-socket,Linux,Sockets,Tcp,Unix Socket,我做了一些unix域和tcp/ip客户机/服务器测试并找到了答案 unix域占用的缓冲区比实际需要的要多得多, 他们都在使用SOCK_流 在3.10.0-327.el7.x86_64 linux中,unix域客户端连接到unix域服务器,unix域服务器每10秒向客户端发送44字节的包,客户端从不调用recv,这样从服务器发送的所有包都将 在缓冲区中,我观察到以下情况: ss -ax |grep "test" Netid State Recv-Q Send-Q
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_流发送44字节的包,unix域缓冲区每个需要768字节,而tcp/ip缓冲区只需要44字节 顺便说一句,您在比较域与internet套接字时比较了send-q和recv-q。为什么send-q会堆积起来?您说过,您没有做
recv
。这不会导致ACK退出。那么为什么send-q会被填满呢?这个高值可能是因为重新传输计数?在unix域和tcp/ip测试中,客户端都没有故意调用recv,两个案例服务器都发送44个字节并等待10秒再发送44个字节,然后ss-ax将看到send-Q有7681536,。。。在测试unix域时,ss-at将看到44,88,。。。在测试tcp/ip的Recv-Q中,我不知道为什么会发生这种情况。顺便说一句,您正在比较send-Q和Recv-Q,比较域和internet套接字。为什么send-q会堆积起来?您说过,您没有做recv
。这不会导致ACK退出。那么为什么send-q会被填满呢?这个高值可能是因为重新传输计数?在unix域和tcp/ip测试中,客户端都没有故意调用recv,两个案例服务器都发送44个字节并等待10秒再发送44个字节,然后ss-ax将看到send-Q有7681536,。。。在测试unix域时,ss-at将看到44,88,。。。在测试tcp/ip的Recv-Q中,我不知道为什么会发生这种情况。