Netty 的 ChannelOption.SO_BACKLOG 知识点整理

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty 的 ChannelOption.SO_BACKLOG 知识点整理相关的知识,希望对你有一定的参考价值。

背景

一个基于 Netty 的应用,在压力测试时,Socket 请求数量一多,就发送失败,监测 JVM 内存大小比较稳定,猜测可能是 ChannelOption.SO_BACKLOG 这个配置导致的,设置的值是 128 。

调整为 1024 后,连接失败的次数确实减少了一些,那么这个配置到底有什么作用呢?本文来汇总一下这个知识点。

TCP/IP 的三次握手

TCP/IP 建立连接的三个阶段被称为“三次握手”,三次握手完成后,客户端和服务端建立连接,开始传输数据。

【此图来源于网络 https://blog.csdn.net/weixin_44730681/article/details/113728895 】

三次握手,这个图真的看到很多遍了哇,再回一下流程,像极了两个街头对接的人:

  1. A:SYN ,客户端发起同步请求。你好呀,听说你开启了监听端口,我想给你传数据,方便建立连接吗,我先发一个序列号 x ?
  2. B:SYN + ACK ,服务端发起同步请求。是的呀,我给你发一个我的序列号 y,对了,你的下一个序列号是 x +1 吗?
  3. A:ACK,客户端确认请求,对着呢,你的下一个序列号 y+1 吗?

这三轮同步和确认操作后,客户端和服务器端就建立起了稳定的连接。

两个队列

这个过程中,服务器内核会用到两个队列:

  1. syn 队列:未完成三次握手的连接,记作 A 队列;
  2. accetp 队列:已完成三次握手,内核正等待进程执行 accept 函数的连接,记作 B 队列。

ChannelOption.SO_BACKLOG 配置就是控制 A + B 队列总长度的参数,如果这两个队列都满了,那么 Netty 服务将不会再接收新的连接请求了。

以上是关于Netty 的 ChannelOption.SO_BACKLOG 知识点整理的主要内容,如果未能解决你的问题,请参考以下文章

netty实现 tcp和udp的区别

ChannelOption用到的socket的标准参数

浅谈tcp socket的backlog参数

超时连接后如何关闭TCP连接?

Mobilefirst 8.0 错误 IOS 推送通知。无法加载 netty_tcnative_aix_ppc_64、netty_tcnative_ppc_64、netty_tcnative

Netty_02_高性能的NIO框架