类似文章:解决用netty去做web服务时,post长度过大的问题

现象:当客户端给server发送的请求体较大时,服务直接给客户端返回reset包。

tcpdump:

应用还没有完全收上去,就close这个fd,造成发送reset包。

https://github.com/torvalds/linux/blob/master/net/ipv4/tcp.c#L2384

netstat -s |grep "connections reset due to early user close" 这个计数器一直在增加

因为返回的 RST 包有窗口大小,所以这是主动调用的 tcp_send_active_reset, 代码里有 bug,读缓冲里有数据没读完直接 close 了。

程序里判断如果msg不可读,就把channel close掉。而当请求体过大时,netty会把msg设置为chunked,而chunked的msg也是不可读的,结果就导致了问题:缓冲区还有数据,但不可读,程序就把channel close了,操作系统这时会发送reset包,导致客户端收到reset包。

netty3的HttpRequestDecoder注释:

    /**
* Creates a new instance with the default
* {@code maxInitialLineLength (4096}}, {@code maxHeaderSize (8192)}, and
* {@code maxChunkSize (8192)}.
*/
public HttpRequestDecoder() {
}

org.jboss.netty.handler.codec.http.HttpMessageDecoder#decode方法里:

            case READ_VARIABLE_LENGTH_CONTENT:
if (buffer.readableBytes() > maxChunkSize || HttpHeaders.is100ContinueExpected(message)) {
// Generate HttpMessage first. HttpChunks will follow.
checkpoint(State.READ_VARIABLE_LENGTH_CONTENT_AS_CHUNKS);
message.setChunked(true);
return message;
}
break;

修复方式,在netty handler pipeline里添加 HttpChunkAggregator

记一次netty http server给客户端返回reset包排除的更多相关文章

  1. 记一次netty的Hadoop和elasticsearch冲突jar包

    在一个项目中同时使用hbase和elasticsearch出现netty的jar包冲突的问题 事件: 在同一maven项目中使用hbase的同时又用了es 程序运行后出错 java.lang.NoSu ...

  2. Netty源码解析—客户端启动

    Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...

  3. Netty创建服务器与客户端

    Netty 创建Server服务端 Netty创建全部都是实现自AbstractBootstrap.客户端的是Bootstrap,服务端的则是ServerBootstrap. 创建一个 HelloSe ...

  4. Netty学习——基于netty实现简单的客户端聊天小程序

    Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...

  5. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  6. <Netty>(入门篇)TIP黏包/拆包问题原因及换行的初步解决之道

    熟悉TCP编程的读者可能都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制.木章开始我们先简单介绍TCP粘包/拆包的基础知识,然后模拟一个没有考虑TCP ...

  7. 利用Ring Buffer在SQL Server 2008中进行连接故障排除

    原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...

  8. zabbix 3.2.2 server端(源码包)安装部署 (一)【转】

    环境准备: 操作系统 CentOS 6.8 2.6.32-642.11.1.el6.x86_64 zabbix server 172.16.10.150 zabbix agent 172.16.10. ...

  9. CAS3.5.2 Server登录后返回用户信息详细解决方案

    单点登录(Single Sign-On, 简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.大家在使用时CA ...

随机推荐

  1. js如何保留两位小数,并进行四舍五入

    保留两位小数,并进行四舍五入使用js函数 toFixed() 函数传递一个参数(Number) Number就为需要保留小数的位数 具体实现代码 <script language="j ...

  2. rabbitmq:配置rabbitmq-management插件

    rabbitmq提供了一个图形的管理界面,用于管理.监控rabbitmq的运行情况,它是以插件的形式提供的,如果要启用需要启用插件 一.启用插件 rabbitmq-plugins enable rab ...

  3. Git submodule 子模块的管理和使用

    因为代码分了两个小组管理,一部分代码使用跨平台语言实现,一部分使用原生实现. 所以使用Git submodule 来进行管理. 1,查看/更新 子模块 $ git submodule add ssh: ...

  4. 搭建前端监控系统(六)JS截屏和录屏篇

    怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...

  5. Win10 Microsoft Store 微软商店 Error 0x00000193 解决方法

    0x00 前言 最近使用 CFW 过程中使用 Fiddle Web Debug 设置 Store 的回环代理的过程中发现无论是否使用代理,Store 都无法访问网络的问题,在最下面的提示中出现了 0x ...

  6. Centos6.5基于GPT格式磁盘分区

    1.查看分区 fdisk -l 2.设置分区类型未gpt格式. parted -s /dev/sdb mklabel gpt 3.基于ext3文件系统类型格式化. mkfs.ext3 /dev/sdb ...

  7. Win10如何设置插入鼠标后自动禁用触摸板

    首先按“Windows+R”键,调出运行窗口.  然后输入“control”然后点击“确定”!  打开Win10控制面板  在“控制面板”中,选择“硬件和声音”!  选择“AUSU Amart Ges ...

  8. Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇

    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Internet与中国 Internet最早来源于美 ...

  9. Xshell 配置密钥

  10. DT系统开发之-在线询盘信息的调取实现

    调用标签 <!--{tag("table=message&condition=status=3 and typeid=1&areaid=$cityid&cati ...