异步传输中的批量发送问题

来源:互联网 发布:想给自己淘宝店铺刷单 编辑:程序博客网 时间:2024/05/16 13:40
网络传输涉及发送与接收两方面, 其中接收较为简单, 而发送却非常复杂, 通常会涉及一二个难点;


一: 异步发送时的数据乱序列问题


    如果不等上一次数据发完就进行下一次的异步发送, 无法对包的先后顺序进行控制,  所以接收端将无法解析包,
导致接收的数据没有任何意义;  针对这个现象, 有人提出弄一个队列, 向队列投递数据, 发送完队列中的一个再发
下一个; 这种方法是可以解决问题的, 但完全损害了采用异步发送的初衷, 如果这样还不如直接采用同步发送来得好;
这样还可以省一个队列; 如果采用队列, 数据又不能发送出去, 就可能产生内存的暴涨问题, 又如何解决; 

如果从socket层面来看, 这个问题是没有好的解决方法的, 但如果从我们发送的数据方面来着手, 就很容易解决了;
为了使接收端能解析接收到的乱序包, 必须为每个包的包头添加对应的标志符, 指定这个包的用处, 及收到后如何重新
组装成一个新的包; 这样我们就可以无顾忌的发送了;  但这也造成了网络资源的浪费, 因为每个包可能会多一两个字节;
一般而言, MAC 层接收的包数据大概在1400左右, 就相当于多产生了 1/700 的流量; 当然我个人觉得这个附加流量是非常
小的了. 所以这种方案最划算;

二: 异步发送时, 数据发送丢失的现象:


    有时候发送一个数据包, 可能有点大, 一次性发不完, 需要多次发送, 而异步投递有一个回调函数, 我们可以把发送的字节
及剩余的字节数,还有本次发送负责的数据块 传递进来; 这样我们在回调里就再次进行发送; 让剩下的数据发完; 当然如果怕
    乱序, 还是要加上相应标志位来传输; 通常为了保证数据发送能一次性完成, 都定义成以太网的包大小即可, (1400个字节);


    第二个难点, 其实并不难; 只是要注意, 发送的时候不要采用临时内存, 免得没发送完第二次发送时内存无效的现象发生;
0 0
原创粉丝点击