Netty接收包大小的确定
技术点描述
关于NETTY内部TCP、UDP数据包问题
当客户端数据量过大时,TCP协议会自动分包进行数据传输(何时分包,如何分包,每包大小尚未研究), 使用netty做server时,netty会根据当前接收到的数据包大小(适用于当前连接),自动调整下次接收到数据包大小(TCP默认大小为1024,当数据包不超过1024时,会一次接收完毕,当超过1024时,下次自动增长为2048,然后下次增长为3072,然后下次增长为4096;然而,再往下增长,则增长了2048变为6144,然后变为8192,数据包增长到8192就已经是极限了(8KB),当客户端数据再大时,接收到的数据包也不再改变。此后,只要发送的数据包大小不超过8192,netty server一律按照一个包接收,不再分包)
确定TCP接收包大小的类AdaptiveReceiveBufferSizePredictor,其中设置默认的接收数据包大小的变量static final int DEFAULT_INITIAL = 1024;
当设置的此值小于1024时,设置的值不起作用,数据接收时仍按照最大1024接收第一个数据包
对于TCP的分包bootstrap.setOption("receiveBufferSizePredictorFactory", new FixedReceiveBufferSizePredictorFactory(65535));不起任何作用,且
TCPSERVER_BOOTSTRAP.setOption("receiveBufferSizePredictorFactory",new AdaptiveReceiveBufferSizePredictorFactory(64,2048,65535));不起任何作用。
此处均通过netty做的客户端及TCP调试助手测试。
netty控制了每次接收到的数据包的大小,然而对于发送方,netty框架不可能知道要发送的数据包的大小,此时,数据包是一次传输到netty_server还是分次传输取决于网络链路情况(拥挤或空闲),如果一次性传输(一个包),此时,netty_server可控制将此包按照可接收的包大小进行截取分包,而如果是分次传输(分包),则当netty_server接收到数据包后,会进行组包(此时,组包的顺序问题待定),举例如下:
假设:TCP_client发送数据包大小为3000 byte;分了四次传输,730,770,680,820;TCP_server设置的接收数据包大小为1024,
则对于当前连接(TCP不中断,保持连接):服务器端接收到两个数据包(分两次),第一次,接收到1024大小的数据包,第二次接收到1976大小的数据包。
如果保持连接再次发送,则第一次收到2048大小的数据包,第二次收到952大小的数据包。
如果继续保持连接再次发送,则server仅收到一个大小为3000的数据包