Q:本地同时与多个主机建立连接,如果这些主机同时发生数据到本地,而本地又没有调用recv进行处理,会出现什么情况?
A:系统为每个socket建立一个缓存,ip层组包进程在收到数据包后会把数据放入socket缓存。调用recv将socket缓存的内容copy到程序定义的缓存,如果通信进程不能及时recv,将导致该socket缓存满。如果用tcp协议,socket缓存满以后,系统会向对方发出错误消息,对方回收到wsaewouldblock错误,如果是用udp协议,系统会把该socket的以后收到的数据丢弃~
当然发送端送速率过大,内核缓冲区即使增大了,接收端应用程序如果处理不过来,仍然会在应用程序那丢包,因此要在应用程序中调大socket的接收缓冲区。
linux下,sysctl能够设置和显示在/proc/sys目录中的内核参数.能用sysctl来设置或重新设置连网功能,如IP转发、IP碎片去除及源路由检查等。
sysctl -w net.core.rmem_max = 5000000
sysctl -w net.core.wmem_max = 5000000
sysctl -w net.core.rmem_default = 5000000
sysctl -w net.core.wmem_default = 5000000
可以像这样来加大缓冲区空间,修改的是/proc/sys/net/core目录下的值。
1. tcp 收发缓冲区默认值
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4161536
87380 :tcp接收缓冲区的默认值
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4161536
16384 : tcp 发送缓冲区的默认值
2. tcp 或udp收发缓冲区最大值
# cat /proc/sys/net/core/rmem_max
131071:tcp 或 udp 接收缓冲区最大可设置值的一半。
3. udp收发缓冲区默认值
# cat /proc/sys/net/core/rmem_default
111616:udp接收缓冲区的默认值
# cat /proc/sys/net/core/wmem_default
111616
111616:udp发送缓冲区的默认值
4. tcp 或udp收发缓冲区最小值
tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;
tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定