发送大数据时,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 格式的数据源作为经典存在浑身上 ...
随机推荐
- opencv::Laplance算子
Laplance算子 理论:在二阶导数的时候,最大变化处的值为零即边缘是零值.通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘. 拉普拉斯算子(Laplance operator) 处理 ...
- TensorFlow2.0(9):TensorBoard可视化
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- Vuex的简单应用
### 源码地址 https://github.com/moor-mupan/mine-summary/tree/master/前端知识库/Vuex_demo/demo 1. 什么是Vuex? Vue ...
- Vulnhub靶场渗透练习(二) Billu_b0x
运行虚拟机直接上nmap扫描 获取靶场ip nmap 192.168.18.* 开放端口 TCP 22 SSH OpenSSH 5.9p1 TCP 80 HTTP Apache httpd 2.2.2 ...
- java中多线程 - 多线程中的基本方法
介绍一下线程中基本的方法使用 线程睡眠sleep() Thread.sleep(毫秒);我们可以通过sleep方法设置让线程睡眠.可以看到sleep是个静态方法 public static nativ ...
- JAVA必知必问问题-1
数据类型 1) 基本类型: byte, int, long, float, double, boolean.... 要求记住基本类型占多少字节.范围.例如:byte 1字节范围-128-127,sho ...
- 《编写可维护的JavaScript》 笔记
<编写可维护的JavaScript> 笔记 我的github iSAM2016 概述 本书的一开始介绍了大量的编码规范,并且给出了最佳和错误的范例,大部分在网上的编码规范看过,就不在赘述 ...
- navicat cannot load oci dll||oracle 改字符集为GBK后 navicat 连不上||Ora-28547 ora net错误
此段适用于 解决 navicat cannot load oci dll 环境 Navicat Premium 和 oracle 原因,navicat 32 和64 都只支持 32位的oci.dll ...
- 优化 .net core 应用的 dockerfile
优化 .net core 应用的 dockerfile Intro 在给 .net core 应用的写 dockerfile 的时候一直有个苦恼,就是如果有很多个项目,在 dockerfile 里写起 ...
- 【ASP.NET Core学习】Razor页面
准备工作 初始化空的项目(终端输入:dotnet new web -n=Razor) Nuget添加Microsoft.EntityFrameworkCore.SqlServer 和 Microsof ...