TCP超时与重传
TCP提供可靠的传输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没收到确认,他就重传数该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。
TCP管理四个定时器:
1)重传定时器:使用于当希望接收到另一端的确认。本文将详细讨论这个定时器以及相关问题,如拥塞避免。
2)坚持(persist)定时器:使窗口信息保持不断流动,即使另一端关闭了其接受窗口。以后文章讨论。
3)保活(keep alive)定时器:检测一个空闲连接的另一端的状态(何时崩溃或重启)。以后文章讨论。
4)2MSL定时器:前面文章讲过了,即测量一个连接处在TIME_WAIT状态的时间。
往返时间测量-RTT
主要有两大类算法:加权移动平均算法(Karn/Partridge算法)和Jacobson / Karels 算法。其实我也不懂,尤其是后者。
拥塞避免算法(Congestion Avoidance)
慢启动算法是一个在连接上发起数据流的算法(调节发送的数据速率),但是我们有时会达到中间路由器的极限,此时分组还是会被丢弃。拥塞避免算法是一种处理丢失分组的方法。但这两个算法通常一起实现,上一篇文章的慢启动示意图中也做了说明,cwnd指数增长期是慢启动,达到ssthresh后,每收到一个ACK,cwnd加一,进入线性增长(additive increase)。cwnd达到预设的cwnd后,慢启动又从1开始,只是这次的sshresh等于之前预设sshresh的一半。
快速重传(Fast Retransmit)和快速恢复(Fast Recover)算法
在收到一个失序的报文段时,TCP立即需要产生一个重复的ACK。这个ACK不应该被迟延。该ACK目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。
但是我们知道一个重复的ACK有可能是一个丢包引起的,也有可能是一个失序报文段引起的。假如这是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的ACK之前,只会产生1~2个重复ACK。如果收到一连串3个或3个以上的重复ACK,就非常可能是一个报文段丢失了。于是,发送方不需要等到超时定时器溢出,就重传丢失的报文数据段。这就是快速重传算法。快速重传做三件事情:
1)把ssthresh设置为cwnd的一半;
2)把cwnd设置为ssthresh的值(有些版本ssthresh+3);
3)重新进入拥塞避免阶段。
接下来执行的不是慢启动,而是拥塞避免算法。这就是快速恢复算法。为啥收到三个重复的ACK后没有启动慢启动算法?只有在有数据达到接收方时才会产生ACK,所以收到三个重复的ACK说明数据(非丢失数据)已经进入接收方的缓存,要是没有到达而丢包的话,会在RTO(retransmit timeout)之后发送ACK通知发送方报文丢失。也就是说连收三个ACK时,收发两端之间仍然有流动的数据,而我们不想执行慢启动算法来减少数据流。快速恢复做三件事情:
1)当收到3个重复ACK时,把ssthresh设置为cwnd的一半;把cwnd设置为ssthresh+3(因为有三个报文离开了网络),然后重传丢失的报文段。
2)再收到重复的ACK时,拥塞窗口cwnd++
3)当收到新的ACK时,把ssthresh值恢复到第一步的cwnd,因为收到新的ACK说明丢失的报文已经收到,快速恢复过程已经结束,可以恢复到之前的状态了。也即再次进入再次拥塞避免状态。
下图是各种算法的样子:

SACK(Selective acknowledgement)
以上被称为Reno拥塞控制算法,是针对一个包的重传算法,但是现实情况往往是同时有好多丢包。后来有了SACK确认机制,改变了TCP的确认机制。最初的ACK机制只确认当前已收到的连续数据段,SACK则把乱序等信息全都告诉对方,从而减少数据重传的盲目性。比如发送1,2,3,4,5,6,7个数据段,但只收到1,2,3,5,7。那么普通的ACK确认机制只会回复ACK=4,而SACK则把当前还收到5,7也放在了确认信息中,从而提高性能。使用SACK时NewReno算法可以不使用,因为SACK报文本身已经告诉发送方哪些报文需要重传,哪些不需要重传。关于SACK,wiki连接https://en.wikipedia.org/wiki/TCP_SACK
TCP超时与重传的更多相关文章
- TCP超时与重传机制
TCP超时与重传机制 TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制.其基本原理:在发送一个数据之后,就开启一个定时器 ...
- TCP超时与重传机制与拥塞避免
TCP超时与重传机制 TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制. 基本原理:在发送一个数据之后,就开启一个定时器,若是 ...
- 详解 TCP 超时与重传机制——长文预警
上一篇介绍 TCP 的文章「TCP 三次握手,四次挥手和一些细节」反馈还不错,还是蛮开心的,这次接着讲一讲关于超时和重传那一部分. 我们都知道 TCP 协议具有重传机制,也就是说,如果发送方认为发生了 ...
- 13.TCP的超时与重传
TCP提供可靠的运输层.它使用的方法之一就是确认从另一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这种问题.如果当定时器溢出时还没有收到确认,它就重传该数据. 对于 ...
- TCP/IP详解 卷1 第二十一章 TCP的超时与重传
21.1 引言 可靠性的保证之一就是超时重传 前面两个超时重传的例子 1) ICMP端口不能到达时,TFTP客户使用UDP实现了一个简单的超时和重传机制,假定5s是一个适当是时间间隔,并每隔5s进行 ...
- TCP/IP协议--TCP的超时和重传
TCP是可靠传输.可靠之一体现在收到数据后,返回去一个确认.但是不能完全避免的是,数据和确认都可能丢失.解决这个办法就是,提供一个发送的重传定时器:如果定时器溢出时还没收到确认,它就重传这个报文段. ...
- 【TCP/IP详解 卷一:协议】第二十一章 TCP的超时与重传
作为TCP的重头戏,本章节涉及了许多关于计算方面的内容,使用了大量的例子来指明一些观点. 我使用的理解方法是:通过别人的博客,以及实例结合进行理解,不然会很吃力. 21.1 引言 reliable T ...
- TCP的超时与重传
一.引言 对于每个TCP连接,TCP管理4个不同的定时器 重传定时器用于当希望收到另一端的确认. 坚持 (persist) 定时器使窗口大小信息保持不断流动,即使另一端关闭了其接收窗口. 保活 (ke ...
- 《TCP/IP具体解释》读书笔记(21章)-TCP的超时与重传
TCP提供可靠的运输层. 它使用的方法之中的一个就是确认从还有一端收到的数据.但数据和确认都有可能会丢失.TCP通过在发送时设置一个定时器来解决这样的问题.假设当定时器溢出时还没有收到确认,它就重传该 ...
随机推荐
- 利用Spring的AbstractRoutingDataSource解决多数据源的问题【代码手动切换,非AOP】
转: 利用Spring的AbstractRoutingDataSource解决多数据源的问题 多数据源问题很常见,例如读写分离数据库配置. 原来的项目出现了新需求,局方要求新增某服务器用以提供某代码, ...
- nodejs语言实现验证码生成功能
验证码已经是非常常用的反作弊.反攻击手段了,其实要实现这个功能对技术水平好的人也不难,但是并不是每个人,每种语言都天然适合搞某个功能...不过我们可以通过封装接口,来屏蔽差异化,把问题简单化,现在就用 ...
- Python中webbrowser的用法
#coding:utf-8 import time import webbrowser as web import os import random #随机选择一个浏览器打开网页 def open_u ...
- JAVA 面向对象编程 --自我总结
子系统 系统结构是指由系统多个子系统组成,以及子系统由多个更小的子系统组成的结构.那么子系统又具备哪些特点呢? 特点: 1.结构的稳定性 :软件在设计阶段,在把一个系统划分成更小的子系统时,设计合理, ...
- python装饰器的构建
#!/usr/bin/python3# -*-coding:utf-8 -*-# @Time : 2019/9/27 17:04# @Author : v_ctaozhang import funct ...
- eclipse创建项目(步骤加图片)
前言: 我曾经大学的专业是计算机科学与技术,但不曾想着走入计算机的世界,看着代码就眼晕. 为了自动化测试,不得被迫认识一下java. 1) 打开Eclipse,界面是这样的: 2) ...
- office web apps安装部署,配置https,负载均衡(一)背景介绍
Office Web Apps,简称owa,是微软开发的在线预览office 文件服务.只要是做web开发技术的技术人员都知道,office文件预览,对于网站来说,绝对是一个难点,目前常见的预览off ...
- 【POJ - 1950】Dessert(dfs)
-->Dessert Descriptions: 给你一个数N(3<=N<=15);每个数之间有三种运算符“‘+’,‘-’,‘.’”.输出和值等于零的所有的运算情况及次数num,如果 ...
- PHP学习(6)——代码重用与函数编写的一些注意事项
一个新的项目是这样创建的:它将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小. 代码重用的好处:降低成本.提升可靠性和一致性. 1.使用require()和include()函数 使用一条 ...
- NLP 对抗方法整理
NLP中对抗应用 1. 分词 , 可以用GAN来做,消除不同分词器的差异性 2. 风格迁移, 这个在图像中应用较多,在NLP中同样可行 3. 提高问答系统/阅读理解的性能. 4. 机器翻译应该也可以做 ...