昨天发现通过 Ice发送请求传递一个大块数据时,当请求的体积大于1.2M后,直接抛出异常Connection Lost,对方peer或是断开了。通过防火墙配置排查,以及对同一网络同一机器的php服务post大于1.2M的请求没问题,排除了服务机器上的防火墙。剩下就是跟踪抓包了。

我的开发环境是 VMWare 12 上运行Centos 7,VM使用NAT桥接到主机的网络,作为开发的服务器。

我用 Ice接口分别发送 8M数据块 和 80K,以及 800K数据块的请求。8M数据块的请求失败,80K和800K数据块的请求成功了。在请求 8M数据块的情况时,连接果然断开了,收到了服务器peer发来的RST。

先看 8M数据块的请求的抓包:

请求的第一个 Segment, 开始于 seq=123, len=21888, ack=107,声明下一个 Segment的 seq=22011

服务器对第一个 Segment 进行了 Ack, seq关联分段过来的ack 107, ack关联分段过来的下一seq 22011

跟着是请求的第二个 Segment

然后服务器的 socket就回应了重置 RST, ack关联不上,并且发来了重置标志 RST

80K 数据块的情况是,小于 MSS,可以通过一个分段进行发送。

800K 数据块的情况,大于 MSS,需要通过多个分段进行发送。

从上面的几个图可以看到,抓包器并没有完全抓到所有的 Segment,出现了很多的 [TCP ACKed unseen segment],而实际上这只是抓包器统计分析给出的判断。所以回到最上面发送 8M数据块的情况,服务器向请求方发出RST并不是 [TCP ACKed unseen segment],它们之间不存在因果关系。

下面我用python再通过 TCP 直接发送 8M数据块,一切正常。

中途接收窗口为0, 因为我还没有在接收端进行recv读缓冲的操作,发送端一直向接收端询问窗口是否发生改变,直到最后接收端发来了窗口更新的通知

由于我在接收端从缓冲中读出了数据,接收窗口更新,发送端继续发送数据

现在接收端在同步读缓冲区,双方的MSS也发生了改变?增大到了 65534

整个过程,接收端并没有向发送端发出重置RST。

其实发出重置RST的一方,很有可能是提早强制关闭了连接,(不同于FIN的四次握手,不必等待发送缓冲发送完,RST发出后也不必等待对方回应就可以马上结束连接)。换句话说,就是服务器使用的中间件 ZeroC Ice提早结束了连接。通过打开中间件的网络跟踪选项,日志果然出现了连接关闭的记录,协议抛出异常,原因是中间件默认消息数据量上限是1M。

今次这个问题大费周折去排查,原因是将中间件的TraceLogger指向到了文件,stderr也重定向到文件,没能迅速及时观察到异常信息。

使用中间件,并不意味事件就变简单了,后面还不得不逐一面对中间件所带来的问题。虽然ZeroC Ice号称跨平台,但在某些平台上却不能如你所愿地进行。对于sequence<byte>在其它平台都默认映射为最优的容器,唯独的php平台,它映射为整形的数组,当我使用ZeroC Ice的php接口发送 8M的数据时,php日志记录下警告要分配134M内存。

wiki中的PDU,本文的PDU发生在传输层,也就是 segment for TCP。

OSI model[edit]

PDUs are relevant in relation to each of the first 4 layers of the OSI model as follows:[2]

Given a context pertaining to a specific OSI layer, PDU is sometimes used as a synonym for its representation at that layer.

发送大数据时,PDU的问题?的更多相关文章

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

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

  2. 话题讨论&amp;征文--谈论大数据时我们在谈什么 获奖名单发布

    从社会发展趋势的角度,非常明显大数据会是眼下肉眼可及的视野范围里能看到的最大趋势之中的一个.从传统IT 业到互联网.互联网到移动互联网,从以智能手机和Pad 为主要终端载体的移动互联网到可穿戴设备的移 ...

  3. ajax 发送json数据时为什么需要设置contentType: "application/json”

    1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别? contentType: "application/j ...

  4. ajax发送json数据时为什么需要设置contentType: "application/json”

    1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别?contentType: "application/js ...

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

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

  6. ZeroC Ice发送大数据

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

  7. java开发的web下载大数据时的异常处理

    同事用java开发了一个系统,其中有一个功能是下载大约10万笔数据到Excel中.当上线后,很多用户反映下载数据量大的时候就不能成功,但有时可以,所以结论就是系统不稳定,这个问题拖了很久没有解决. 在 ...

  8. WCF传送大数据时的错误“ 超出最大字符串内容长度配额”

    格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult.InnerException 消息是“反序 ...

  9. 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术

    在大数据项目开发过程中,ETL(Extract-Transform-Load)是必不可少.即便目前 JSON 非常流行,开发人员也有必定会有对远古系统的挑战,而 XML 格式的数据源作为经典存在浑身上 ...

随机推荐

  1. ubuntu 虚拟机设置静态ip

    $ sudo vim /etc/network/interfaces auto ens33   # 使用的网络接口,之前查询接口是为了这里     iface ens33 inet static    ...

  2. 【RabbitMQ 实战指南】一 延迟队列

    1.什么是延迟队列 延迟队列中存储延迟消息,延迟消息是指当消息被发送到队列中不会立即消费,而是等待一段时间后再消费该消息. 延迟队列很多应用场景,一个典型的应用场景是订单未支付超时取消,用户下单之后3 ...

  3. Ribbon - Customizing the Ribbon Client

    自定义Ribbon算法 自定义Ribbon 官网文档链接    Ribbon github源码地址 <!--ribbon配置--> <dependency> <group ...

  4. 【Spring Cloud】微服务架构选型方案

    1.技术架构 2.组件介绍 1.服务注册与发现——Eureka 服务注册与发现中心采用Eureka,以AP为核心的高可用注册中心,保证高可用性和最终一致性,server之间互相注册的replicate ...

  5. day10整理(面对对象,过程,类和对象)

    目录 一 回顾 (一)定义函数 (二)定义函数的三种形式 1.空函数 2.有参函数 3.无参函数 (三)函数的返回值 (四)函数的参数 1.形参 2.实参 二 面向过程编程 三 面向对象过程 四 类和 ...

  6. python之ORM(对象关系映射)

    实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要更改代码.orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句.所有使用Django开发的项目无需关心程序底层使用的 ...

  7. SpringCloud Config(配置中心)实现配置自动刷新(十六)

    一.实现原理 1.ConfigServer(配置中心服务端)从远端git拉取配置文件并在本地git一份,ConfigClient(微服务)从ConfigServer端获取自己对应 配置文件: 2.当远 ...

  8. leetcode系列---3Sum C#code

    Function: public static List<int[]> SumSet(int[] array) { List<int[]> result = new List& ...

  9. InfluxDB常见疑问与解答 - 数据写入时如何在表级别指定保留策略

    网友Siguoei:我想让一个库中不同的measurment能够指定不同的保存策略.而不是写入时使用数据库的默认保留策略. Answer:这个特性InfluxDB支持的,写入时序数据时,在行协议前加上 ...

  10. OpenCV图像处理以及人脸识别

    OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import ...