Socker发送/接收缓冲区 及 Linux的TCP内核参数

15 篇文章 1 订阅

TCP是面向连接的协议,有重传机制,能保证数据有序。

发送数据时,会把发出去但未收到确认的消息放进send buffer里,根据【重传机制】,需要的时候会从buffer里取对应的消息重发。

而接收数据时,因为消息不一定是有序到达的,会把先到达的大seq的消息放到recv buffer里,等前面的seq连续都到达后在按顺序送到应用层,并发送应答给对方。

如果send buffer满了,调用socket的send/write会报错, 如errno=EAGAIN, 表示try again. 如果recv buffer, 可能就直接丢掉这个包了(猜测)。 严重者可能导致TCP连接断开。

因此,设置适当的buffer大小是应当的。如果网络环境较差,传输数据量较大,建议buffer设置大一些。 socket设置send/recv buffer的方法如下:

setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *)(&size), sizeof(size));
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (char *)(&size), sizeof(size));

但是,实际还受到内核中参数限制:
/proc/sys/net/core/rmem_max 最大的TCP数据接收窗口(字节)。
/proc/sys/net/core/wmem_max 最大的TCP数据发送窗口(字节)。
/proc/sys/net/ipv4/tcp_mem 确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)。
/proc/sys/net/ipv4/tcp_rmem 类似

两种查看方式:

sysctl -a | grep max
cat /proc/sys/net/core/wmem_max

修改方式1: 直接修改/proc/sys/net/core/wmem_max等, reboot后可能失效
修改方式2: 修改/etc/sysctl.conf文件

net.core.optmem_max = 40960
net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.rp_filter = 0

net.ipv4.icmp_ratelimit = 200

net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

Ref:
https://www.cnblogs.com/fczjuever/archive/2013/04/17/3026694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值