继上文,我们使用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. Cocos Creator 中 _worldMatrix 到底是什么(中)

    Cocos Creator 中 _worldMatrix 到底是什么(中) 1. 中篇摘要 在上篇中主要做了三件事 简单表述了矩阵的基本知识,以及需要涉及到的三角函数知识 推导了图形变换中 位移 .旋 ...

  2. Logstash 入门

    一.简介 Logstash 是开源的服务器端数据处理管道,支持从不同来源采集数据,装换数据,并将数据发送到不同的存储库中. Logstash 项目诞生于 2009 年 8 月 2 日.其作者是世界著名 ...

  3. LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统

    概述 LIGHTX-CMS 是我基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客发布系统. 项目本身可以拿来部署个人博客网站,同时我认为其也适合用以新手学习 Node ...

  4. Spring Data - Spring Data JPA 提供的各种Repository接口

    Spring Data Jpa 最近博主越来越懒了,深知这样不行.还是决定努力奋斗,如此一来,就有了一下一波复习 演示代码都基于Spring Boot + Spring Data JPA 传送门: 博 ...

  5. 身为一个 CS专业的留学生,你还在为堆积如山的编程assignment而发愁吗?

    每个人都渴望圆梦,当我们看见梦想在别人身上实现时,总在抱怨幸运之神为何不眷顾自己:其实更多的时候,梦想就在你身边的不远处,只要你迈出正确的步伐. 记得刚入大学时,意气风发.我以全班前几名的优异成绩考入 ...

  6. 利用X-Forwarded-For伪造客户端IP漏洞成因及防范

    内容转载自叉叉哥https://blog.csdn.net/xiao__gui/article/details/83054462 问题背景 在Web应用开发中,经常会需要获取客户端IP地址.一个典型的 ...

  7. vue订阅者模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Vue学习系列(四)——理解生命周期和钩子

    前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过 ...

  9. Swagger解决你手写API接口文档的痛

    首先,老规矩,我们在接触新事物的时候, 要对之前学习和了解过的东西做一个总结. 01 痛     苦 不做.不行 之前,前后端分离的系统由前端和后端不同的编写,我们苦逼的后端工程师会把自己已经写完的A ...

  10. Elastic search集群新增节点(同一个集群,同一台物理机,基于ES 7.4)

    一开始,在电脑上同一个集群新增节点(node)怎么试也不成功,官网guide又语焉不详?集群健康值yellow(表示主分片全部可用,部分复制分片不可用) 最后,在stackoverflow上找到了答案 ...