关于linux的tcp/udp缓存

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

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,由内核的宏决定

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值