继上文,我们使用ZeroC Ice传递大块数据时,通常有两种做法,一种是一次请求,另一种就是分多次请求(,这种做法在官方文档有例子)。选哪一种根据需要而定。

当分多次请求来完成一大块数据,到底选择每次请求多大的数据合适呢?

首先清楚下面几点,每次请求应该用 two-way进行,也就是 request - reply 模式来确保数据发送。one-way模式是只管单向发送的。那么就有下面几个点

一个最小的Ice reply包大小为 79

一个Ice心跳包大小为 68

一个分段的ack包大小为 60

无论是返回 void的 reply包,还是心跳包,都必须通过 Ice环境和 Ice协议,也就是必须通过 POLL_OUT事件,唤醒线程池去发送。这里有隐藏的问题,在某些机器上的linux,POLL_OUT事件并不正常工作。

分段的ack动作,完全由协议栈的tcp驱动完成,不会像应用层依赖epoll事件去发送数据,受POLL_OUT事件不正常而影响。

如果一次请求过小,我们假定为了迎合链路去发送数据,将一次请求的数据量定为小MTU,假设是1K,那么每发送1K就要接收端在应用层响应并通过 Ice环境(epoll线程池)发送一个reply包,最小体积为 79。

为了减少接收端频繁在应用层响应,(最主要还是epoll 等待的POLL_OUT事件),我们就要适当增加一次请求的数据体积。这时候tcp层就需要将请求包分段发送,当请求包大小刚好跨越 MSS限制时,这样就会造成浪费,剩下的小部分数据不得不进行一次分段。为了提高利用,最好就是一次请求在 MSS 限制内尽可能的大, 最好是MTU的倍数。

从上面的例图,一个10K分段的ack包,在1300地递增,也就是分段以多个ip包,每个1300地到达接收端。并且到达是不按时间顺序的,但是接收端可以重组这个分段的ip包。分段的ack包的seq并没有任何改变,窗口也不会变化。

这里就有一问题,我们必须查询 socket 的 MTU 以及 MSS,但是 ZeroC Ice完全将底层 socket 与使用用户隔离,所以当你使用这个中间件后,你就不得不忍受这种封装。

另外再次声讨一下,sequence<byte> 在所有平台上工作良好,除子php平台上,是鸡肋的整数数组,这最少要损耗10倍的空间。

2018.02.14 补充:

Ice.MessageSizeMax是接收方的限制属性,当一个twoway请求,client 和 server都扮演一次接收方。client request to server,server 就是 request message 的接收方。server reply to client,client 就是 reply message 的接收方。当请求或响应的消息包的数据太大时,都要调整两边的 Ice.MessageSizeMax。当你在一方捕捉到关于这个属性的异常,不是限制了发送,而是限制了接收,换句话说不是发不出去,而是拒绝了接收从对方来的消息。

ZeroC Ice发送大数据的更多相关文章

  1. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  2. 发送大数据时,PDU的问题?

    昨天发现通过 Ice发送请求传递一个大块数据时,当请求的体积大于1.2M后,直接抛出异常Connection Lost,对方peer或是断开了.通过防火墙配置排查,以及对同一网络同一机器的php服务p ...

  3. python网络编程-socket发送大数据包问题

    一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...

  4. socket对于大数据的发送和接收

    大数据是指大于32K或者64K的数据. 大数据的发送和接收通过TSTREAM对象来进行是非常方便的. 我们把大数据分割成一个个4K大小的小包,然后再依次传输. 一.大数据的发送的类语言描述: 1)创建 ...

  5. ZeroC Ice 暂记

    摘自: http://weibo.com/p/1001603869896789339575 原文地址: http://www.oschina.net/question/865233_242146 吴治 ...

  6. 开发zeroc ice应用入门(java开发ice应用,python开发ice应用,java与python结合开发ice服务)

    ice作为一种rpc框架,为主流平台设计,包括Windows和Linux,支持广泛的语言,包括C++,Java,C#(和其他.Net的语言,例如Visual Basic),Python,Ruby,PH ...

  7. 大数据量冲击下Windows网卡异常分析定位

    背景 mqtt的服务端ActiveMQ在windows上,多台PC机客户端不停地向MQ发送消息. 现象 观察MQ自己的日志data/activemq.log里显示,TCP链接皆异常断开.此时尝试从服务 ...

  8. YARN-MR 大数据第二天

    大数据第二天 1.YARN(管理和调度集群中的各类资源) 1.1 产生的背景: 1.直接源于MR版本1的缺陷(如:单点故障.难以支持MR之外的计算框架等) 2.多计算框架各自为站,数据共享困难(如:M ...

  9. Hadoop 大数据第一天

    大数据第一天 1.Hadoop生态系统 1.1 Hadoop v1.0 架构 MapReduce(用于数据计算) HDFS(用于存储数据) 1.2 Hadoop v2.0 架构 MapReduce(用 ...

随机推荐

  1. Js正则学习笔记

    众所周知正则表达式是十分强大的存在,编码时能够熟练使用正则能够极大的简化代码,因此掌握正则非常有必要. 创建正则语法: // 创建正则的两种方式// 1.构造函数 let reg = new RegE ...

  2. CheckBox状态多选

    前: <StackPanel Margin="> <Label FontWeight="Bold">Application Options< ...

  3. MarkDown的常用语法

    个人比较喜欢Markdown的语法,常用来做一些笔记,下面就简单介绍一下它的语法. 概览 宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown ...

  4. SpringCloud之Feign负载均衡(四)

    整合Feign pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <arti ...

  5. Unity5-ABSystem(四):AssetBundle依赖

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lodypig/article/detai ...

  6. Hibernate 查询方式、JPA查询方式

    hibernate 查询方式: OID 查询 对象导航查询 HQL 方式查询 QBC方式查询 原生SQL方式查询 JPA 查询方式: OID 查询 对象导航查询 JPQL 方式查询 CriteriaB ...

  7. 20191106-使用pyttsx对文本进行语音输出

    实现pyttsx文字转语音的开源库调用 参考: 1.  https://blog.csdn.net/liuyubo23/article/details/83990532 2.  https://www ...

  8. 图片瀑布流,so easy!

    什么是图片瀑布流 用一张花瓣网页的图片布局可以很清楚看出图片瀑布流的样子: 简单来说,就是有很多图片平铺在页面上,每张图片的宽度相同,但是高度不同,这样错落有致的排列出 n 列的样子很像瀑布,于是就有 ...

  9. 可爱精灵宝贝:dp

    拒绝听搜索.etc水过的.数据太弱了(尽管考场上我凭借数据太水骗了好多分) 我讲的思路和下发的题解一样.(因为我不会所以只能颓它啊) 首先你要相信这题精灵就100个,真的只有100个,这次数据范围没错 ...

  10. ssm整合的登录

    新建一个web工程,主要结构如下: 数据库创建如下: 控制层的代码FormController 类 package codeRose.controller; import org.springfram ...