默认
发表评论 2
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
求助mina Socket会话写正常但TCP报文无发送
阅读(34475) | 评论(2 收藏 淘帖
运行环境
架构:aarch64
操作系统版本:Red Hat 8.3.1-3
通讯框架:mina2.0.19

websocket协议通讯,有个接口的返回数据量比较大,
当SocketSessionConfig的SendBufferSize设置的值为X(x大于2048)时会出现IoSession.write(message)会话写已经返回,
但是在服务器上用tcpdump抓包并没有发现把这个响应数据发送出去的tcp报文记录,客户端没有收到响应信息。当把x调大到一定值或者message的数据量调小是可以解决这个问题的。

可能相关事件:这个项目一直运行正常,直到某云厂商故障恢复服务后出现这个问题(项目被关了,重新启动的,猜测云厂商有重启服务器的动作),因为自己还没找到问题原因无法判断是否有关系。

现在有3个疑问:
1、为什么在本地无法复现(本地运行环境win10、x64),message内容、SendBufferSize值跟线上一样。是否跟架构或操作系统相关?
2、为什么SocketSessionConfig的SendBufferSize的设置值会影响tcp报文发送结果?

mina DefaultSocketSessionConfig源码
/* The SO_RCVBUF parameter. Set to -1 (ie, will default to OS default) */
private int receiveBufferSize = -1;

/* The SO_SNDBUF parameter. Set to -1 (ie, will default to OS default) */
private int sendBufferSize = -1;

由上面源码可知这是设置Socket缓存区的配置,Socket对应的是TCP层,message的数据量大但是拆分为tcp报文的时候不会出现单个tcp报文长度超过缓存区大小的情况,
所以message的报文大小是会被分为适当长度的tcp报文的,换句话说应用层的message大小不影响tcp层发送tcp报文。

3、为什么发生相关事件后才出现上述问题?

看了mina源码找到啥线索,现在是没有头绪和排查思路了,期待有相关经验的同学指点一二,或者提供个排查思路也感激不尽,需要其他相关信息辅助判断的欢迎留言我会及时补充。

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:网络编程懒人入门(十一):一文读懂什么是IPv6下一篇:网络编程懒人入门(十二):快速读懂Http/3协议,一篇就够!
推荐方案
评论 2
能一句话总结一下,你说的是什么问题吗。字好多,看的好累
引用:JackJiang 发表于 2020-05-14 20:27
能一句话总结一下,你说的是什么问题吗。字好多,看的好累

SocketSessionConfig的SendBufferSize设置的值小于一定值时TCP报文没有发送出去
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部