5netty(十八)《netty粘包消息定长 实践》中,沾包哪里来的?nagle in netty
在netty粘包(一)消息定长 实践中,netty出现沾包,用了FixedLengthFrameDecoder(14)解决沾包,本次将FixedLengthFrameDecoder(14)干掉,然后抓包看是什么原因导致沾包,是客户端搞在一起了,还是服务端没有及时取走导致沾包
server:
server start ......
channelActive
RESPONSE--------I am client,--; @ 1
RESPONSE5--------转发:I am client,--; @ 1
RESPONSE--------I am client,--; @ 2
RESPONSE5--------转发:I am client,--; @ 2
RESPONSE--------I am client,--I am client,--I am client,--; @ 3
RESPONSE5--------转发:I am client,--I am client,--I am client,--; @ 3
channelInactive
client:
server response : I am client,--
server response : I am client,--
server response : I am client,--I am client,--I am client,--
显示1 2 个包一来一回,第3到5个包client是分开发的,服务端read(用户进程晚了)未及时导致沾包,合成一个包返回给client了,所以并不是客户端缓冲区满了才一起发,包是一个个发的
这里有一个问题,为什么9-11被连续发送了,nagle被禁用了?
原来,netty默认禁用nagle算法:
TCP_NODELAY TCP参数,立即发送数据,默认值为Ture(Netty默认为True而操作系统默认为False)。该值设置Nagle算法的启用,改算法将小的碎片数据连接成更大的报文来最小化所发送的报文的数量,如果需要发送一些较小的报文,则需要禁用该算法。Netty默认禁用该算法,从而最小化报文传输延时。
/** * **************************** * 导致发送端沾包 */ bootstrap.option(ChannelOption.TCP_NODELAY, false);
加上这段代码,使netty client使用nagle
client:
server response : I am client,--
server response : I am client,--I am client,--I am client,--I am client,--
server:
server start ......
channelActive
RESPONSE--------I am client,--; @ 1
RESPONSE5--------转发:I am client,--; @ 1
RESPONSE--------I am client,--I am client,--I am client,--I am client,--; @ 2
RESPONSE5--------转发:I am client,--I am client,--I am client,--I am client,--; @ 2
channelInactive
发现:
1)netty client启用nagle后,不再出现psh包连续发送情况
2)出现了发送端攒在一起发送导致沾包的情况,与socket缓冲区与沾包 nagle in tcp 中 https://blog.csdn.net/wdscq1234/article/details/52432095 Hello 5个包分开与nagle 《TCP-IP详解:Nagle算法》描述情况相似
总结:
1 本文对此前出现的netty沾包问题,抓包实验
2 在netty默认禁用nagle情况下,5个包由客户端分别发送,且出现后3个包未等待服务端ack而连续发送PSH包,服务端1-1-3读取造成沾包
3 在netty启用nagle情况下,5个包被客户端整理,由1-4形式发送,发送端即造成沾包