listen函数的第二个参数_浅谈tcp socket的backlog参数

最近看 netty 源码碰到 ChannelOption.SO_BACKLOG 参数,通过跟踪代码发现其实是用于设置底层 tcp socket 的 backlog 参数,由于不了解这个参数,有必要彻底的理解一下。

底层

backlog 参数主要用于底层方法 int listen(int sockfd, int backlog), 在解释 backlog 参数之前,我们先了解下 tcp 在内核的请求过程,其实就是 tcp 的三次握手:

1115d5e25b272d92b5ba5d28aab39e34.png
  1. client 发送 SYN 到 server,将状态修改为 SYN_SEND,如果 server 收到请求,则将状态修改为 SYN_RCVD,并把该请求放到 syns queue 队列中。
  2. server 回复 SYN+ACK 给 client,如果 client 收到请求,则将状态修改为 ESTABLISHED,并发送 ACK 给 server。
  3. server 收到 ACK,将状态修改为 ESTABLISHED,并把该请求从 syns queue 中放到 accept queue。

在linux系统内核中维护了两个队列:syns queueaccept queue

syns queue
用于保存半连接状态的请求,其大小通过 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定,一般默认值是 512,不过这个设置有效的前提是系统的syncookies功能被禁用。互联网常见的 TCP SYN FLOOD 恶意 DOS 攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致 syns queue 不能保存其它正常的请求。

accept queue
用于保存全连接状态的请求,其大小通过 /proc/sys/net/core/somaxconn 指定,在使用 listen函数时,内核会根据传入的 backlog 参数与系统参数 somaxconn,取二者的较小值。

如果 accpet queue 队列满了,server 将发送一个 ECONNREFUSED 错误信息 Connection refused 到 client。

应用层

在netty实现中,backlog 默认通过 NetUtil.SOMAXCONN 指定。

93a88a9976bb7d3f7bd13ef16a7a4c64.png

当然也可以通过 option 方法自定义 backlog 的大小。

e4ef552354b251aaa221c27f8d600ce4.png

backlog 设置注意点

前面已经提到过,内核会根据 somaxconn 和 backlog 的较小值设置 accept queue 的大小,如果想扩大 accept queue 的大小,必须要同时调整这两个参数。

浅谈tcp socket的backlog参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值