TCP的可靠性保证

TCP主要提供了检验和,序列号/确认应答,超时重传,最大消息长度,滑动窗口控制等方法实现了可靠性传输。

检验和

通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。检验和总共计算3部分:TCP首部,TCP数据和TCP伪首部。

序列号/确认应答

发送端发送信息给接收端,接收端会回应一个确认应答包。上述过程中,只要发送端有一个包传输,接收端没有回应确认包(ACK),都会重发。或接收端的应答包,发送端没有收到也会重发数据。这样就保证了数据的完整性。

超时重传

  • 超时重传的时间指发送出去的数据包到接收确认包之间的时间,若超过了这个时间会被认为丢包,需要重传。如何确定这个时间值的大小呢?

  • 我们知道一来一回称为一个RTT,然后可能由于网络等问题,时间会有偏差,这个偏差称为抖动(方差)。超时重传的时间大概就是比RTT+抖动值稍大的时间。

  • 在重发的过程中,假如一个数据包经过多次重发也没有收到对端的确认包,就会认为接收端异常,强制关闭连接。并且通知应用通信异常终止。

最大消息长度

在建立TCP连接时,双方约定一个最大的长度(MSS)作为发送的单位,重传时也是按照这个单位来进行。理想的情况下该长度刚好不被网络层分块。

滑动窗口控制

  • 超时重传存在效率低下,滑动窗口机制窗口的大小即是无需等待确认包情况下,发送端还能发送的最大数据量。此机制的实现利用了大量缓冲区,通过对多个段进行确认应答的功能。通过下一次的确认包即可判断接收端是否已经接收到数据,若已经接收从缓冲区删除数据。

  • 如图,若接收端没有收到自己所期望的序列号数据之前,会对之前的数据进行重复确认;这时发送端如果在收到某个ack应答包后又连续三次收到同样的应答包,此时就会判断数据已经丢失,需要重发。

拥塞控制

  • 窗口控制解决了两台主机因传送速率不同引起的丢包。但若网络非常拥堵,此时再发数据可能导致发送的数据段超过最大生存时间,导致未到达接收方。为此TCP引入慢启动,先发出少量数据探路,再决定。
  • 慢启动:在启动初期以指数增长;设置一个慢启动阈值,以指数增长达到阈值开始按照线性增长至拥塞窗口;达到网络拥塞时立刻把拥塞窗口置为1,进行新一轮慢启动,同时新一轮的阈值为达到网络拥塞时拥塞窗口的一半。

最新文章

  1. mac攻略(六) -- mac根目录分析
  2. sublime Text 3实用功能和常用快捷键收集
  3. 最大的LeftMax与rightMax之差绝对值
  4. django admin site (三)
  5. 利用word2vec对关键词进行聚类
  6. careercup-数学与概率
  7. c++ 顺序容器学习 - 容器适配器
  8. dede分页
  9. 扩展Log4j支持JNDI数据源
  10. jquery 触屏滑动+定时滚动
  11. PHP内核之旅-4.可变长度的字符串
  12. 什么是IaaS, PaaS和SaaS及其区别
  13. HDU 4549 M斐波那契数列(矩阵快速幂)
  14. loadrunner测试结果三
  15. JVM总结(六):早期(编译期)优化
  16. display: table; 100%的宽度
  17. spring boot 之@JsonView 简单介绍
  18. Mac系统使用VS Code编译Bootstrap 4
  19. proxool连接池参数解释
  20. BZOJ4570 SCOI2016妖怪(三分)

热门文章

  1. Vue快速上门(3)-组件与复用
  2. SQL语句查询关键字:where筛选、group by分组、distinc去重、order by排序、limit分页、操作表的SQL语句布补充
  3. gin模板语法
  4. 一文告诉你AVM中设置字体的方法
  5. HBase详解(03) - HBase架构和数据读写流程
  6. 有意思,小程序还可以一键生成App!
  7. 图解 Andrew 算法求凸包
  8. doc指令
  9. 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析
  10. C++Day12 虚拟继承内存布局测试