当前位置: 首页 > news >正文

通过socket进行TCP通信丢包原因总结

转自:http://www.cnblogs.com/orange1438/p/4693470.html

今天在公司问老大,公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉包的问题,TCP是基于不可靠的网络实现可靠的传输,肯定也会存在掉包的情况。

如果通信中发现缺少数据或者丢包,那么,最大的可能在于程序发送的过程或者接收的过程出现问题。


例如服务器给客户端发大量数据,Send的频率很高,那么就有可能在Send时发生错误(原因可能是又多种,可能是程序处理逻辑问题,多线程同步问题,缓冲区溢出问题等等),如果没有对Send失败做处理重发数据,那么客户端收到的数据就会比理论应该收到的少,就会造成丢数据,丢包的现象。

这种现象,其实本质上来说不是丢包,也不是丢数据,只是因为程序处理有错误,导致有些数据没有成功地被socket发送出去。

常用的解决方法如下:拆包、加包头、发送,组合包,如果客户端、服务端掉线,常采用心跳测试。

tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。

粘包、拆包问题说明

假设客户端分别发送数据包D1和D2给服务端,由于服务端一次性读取到的字节数是不确定的,所以可能存在以下4种情况。

  • 1.服务端分2次读取到了两个独立的包,分别是D1,D2,没有粘包和拆包;
  • 2.服务端一次性接收了两个包,D1和D2粘在一起了,被成为TCP粘包;
  • 3.服务端分2次读取到了两个数据包,第一次读取到了完整的D1和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为拆包;
  • 4.服务端分2次读取到了两个数据包,第一次读取到了部分D1,第二次读取D1剩余的部分和完整的D2包;

如果此时服务端TCP接收滑动窗非常小,而数据包D1和D2都很大,很有可能发送第五种可能,即服务端多次才能把D1和D2接收完全,期间多次发生拆包情况。(TCP接收滑动窗:是接收端的大小,随着流量大小而变化,如果我的解释还不明确,请读者自行百度,或者查阅《计算机网络》、《TCP/IP》中TCP的内容)

粘包问题的解决策略

由于底层的TCP无法理解上层的业务逻辑,所以在底层是无法确保数据包不被拆分和重组的,这个问题只能通过上层的应用协议栈设计来解决,根据业界的主流协议的解决方案,归纳如下:

  • 1.消息定长,例如每个报文的大小为固定长度200字节,如果不够,空位补空格;
  • 2.在包尾增加回车换行符进行分割,例如FTP协议;
  • 3.将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段,通常设计思路是消息头的第一个字段用int来表示消息的总长度;(我之前linux C开发,就用的这种)。
  • 4.更复杂的应用层协议;
  • 总结自定义协议,
http://www.jsqmd.com/news/436953/

相关文章:

  • 健康管理实训智慧化升级与建设
  • 半导体自动化AMHS发展前景如何?
  • 新手程序员必看:轻松掌握大模型自动化报销系统开发(收藏版)
  • 【毕业设计】基于django+Spark的南昌房价数据分析系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • MCU芯片级验证
  • 幂链iPaaS×纷享销客CRM:共探双环传动数智化转型之路
  • 康养设备使用服务实训室建设与实践探索
  • 讲一个流量获取小窍门,推广独立站和 APP 用
  • 大数据计算机毕设之基于django+Spark的南昌房价数据分析系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • Godot游戏练习01-第2节-创建主菜单
  • TCN-Transformer-LSTM组合模型回归+SHAP分析+新数据预测+多输出!深度学习可解释分析MATLAB代码 - 教程
  • 大数据毕设选题推荐:基于django+Spark的南昌房价数据分析系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 早教资源合集
  • GRE正反词整理
  • ZRT-II 机器人减速器性能测试系统实战全复盘:从行业痛点破局到量产落地,硬核测试方案如何从零打磨成型
  • 怎么给自己的公司建立网站 - 码云数智
  • 2026去屑洗发水榜单揭晓:哪些产品受消费者青睐,止痒去屑洗发水/去油去屑洗发水/去屑洗发水,去屑洗发水牌子有哪些 - 品牌推荐师
  • CF1656G Cycle Palindrome
  • MTX-OL Plus 宽带空燃比 OLED 仪表|引擎 “呼吸” 监测神器:从赛道到改装的精准调校实战
  • 蓝牙打印机:无线打印新体验,高效便捷新选择
  • 成都PLC培训实测:叩丁狼凭啥成了学生党入行的首选?
  • 知识付费小程序制作平台有哪些 - 码云数智
  • 【JVS更新日志】APS排产、物联网、逻辑编排、企业计划等3.4更新说明!
  • 车规蓝牙模块技术深度剖析
  • MySQL字符集从utf8升级到utf8mb4踩坑记:一个建表语句引发的“血案”
  • C#文件的操作
  • 《贾子思想 · 投资人战略版》资本可理解模型(Capital-Readable Strategic Model)
  • 知识付费小程序怎么做,在线教育平台系统搭建 - 码云数智
  • QT软件外包开发流程
  • 原生 APP的开发流程