昨天发现通过 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. 百万年薪python之路 -- MySQL数据库之 永久修改字符串编码 与 忘了密码和修改密码

    永久修改字符集编码的方法: 在mysql安装目录下创建一个my.ini(Windows下)文件,写入下面的配置,然后重启服务端. [client] #设置mysql客户端默认字符集 default-c ...

  2. 百万年薪python之路 -- 闭包

    2.闭包 闭包的定义: 闭包是嵌套在函数中的函数. 闭包必须是内层函数对外层函数的变量(非全局变量)的引用. 一句话定义就是:在嵌套函数内,对非全局变量 (且不是本层的变量)的引用 如何判断判断闭包? ...

  3. Fiddler抓包和工作原理

    一.概述 Fiddler是一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据, 可以用其检测网页和服务器的交互情况,能够记录所有客户端和服务器间的http请求, 支持监视. ...

  4. day03课堂练习

    简述变量的组成 变量由变量名,赋值符号,和变量值三个部分组成 简述变量名的命名规范 a.变量名必须有意义,要能反映变量值所描述的状态 b.变量名以字母.数字和下划线组成,不能用数字开头 c.不能以关键 ...

  5. 页面报错常用状态码总结(Http常见状态码)

    作为一个互联网开发人员对于一些服务器返回的HTTP状态的意思都必须是了如指掌的,只有将这些状态码一一弄清楚,工作中遇到的各种问题才能够处理的得心应手.好了,下面就让我们来了解一下比较常见的HTTP状态 ...

  6. django-HttpResponse,render,redirect

    1.导入相应的包 from django.shortcuts import HttpResponse, render, redirect 2.HttpResponse(返回字符串给浏览器) def i ...

  7. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  8. Python项目生成所有依赖包的清单

    最近写完的自动化脚本,分享给同事的时候发现依赖包很难解决(使用的不是virtualenv环境).想起来之前看开源接口平台项目的时候可以一键下载依赖包,于是就找到了第三方包pipreqs,可以自动帮助我 ...

  9. Web for pentester_writeup之Commands injection篇

    Web for pentester_writeup之Commands injection篇 Commands injection(命令行注入) 代码注入和命令行注入有什么区别呢,代码注入涉及比较广泛, ...

  10. [考试反思]1026csp-s模拟测试89:不公

    稍垃圾.因为T1没A. 赶巧前一段时间学了杜教筛,结果因为教练放错题. 然后考场上疯狂yy,最后水到了一个AC. 其实的确挺不公平的,不少人也没学呢. 如果只算T1和T3的分数的话,那70分就是个垃圾 ...