Netty数据包大小的确定

本文详细探讨了Netty在处理TCP和UDP数据包时如何确定数据包大小。在TCP中,Netty使用AdaptiveReceiveBufferSizePredictor动态调整接收数据包大小,最大值为8192字节。而UDP默认最大数据包大小为768字节,可通过设置FixedReceiveBufferSizePredictorFactory调整。此外,文章还讨论了TCP分包、MTU、MSS等相关概念,并提出了数据传输的实现方案。
摘要由CSDN通过智能技术生成

Netty接收包大小的确定

  1. 技术点描述

    1. 关于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的数据包

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值