控制发送速率,首先是控制 TCP 立即发送,减少粘包,可以设置 NoDelay,或者手动 Flush。然后根据码率x发送间隔来获取较小的单次发送大小。

考虑到一秒是比较大的一个值,可以拆成 10 个 100ms。比如每隔 100ms 检查离上次发送以来,需要发送的字节数。间隔(或叫周期)太小,可能容易导致(中间路由)粘包。

预期发送速率可能太大,甚至超过网络送达能力,这就导致内容积压。可以在发送完成后立即检查发送用时是否超出发送间隔。超出则立即发送下一间隔的内容,甚至多个间隔一起发,理论上一次发送越多,可能越快一些。

预期发送码率也可能极小,比如 0.1B/s,这时候控制发送间隔就比较重要了。

可以设立一个最小间隔(周期),然后计算发送一个字节的间隔,取两者的较大值。

如果直接对 Write 进行封装,要考虑上一次结束(或实际发送)的时间。间隔太大,就只能认为最近一个间隔没有发送数据需要补发。更早的间隔只能抛弃,否则会有尖峰。

设置变量:首次触发时间,上次发送时间,间隔时间,速率,首次触发以来发送的字节数。