发送大数据时,PDU的问题?
昨天发现通过 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]
- The layer 1 (Physical layer) PDU is the bit or, more generally, symbol (can also be seen as "stream").
- The layer 2 (Data link layer) PDU is the frame.
- The layer 3 (Network layer) PDU is the packet.
- The layer 4 (Transport layer) PDU is the segment for TCP or the datagram for UDP.
Given a context pertaining to a specific OSI layer, PDU is sometimes used as a synonym for its representation at that layer.
发送大数据时,PDU的问题?的更多相关文章
- C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全
简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...
- 话题讨论&征文--谈论大数据时我们在谈什么 获奖名单发布
从社会发展趋势的角度,非常明显大数据会是眼下肉眼可及的视野范围里能看到的最大趋势之中的一个.从传统IT 业到互联网.互联网到移动互联网,从以智能手机和Pad 为主要终端载体的移动互联网到可穿戴设备的移 ...
- ajax 发送json数据时为什么需要设置contentType: "application/json”
1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别? contentType: "application/j ...
- ajax发送json数据时为什么需要设置contentType: "application/json”
1. ajax发送json数据时设置contentType: "application/json”和不设置时到底有什么区别?contentType: "application/js ...
- python网络编程-socket发送大数据包问题
一:什么是socket大数据包发送问题 socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果.这就出现象第一次接受结果不全,第二次接果出现第一 ...
- ZeroC Ice发送大数据
继上文,我们使用ZeroC Ice传递大块数据时,通常有两种做法,一种是一次请求,另一种就是分多次请求(,这种做法在官方文档有例子).选哪一种根据需要而定. 当分多次请求来完成一大块数据,到底选择每次 ...
- java开发的web下载大数据时的异常处理
同事用java开发了一个系统,其中有一个功能是下载大约10万笔数据到Excel中.当上线后,很多用户反映下载数据量大的时候就不能成功,但有时可以,所以结论就是系统不稳定,这个问题拖了很久没有解决. 在 ...
- WCF传送大数据时的错误“ 超出最大字符串内容长度配额”
格式化程序尝试对消息反序列化时引发异常: 尝试对参数 http://tempuri.org/ 进行反序列化时出错: GetLzdtArticleResult.InnerException 消息是“反序 ...
- 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术
在大数据项目开发过程中,ETL(Extract-Transform-Load)是必不可少.即便目前 JSON 非常流行,开发人员也有必定会有对远古系统的挑战,而 XML 格式的数据源作为经典存在浑身上 ...
随机推荐
- SpringBoot是如何动起来的?
程序入口 SpringApplication.run(BeautyApplication.class, args); 执行此方法来加载整个SpringBoot的环境. 1. 从哪儿开始? Spring ...
- 基于 HTML5 Canvas 的楼宇自控系统
前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...
- springboot使用spring配置文件
1.如何在springboot中使用spring的配置文件,使用@Configuration和@ImportResource注解 package com.spring.task; import org ...
- 函数基础(二)(day11整理)
目录 昨日内容 函数的定义 函数的三种定义方式 空函数 有参函数 无参函数 函数的调用 函数的返回值 函数的参数 形参 实参 今日内容 可变长参数 可变长形参 可变长实参(仅作了解) 函数对象 函数嵌 ...
- .NET如何写正确的“抽奖”——打乱数组算法
.NET如何写正确的"抽奖"--数组乱序算法 数组乱序算法常用于抽奖等生成临时数据操作.就拿年会抽奖来说,如果你的算法有任何瑕疵,造成了任何不公平,在年会现场code review ...
- web.xml不同版本的头信息
web.xml v2.3 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web- ...
- mui iOS云打包修改权限提示语
打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝 设置方法如下: 使用视图方式打开manifest.json文件, ...
- Educational Codeforces Round 71 (Rated for Div. 2)E. XOR Guessing
一道容斥题 如果直接做就是找到所有出现过递减的不同排列,当时硬钢到自闭,然后在凯妹毁人不倦的教导下想到可以容斥做,就是:所有的排列设为a,只考虑第一个非递减设为b,第二个非递减设为c+两个都非递减的情 ...
- 明解C语言 入门篇 第一章答案
练习1-1 #include <stdio.h> int main() { int a; a = 15; int b; b = 37; int c; c = a - b; printf(& ...
- [Spark]Spark-streaming通过Receiver方式实时消费Kafka流程(Yarn-cluster)
1.启动zookeeper 2.启动kafka服务(broker) [root@master kafka_2.11-0.10.2.1]# ./bin/kafka-server-start.sh con ...