NIO编程之三次握手成功而服务器不响应客户端

TCP 三次握手原理,你真的理解吗? 阿里妹导读:最近,阿里中间件小哥哥蛰剑碰到一个问题——client端连接服务器总是抛异常。在反复定位分析、并查阅各种资料文章搞懂后,他发现没有文章把这两个队列以及怎么观察... 阅读详情

下面这篇推文转自微信公众号《阿里技术》:https://mp.weixin.qq.com/s/yH3PzGEFopbpA-jw4MythQ

这篇文章写的是NIO的socket通信,三次握手成功,但是出现Server没有响应Client,是因为backlog过小。

我前篇文章<Netty之HelloWorld>就写到对于ChannelOption.SO_BACKING的解释,而Netty确实也是用的NIO。下面再将解释放出来。

* 对于ChannelOption.SO_BACKING的解释:
* 服务器端TCP内核模型维护有两个队列,我们称之为A,B吧。
* 客户端向服务端connect的时候,会发送带有SYN标志的包(第一次握手),
* 服务器收到客户端发来的SYN时,向客户端发送SYN ACK确认(第二次握手),
* 此时TCP内核模块把客户端连接加入A队列中,然后服务器收到客户端发来的ACK时(第三次握手),
* TCP内核模块把客户端连接从A队列移到B队列,连接完成,应用程序的accpet会返回。
* 也就是说accept从B队列中取出完成三次握手的连接。
* A队列和B队列的长度之和是blacklog。当A,B队列的长度之和大于backlog时,新连接将会被TCP内核拒绝。
* 所以说,如果backlog过小,可能会初选accept速度跟不上,A,B队列满了,导致新的客户端无法连接
* 要注意的是,backlog对程序支持的连接数并没影响,backlog影响的只是还没被accept取出的连接
好了,不说那么多了,下面看看阿里大牛是如何入手解决这个问题的。

问题描述

场景:JAVA的client和server,使用socket通信。server使用NIO。

1.间歇性得出现client向server建立连接三次握手已经完成,但server的selector没有响应到这连接。

2.出问题的时间点,会同时有很多连接出现这个问题。

3.selector没有销毁重建,一直用的都是一个。

4.程序刚启动的时候必会出现一些,之后会间歇性出现。

分析问题

正常TCP建连接三次握手过程:


  • 第一步:client 发送 syn 到server 发起握手;

  • 第二步:server 收到 syn后回复syn+ack给client;

  • 第三步:client 收到syn+ack后,回复server一个ack表示收到了server的syn+ack(此时client的56911端口的连接已经是established)。

从问题的描述来看,有点像TCP建连接的时候全连接队列(accept队列,后面具体讲)满了,尤其是症状2、4. 为了证明是这个原因,马上通过 netstat -s | egrep "listen" 去看队列的溢出统计数据:    


反复看了几次之后发现这个overflowed 一直在增加,那么可以明确的是server上全连接队列一定溢出了。

接着查看溢出后,OS怎么处理:


tcp_abort_on_overflow 为0表示如果三次握手第三步的时候全连接队列满了那么server扔掉client 发过来的ack(在server端认为连接还没建立起来)

为了证明客户端应用代码的异常跟全连接队列满有关系,我先把tcp_abort_on_overflow修改成 1,1表示第三步的时候如果全连接队列满了,server发送一个reset包给client,表示废掉这个握手过程和这个连接(本来在server端这个连接就还没建立起来)。

接着测试,这时在客户端异常中可以看到很多connection reset by peer的错误,到此证明客户端错误是这个原因导致的(逻辑严谨、快速证明问题的关键点所在)。

于是开发同学翻看java 源代码发现socket 默认的backlog(这个值控制全连接队列的大小,后面再详述)是50,于是改大重新跑,经过12个小时以上的压测,这个错误一次都没出现了,同时观察到 overflowed 也不再增加了。

到此问题解决,简单来说TCP三次握手后有个accept队列,进到这个队列才能从Listen变成accept,默认backlog 值是50,很容易就满了。满了之后握手第三步的时候server就忽略了client发过来的ack包(隔一段时间server重发握手第二步的syn+ack包给client),如果这个连接一直排不上队就异常了。

但是不能只是满足问题的解决,而是要去复盘解决过程,中间涉及到了哪些知识点是我所缺失或者理解不到位的;这个问题除了上面的异常信息表现出来之外,还有没有更明确地指征来查看和确认这个问题。

深入理解TCP握手过程中建连接的流程和队列

(图片来源:http://www.cnxct.com/something-about-phpfpm-s-backlog/)

如上图所示,这里有两个队列:syns queue(半连接队列);accept queue(全连接队列)。

三次握手中,在第一步server收到client的syn后,把这个连接信息放到半连接队列中,同时回复syn+ack给client(第二步);


第三步的时候server收到client的ack,如果这时全连接队列没满,那么从半连接队列拿出这个连接的信息放入到全连接队列中,否则按tcp_abort_on_overflow指示的执行。

这时如果全连接队列满了并且tcp_abort_on_overflow是0的话,server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步),如果client超时等待比较短,client就很容易异常了。

在我们的os中retry 第二步的默认次数是2(centos默认是5次):

如果TCP连接队列溢出,有哪些指标可以看呢?

上述解决过程有点绕,听起来懵,那么下次再出现类似问题有什么更快更明确的手段来确认这个问题呢?(通过具体的、感性的东西来强化我们对知识点的理解和吸收。)

netstat -s

比如上面看到的 667399 times ,表示全连接队列溢出的次数,隔几秒钟执行下,如果这个数字一直在增加的话肯定全连接队列偶尔满了。

ss 命令


上面看到的第二列Send-Q 值是50,表示第三列的listen端口上的全连接队列最大为50,第一列Recv-Q为全连接队列当前使用了多少。

全连接队列的大小取决于:min(backlog, somaxconn) . backlog是在socket创建的时候传入的,somaxconn是一个os级别的系统参数。

这个时候可以跟我们的代码建立联系了,比如Java创建ServerSocket的时候会让你传入backlog的值:


(来自JDK帮助文档:https://docs.oracle.com/javase/7/docs/api/java/net/ServerSocket.html)

半连接队列的大小取决于:max(64,  /proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的os会有些差异。

我们写代码的时候从来没有想过这个backlog或者说大多时候就没给他值(那么默认就是50),直接忽视了他,首先这是一个知识点的盲点;其次也许哪天你在哪篇文章中看到了这个参数,当时有点印象,但是过一阵子就忘了,这是知识之间没有建立连接,不是体系化的。但是如果你跟我一样首先经历了这个问题的痛苦,然后在压力和痛苦的驱动自己去找为什么,同时能够把为什么从代码层推理理解到OS层,那么这个知识点你才算是比较好地掌握了,也会成为你的知识体系在TCP或者性能方面成长自我生长的一个有力抓手。

netstat 命令

netstat跟ss命令一样也能看到Send-Q、Recv-Q这些状态信息,不过如果这个连接不是Listen状态的话,Recv-Q就是指收到的数据还在缓存中,还没被进程读取,这个值就是还没被进程读取的 bytes;而 Send 则是发送队列中没有被远程主机确认的 bytes 数。


netstat -tn 看到的 Recv-Q 跟全连接半连接没有关系,这里特意拿出来说一下是因为容易跟 ss -lnt 的 Recv-Q 搞混淆,顺便建立知识体系,巩固相关知识点 。  

比如如下netstat -t 看到的Recv-Q有大量数据堆积,那么一般是CPU处理不过来导致的:


上面是通过一些具体的工具、指标来认识全连接队列(工程效率的手段)。  

实践验证一下上面的理解

把java中backlog改成10(越小越容易溢出),继续跑压力,这个时候client又开始报异常了,然后在server上通过 ss 命令观察到:

按照前面的理解,这个时候我们能看到3306这个端口上的服务全连接队列最大是10,但是现在有11个在队列中和等待进队列的,肯定有一个连接进不去队列要overflow掉,同时也确实能看到overflow的值在不断地增大。

Tomcat和Nginx中的Accept队列参数

Tomcat默认短连接,backlog(Tomcat里面的术语是Accept count)Ali-tomcat默认是200, Apache Tomcat默认100。

Nginx默认是511


因为Nginx是多进程模式,所以看到了多个8085,也就是多个进程都监听同一个端口以尽量避免上下文切换来提升性能   

总结

全连接队列、半连接队列溢出这种问题很容易被忽视,但是又很关键,特别是对于一些短连接应用(比如Nginx、PHP,当然他们也是支持长连接的)更容易爆发。 一旦溢出,从cpu、线程状态看起来都比较正常,但是压力上不去,在client看来rt也比较高(rt=网络+排队+真正服务时间),但是从server日志记录的真正服务时间来看rt又很短。

jdk、netty等一些框架默认backlog比较小,可能有些情况下导致性能上不去。

希望通过本文能够帮大家理解TCP连接过程中的半连接队列和全连接队列的概念、原理和作用,更关键的是有哪些指标可以明确看到这些问题(工程效率帮助强化对理论的理解)。

另外每个具体问题都是最好学习的机会,光看书理解肯定是不够深刻的,请珍惜每个具体问题,碰到后能够把来龙去脉弄清楚,每个问题都是你对具体知识点通关的好机会。

最后提出相关问题给大家思考

  1. 全连接队列满了会影响半连接队列吗?

  2. netstat -s看到的overflowed和ignored的数值有什么联系吗?

  3. 如果client走完了TCP握手的第三步,在client看来连接已经建立好了,但是server上的对应连接实际没有准备好,这个时候如果client发数据给server,server会怎么处理呢?(有同学说会reset,你觉得呢?)

提出这些问题,希望以这个知识点为抓手,让你的知识体系开始自我生长。

参考文章

http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html

http://www.cnblogs.com/zengkefu/p/5606696.html

http://www.cnxct.com/something-about-phpfpm-s-backlog/

http://jaseywang.me/2014/07/20/tcp-queue-%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/

http://jin-yang.github.io/blog/network-synack-queue.html#

http://blog.chinaunix.net/uid-20662820-id-4154399.html


三次握手对方未接收到信息 一般来说都是服务端被动监听,客户端主动发起连接请求。 server未收到第一次握手信息:客户端通过connect()系统调用发起建立连接请求,如若由于某种原因server没有收到请求建立连接报文(SYN同步报文),那么很显然server端什么也不会发生(因为server对这一切毫不知情),下面讨论下client端做出的反应: 1.1 如果client发送的SYN报文或者server回应的确认报文在通信链路中丢失,客户端隔了一段时间t1没有收到回应,那么会隔更长的一段时间t2(一般为2t1)重新发送SYN 阅读详情

相关推荐

TCP/IP超详细总结

网络的基础知识 一、协议 1、简介: 在计算机网络与信息通信领域里,人们经常提及“协议”一词。互联网中常用的具有代表性的协议有IP、TCP、HTTP等。而LAN(局域网)中常用的协议有IPX/SPX”等。 下面通过通俗一点的方式来解释一下协议: 有三个人A、B、C。A只会说汉语、B只会说英语、而C既会说汉语又会说英语。现在A与B要聊天,他们之间该如何沟通呢?若A与C要聊天,又会怎样?这时...

java梦工厂 1643

三次握手建立失败的几种情况以及三次握手的理解

上面的图是阻塞式socket进行通信的过程,阻塞的时候是操作系统内核网络协议栈在工作 调用 connect 函数将激发 TCP 的三次握手过程,而且仅在连接建立成功或出错时才返回。其中出错返回可能有以下几种情况: 1、三次握手无法建立,客户端发出的 SYN 包没有任何响应,于是返回 TIMEOUT 错误。这可能是对应的服务端 IP 写错 2、客户端收到了 RST(复位)回答,这时候客户端会立即返回 CONNECTION REFUSED 错误。。这可能是客户端发送连接请求时的请求端口写错。 产生 RST 的.

hanhan的博客 9053

1553B通信项目开发笔记(一)协议概述

最近接了个项目,需要用1553B协议通信,仅作为RT端口进行通信,控制器采用ARM 使用芯片为国产的BU61580芯片,功能和引脚和DDC的61580完全一致。

u010396127的博客 2万+

使用wireshark查看TCP三次握手

1、打开wireshark,输入http过滤: ip.addr == 47.102.168.177 and tcp。客户端,发送一个TCP,标志位为 [SYN] Seq = 0, 代表客户端请求建立连接。4、看到框出来的三条记录,即为wireshark截获到了TCP三次握手的三个数据包。服务器发回确认包,标志位为 [SYN,ACK] Seq=0,ACK = 1。客户端再次发送确认包[ACK] Seq=0,ACK = 1。如上面通过了TCP三次握手,建立了连接。2、打开浏览器,输入网址回车。

春风化雨 7510

QT插件学习系列(一) 初识QtPlugin

QT插件学习系列(一) 初识QtPlugin 1、 概述 为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢? 导出的动态库如果缺失,程序不能运行。但插件可以。 同一套代码,即可分别在 windows 下和 linux 下生成插件。 QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。 高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的插件基类,例如现有的 QTSqlDriver,因此你可也以编写自己的 QTStyle 扩展 QT。 低级

L_Andy的专栏 3113

网络设备心跳线带宽高导致虚拟化平台不稳定的问题处理

本文记录了网络设备心跳线带宽高导致虚拟化平台不稳定的问题处理一例。

forestqq的博客 2228

【面试心经】——蔚来汽车Linux 岗位开发 02

第四次挥手:客户端收到从服务器端发出的TCP报文,确认了服务器端已做好释放连接的准备,于是再次向服务端发送报文表示接收到服务端准备好释放连接的信号,并进入TIME-WAIT阶段等待2MSL ( 最大报文生存时间) 后再断开连接,服务端收到最终确认报文后立即断开连接,双方断开TCP连接。第三次挥手:服务端自从发出ACK确认报文之后,经过了关闭等待阶段,做好了释放服务器端到客户端方向上的连接准备,再次向客户端发出一段TCP报文表示已经准备好释放连接了(没有数据需要传输给客户端了),然后进入最后确认状态。

点滴路程 1782

UE5新手必看:3种UI定位方法实战(含蓝图配置截图)

本文为UE5新手详细解析了三种核心UI定位方法:屏幕空间、场景空间和世界空间。通过实战蓝图配置与控件操作,指导开发者如何根据HUD、角色血条、3D物体标记等不同应用场景,正确选择并配置UI的定位方式,以实现清晰的信息传递与沉浸式体验。

weixin_29018815的博客 473

【Netty】网络协议与BIO/NIO编程

做为Netty系列第一篇文章,简要介绍学习Netty需要掌握的计算机网络知识,面试和学习中的重点TCP和UDP两个协议,并实现BIO编程对不同协议(TCP/UDP)的开发方法,同时也详细介绍了NIO编程的开发步骤和开发方法供读者参考。...

小明的Java问道之路 2449

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 327

第4篇:使用 NModbus 库快速搭建 Modbus TCP 通信(从零开始用 C# 开发 Modbus 上位机)

本文介绍了如何使用 NModbus 库快速搭建 Modbus TCP 上位机通信程序。通过安装 NModbus4 NuGet 包,开发者可以轻松实现 Modbus TCP 连接,无需手动处理底层协议细节。文章详细演示了核心功能实现: 创建 TCP 客户端连接设备 读取保持寄存器(功能码0x03) 写入单个寄存器(功能码0x06) 关闭连接释放资源 提供完整C#示例代码,包含初始化连接、数据读写等关键操作,帮助开发者快速构建Modbus TCP通信应用。相比手动实现,NModbus库大幅简化了开发流程,特别适

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1045

Naga 基于NIO的socket框架

公司游戏端和游戏后台端的通信用的是基于NIO的socket框架。 由于从未使用过socket 然后最近要接触到这方面的工作了,拿到代码看了一下流程。 整理如下: 1.Naga框架中的常用类 NIOService :创建NIO流的服务对象 NIOServerSocket :相当于IO中ServerSocket NIOSocket 相当于IO中Socket ServerSocketObserverAd...

HelloQ的博客 660

AUTOSAR进阶图解==>AUTOSAR_SWS_BSWGeneral

本文详细解析AUTOSAR基础软件(BSW)模块的通用规范,涵盖其分层架构、配置管理、初始化流程和状态转换机制。AUTOSAR采用清晰的分层设计,包括应用层、服务层、ECU抽象层和微控制器抽象层,各层模块通过标准化接口交互。BSW模块配置采用类型化定义,支持预初始化、初始化和后期构建配置。文档还阐述了模块初始化流程中的依赖管理,以及运行时的状态转换与错误处理机制,为汽车电子控制单元的标准化开发提供规范指导。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1128

Java网络编程面试题

Java网络编程面试题 1、tcp和udp的区别1 2、tcp连接建立的时候3次握手,断开连接的4次握手的具体过程1 3、什么是同步?什么是异步?2 4、.什么是阻塞?什么是非阻塞?5 5、什么是阻塞IO?什么是非阻塞IO?6 6、...

2253

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

丨汀、的博客 511

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

nio框架netty在项目中的应用

背景: 省分短信发送每天都差不多要1000W条上下,遇到特殊节假日和政府通告时量会更大!boss系统中存放的是短信发送内容,而真正完成发送短信指令动作是的华为方做的短厅,这么大的通信量选择了netty来完成数据传输并自定义了一套基于netty的SGIP协议进行通信; 省分boss系统—>短信营业厅(); 基本知识 2.1 TCP/IP网络协议 网上很多有关这个协议的解释,自行googl

不断出发,永无抵达! 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JAVA BIO 和 NIO 网络编程揭秘

OSI网络七层模型 为使用不同计算机厂家的计算机能够相互通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。 ## 各层的主要功能 传输控制协议TCP 传输控制协议(TCP)是Internet一个重要的传输协议。TCP提供面向连接,可靠,有序,字节流传输服务。应用程序在使用TCP之前,必须先建立TCP连接。 TCP握手机制 用户数据报协议UDP 用户数据报协议UD...

TK_XIEBIN的博客 779

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

网络编程之BIO、NIO

已经很久没更新博客了,惭愧。在这之前先讲一下面试可能会问到的三次握手与四次挥手,也就是Tcp如何建立连接? 假设A城市往B城市发送信件,先A发到B,B收到,在发给A,在A发给B,建立起初步通信。三次挥手是为了证明A,B的收信和发信能力是ok的,这样就证明连接是通常的。 第一次握手:当A发到B时,B收到信后,此时B城市就明白了,A城市的发信能力和B城市...

蜡笔小明的博客 759

网络编程和NIO

网络编程和NIO 一、 网络编程入门 1.软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构。常见程序有QQ、迅雷等软件。 特点: 客户端和服务器是分开的,需要下载客户端,对网络要求相对低, 服务器压力小,开发和维护成本高,相对稳定 B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 特点:没有客户端,只有服务器,不需要下载客户端,直接通过浏览器访问, 对网络要求相对高, 服务器压力很大,相对不稳定,开发和

qq_44736296的博客 257

【网络编程和NIO】

day12【网络编程和NIO】 今日内容 网络编程三要素------>了解 IP 端口号 协议 TCP通信----->重点掌握 模拟两台电脑相互之间互发信息(聊天) 模拟文件上传 模拟B/S结构软件的服务器 NIO------>理解 Buffer缓冲数组 Channel通道 Selector选择器 NIO2(AIO)------>理解 异步非阻塞 第一章 网络编程入门 1.1 软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务

Requests 203

Java网络编程原理与实践--从Socket到BIO再到NIO

本文首先介绍了Socket,给出了几个实例多角度的感受Socket使用,基于Socket的问题提出BIO,但是BIO只能解决部分问题,同时会有资源泄露问题,由此给出NIO的基本组件和使用。

Artisan_w 1854

网络通信概述到Socket网络编程及NIO通信编程模式

套接字就是网络通信的数据收发的出入接口,通过套接字相互建立数据管道,执行数据的收发功能,可以理解为收发集装箱的马头、收发信件的邮局、收发包裹的快递站。 网络通信的分层 网络通信三要素 HTTP请求消息和响应消息 IP地址用来给一个网络中的计算机设备做标识唯一的编号 端口号:可以唯一标识设备中的应用程序(进程) 网络协议是计算机网络客户端与服务端通信必须事先约定和彼此遵守的通信规则

weixin_63566741的博客 700

NIO

1.1基本概念 socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求 Socket和ServerSocket类库位于java.net中,ServerSocket位于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务器端或者在客户端而...

业精于勤,荒于嬉 270

七层协议和TCP/IP协议、三次握手四次挥手、BIO、NIO(Netty前置)详细完整版

一 、基础 1.1 概述 网络分层中的IOS七层模型、TCP/IP协议族、TCP、IP,这些有什么不同 .TCP协议通信过程中的三次握手和四次挥手到底是什么流程? 1.2 软件架构 在生活中,我们经常用QQ、微信、百度云盘、Goole、IE浏览器、火狐浏览器…。 可以总结为两大类,c/s(客户端/服务端)和b/s(浏览器/服务器)结构。这两种架构是两台计算机通过某中协议来网络中进行通信。 1.3 基本概念(通信协议/ip/端口) 通信协议:就是定义了在网络中计算机之间进行通信的一种规则。

嵌入式Linux内核的博客 946

day12【网络编程和NIO】

# day12【网络编程和NIO】 ## 今日内容 - 网络编程三要素------>了解 - 协议(TCP,UDP) - IP - 端口号 - TCP通信----->重点掌握 - 模拟两台电脑之间互发信息(聊天) - 模拟文件上传 - 模拟B/S结构软件的服务器(了解) - NIO------>理解 - Buffer缓冲数组 - Channel通道 - Selector选择器------>难点 - NIO2(AIO)------>理解--

weixin_47395717的博客 214

Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)

本文探讨了Socket网络编程的核心概念与技术实现。首先介绍了TCP连接的三次握手和断开四次握手机制,以及Java中ServerSocket和Socket类的关键方法。通过BIO(阻塞式IO)实现案例展示了多线程模型存在的资源消耗问题,进而引入NIO(非阻塞式IO)单线程解决方案,使用Selector实现高效事件监听。虽然NIO提升了并发性能,但代码复杂度较高,文章最后指出Netty框架将作为更优解决方案在后续介绍。全文从基础到进阶,循序渐进地分析了不同IO模型的优缺点。

众纳百川的博客 1512
上一篇: Netty处理TCP粘包、拆包问题之DelimiterBasedFrameDecoder
下一篇: Netty的TCP粘包、拆包问题之FixedLengthFrameDecoder
Howinfun
博客等级 码龄10年 165粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值