GNU Linux中的SO_RCVLOWAT和SO_SNDLOWAT说明


/*********************************************************************
 * Author  : Samson
 * Date    : 07/12/2015
 * Test platform:
 *              gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
 *              GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) 
 * Nginx version:
 *              Nginx 1.6.2
 *              Nginx 1.8.0
 * *******************************************************************/
SO_RCVLOWAT SO_SNDLOWAT

每个套接口都有一个接收低潮限度和一个发送低潮限度。

接收低潮限度:对于TCP套接口而言,接收缓冲区中的数据必须达到规定数量,内核才通知进程“可读”。比如触发select或者epoll,返回“套接口可读”。

发送低潮限度:对于TCP套接口而言,和接收低潮限度一个道理。


理解接收低潮限度:如果应用程序没有调用recv()去读取socket的接受缓冲区的数据,则接受缓冲区数据将注一直保存在接受缓冲区中,所以随着接受缓冲区接受到更多发送端发送缓冲区中的数据,则肯定会导致接受缓冲区溢出,所以设置一个接受低潮限度,当epoll监听到某一个socket的接受缓冲区的数据超过了接受低潮限度,则触发读就绪,使得epoll循环返回,开始处理读I/O事件。


接收低潮限度:默认为1字节


理解发送低潮限度:如果应用程序没有调用send()来copy应用程序buff中的数据到socket发送缓冲区中,则随着发送缓冲区的数据被内核通过tcp协议发送出去,最后socket发送缓冲区的数据越来越少,可用的剩余空间越来越多,最后超过发送缓冲区的发送低潮限度,则epoll监听到这个socket可写,使得epoll循环返回,开始处理写I/O事件。


发送低潮限度:默认为2048字节

Nginx中对应的设置:

ngx_send_lowat设置


GNU Linux提供的setsockopt进行设置,在Nginx中的src/event/ngx_event.c代码中的ngx_send_lowat函数中进行了发送低潮限度: setsockopt(c->fd, SOL_SOCKET, SO_SNDLOWAT, (const void *) &sndlowat, sizeof(int)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值