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

tcp 重发 应用层重传

采用TCP时,应用层需要超时重传吗?

需要,原因如下:

1 tcp的超时控制不是你能设置的,所有的tcp超时都是用系统的时间设定,而且这个时间很长,超时的结果就是断开连接。和你应用要达到的目的显然差很远

2 send的返回OK != 数据被对方成功收到 ,且,数据被对方成功受到 != 数据被对方逻辑成功处理

举个极端的例子:
对方收到包,但是还没来的及处理,程序崩掉了,这个时候你的网络层显示的显然是对方收到了(确实也是对方收到了),但是对方并没有正确处理这个包,这个时候从逻辑上讲,你应该需要重发的,保证对方正确处理完毕。

3 如果底层通信质量不好,TCP可能会断链重连,或者序号检测发现异常重置序号。这些情况下TCP层都会丢帧,应用层如果有重要的消息还是要自己做重传。

 

TCP协议本身是可靠的,它的重传机制保证了消息的可送达性(如果没有收到对端的ACK确认,它会在等待一定时间后,尝试再次发送,且这是一个循环过程,上限是9分钟。超过9分钟,则认为连接已经断开,关闭socket)。
虽然有了TCP的可靠性保证,但是很多基于TCP的应用间通信依然会采用RETRY机制:发送消息后,如果在一定时间内没有收到对端的确认消息,则重发消息。明明TCP已经可以保证消息的可送达,为什么还要在应用层加这么一层实现呢?


1. 有些服务进程,基于性能或是内存容量方面的考虑,使用了限长的消息队列:如果收到的瞬时消息过多,超过了消息队列的可处理个数,所有超出的消息会被它丢弃。注意,在这种情况下,TCP确实是将消息成功送达了,只是应用层不接受而已。客户进程等待一小段时间,尝试再次发送,有可能此时服务端的处理压力已经降下来了,消息就能被处理了。

2. 进入了弱网环境的移动应用,发送超时往往意味着已经断连。此时的RETRY,在底层意味着重新连接,然后再次发送消息。


其他:进入了弱网环境的移动应用,可能会给用户带来不大顺畅的使用体验。当用户发送了一条消息,与其让用户等待9分钟才得知消息未能送达,不如在应用层设置超时重传,一旦超过规定时间(比如20s),则直接告知用户,当前网络状况不佳,不妨晚些时候再尝试发送。

相关文章:

  • Log4j具体使用实例
  • ios8之后的界面旋转简单原理
  • 设计模式之桥接模式(Bridge模式)
  • jsdoc文档
  • ESXI虚拟化增加系统盘容量
  • php过滤textarea 中的换行符问题
  • Unity3D-光照贴图技术
  • 说说动画卡顿的解决方案
  • ffmpeg从AVFrame取出yuv数据到保存到char*中
  • Keepalived工作原理详解及配置实例
  • 差分进化算法 DE-Differential Evolution
  • 使用IDEA社区版开发Web项目
  • centos7下搭建zabbix监控
  • 第一个小项目
  • 一致性hash和solr千万级数据分布式搜索引擎中的应用
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • gcc介绍及安装
  • Laravel5.4 Queues队列学习
  • nginx 配置多 域名 + 多 https
  • PhantomJS 安装
  • spring security oauth2 password授权模式
  • Vue.js 移动端适配之 vw 解决方案
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 七牛云假注销小指南
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 小程序01:wepy框架整合iview webapp UI
  • 原生Ajax
  • 智能合约Solidity教程-事件和日志(一)
  • puppet连载22:define用法
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • !!java web学习笔记(一到五)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原創) 未来三学期想要修的课 (日記)
  • (转)重识new
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .equals()到底是什么意思?
  • .Mobi域名介绍
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 使用 XPath 来读写 XML 文件
  • .NET连接数据库方式