TCP协议如何保证可靠传输
所以 TCP 针对数据包丢失的情况,会用重传机制解决。重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的 ACK 确认应答报文,就会重发该数据,也就是我们常说的超时重传。TCP 会在以下两种情况发生超时重传:我们先来了解一下什么是 RTT(Round-Trip Time 往返时延),从下图我们就可以知道:RTT 指的是数据发送时刻到接收到确认的时刻的差值,也就是包的往返时间。上图中有两种超时时间不同的情况:精确的测量超时时间 RTO 的值是非常重要的,这可让我们的重传机制更高效。根据上述的两种情况,我们可以得知,超时重传时间 RTO 的值应该略大于报文往返 RTT 的值。如果超时重发的数据,再次超时的时候,又需要重传的时候,TCP 的策略是超时间隔加倍。也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。超时触发重传存在的问题是,超时周期可能相对较长。那是不是可以有更快的方式呢?于是就可以用「快速重传」机制来解决超时重发的时间等待。TCP 还有另外一种快速重传(Fast Retransmit)机制,它不以时间为驱动,而是以数据驱动重传。快速重传机制,是如何工作的呢?其实很简单,一图胜千言。在上图,发送方发出了 1,2,3,4,5 份数据:还有一种实现重传机制的方式叫:SACK( Selective Acknowledgment 选择性确认)。这种方式需要在 TCP 头部「选项」字段里加一个 SACK 的东西,它可以将缓存的地图发送给发送方,这样发送方就可以知道哪些数据收到了,哪些数据没收到,知道了这些信息,就可以只重传丢失的数据。如下图,发送方收到了三次同样的 ACK 确认报文,于是就会触发快速重发机制,通过 SACK 信息发现只有 200~299 这段数据丢失,则重发时,就只选择了这个 TCP 段进行重复。Duplicate SACK 又称 D-SACK,其主要使用了 SACK 来告诉「发送方」有哪些数据被重复接收了。下面举例两个栗子,来说明 D-SACK 的作用。这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。如果你说完一句话,我在处理其他事情,没有及时回复你,那你不是要干等着我做完其他事情后,我回复你,你才能说下一句话,很显然这不现实。所以,这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。假设窗口大小为 3 个 TCP 段,那么发送方就可以「连续发送」 3 个 TCP 段,并且中途若有 ACK 丢失,可以通过「下一个确认应答进行确认」。TCP 头里有一个字段叫 Window,也就是窗口大小。这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。所以,通常窗口的大小是由接收方的窗口大小来决定的。发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。并不是完全相等,接收窗口的大小是约等于发送窗口的大小的。因为滑动窗口并不是一成不变的。比如,当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。那么新的接收窗口大小,是通过 TCP 报文中的 Windows 字段来告诉发送方。那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系。如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。前面的流量控制例子,我们假定了发送窗口和接收窗口是不变的,但是实际上,发送窗口和接收窗口中所存放的字节数,都是放在操作系统内存缓冲区中的,而操作系统的缓冲区,会被操作系统调整。可见最后窗口都收缩为 0 了,也就是发生了窗口关闭。当发送方可用窗口变为 0 时,发送方实际上会定时发送窗口探测报文,以便知道接收方的窗口是否发生了改变,这个内容后面会说,这里先简单提一下。所以,如果发生了先减少缓存,再收缩窗口,就会出现丢包的现象。为了防止这种情况发生,TCP 规定是不允许同时减少缓存又收缩窗口的,而是采用先收缩窗口,过段时间再减少缓存,这样就可以避免了丢包情况。在前面我们都看到了,TCP 通过让接收方指明希望从发送方接收的数据大小(窗口大小)来进行流量控制。这会导致发送方一直等待接收方的非 0 窗口通知,接收方也一直等待发送方的数据,如不采取措施,这种相互等待的过程,会造成了死锁的现象。窗口探测的次数一般为 3 次,每次大约 30-60 秒(不同的实现可能会不一样)。如果 3 次过后接收窗口还是 0 的话,有的 TCP 实现就会发RST报文来中断连接。一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大....所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。为了在「发送方」调节所要发送数据的量,定义了一个叫做「拥塞窗口」的概念。拥塞控制主要是四个算法:TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,如果一上来就发大量的数据,这不是给网络添堵吗?慢启动的算法记住一个规则就行:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。这里假定拥塞窗口 cwnd 和发送窗口 swnd 相等,下面举个栗子:连接建立完成后,一开始初始化 cwnd = 1,表示可以传一个 MSS 大小的数据。当收到一个 ACK 确认应答后,cwnd 增加 1,于是一次能够发送 2 个当收到 2 个的 ACK 确认应答后, cwnd 增加 2,于是就可以比之前多发2 个,所以这一次能够发送 4 个当这 4 个的 ACK 确认到来的时候,每个确认 cwnd 增加 1, 4 个确认 cwnd 增加 4,于是就可以比之前多发 4 个,所以这一次能够发送 8 个。可以看出慢启动算法,发包的个数是指数性的增长。有一个叫慢启动门限ssthresh(slow start threshold)状态变量。前面说道,当拥塞窗口 cwnd 「超过」慢启动门限 ssthresh 就会进入拥塞避免算法。一般来说 ssthresh 的大小是 65535 字节。那么进入拥塞避免算法后,它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。接上前面的慢启动的栗子,现假定 ssthresh 为 8:当 8 个 ACK 应答确认到来时,每个确认增加 1/8,8 个 ACK 确认 cwnd 一共增加 1,于是这一次能够发送 9 个 MSS 大小的数据,变成了线性增长。所以,我们可以发现,拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。当触发了重传机制,也就进入了「拥塞发生算法」。当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:发生超时重传的拥塞发生算法当发生了「超时重传」,则就会使用拥塞发生算法。这个时候,ssthresh 和 cwnd 的值会发生变化:还有更好的方式,前面我们讲过「快速重传算法」。当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则ssthresh和cwnd变化如下:快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,你还能收到 3 个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。正如前面所说,进入快速恢复之前,cwnd 和 ssthresh 已被更新了:

TCP协议的超时详解
众所周知,TCP协议是一个可靠的的协议。TCP的可靠性依赖于大量的 Timer 和 Retransmission 。现在咱们就来细说一下TCP协议的那些Timer在TCP三次握手创建一个连接时,以下两种情况会发生超时:1.client发送SYN后,进入SYN_SENT状态,等待server的SYN+ACK。2.server收到连接创建的SYN,回应SYN+ACK后,进入SYN_RECD状态,等待client的ACK。当超时发生时,就会重传,一直到75s还没有收到任何回应,便会放弃,终止连接的创建。但是在Linux实现中,并不是依靠超时总时间来判断是否终止连接。而是依赖重传次数:当三次握手成功,连接建立,发送TCP segment,等待ACK确认。如果在指定时间内,没有得到ACK,就会重传,一直重传到放弃为止。Linux中也有相关变量来设置这里的重传次数的:当一方接受到TCP segment,需要回应ACK。但是不需要 立即 发送,而是等上一段时间,看看是否有其他数据可以 捎带 一起发送。这段时间便是 Delayed ACK Timer ,一般为200ms。如果某一时刻,一方发现自己的 socket read buffer 满了,无法接受更多的TCP data,此时就是在接下来的发送包中指定通告窗口的大小为0,这样对方就不能接着发送TCP data了。如果socket read buffer有了空间,可以重设通告窗口的大小在接下来的 TCP segment 中告知对方。可是万一这个 TCP segment 不附带任何data,所以即使这个segment丢失也不会知晓(ACKs are not acknowledged, only data is acknowledged)。对方没有接受到,便不知通告窗口的大小发生了变化,也不会发送TCP data。这样双方便会一直僵持下去。TCP协议采用这个机制避免这种问题:对方即使知道当前不能发送TCP data,当有data发送时,过一段时间后,也应该尝试发送一个字节。这段时间便是 Persist Timer 。TCP socket 的 SO_KEEPALIVE option,主要适用于这种场景:连接的双方一般情况下没有数据要发送,仅仅就想尝试确认对方是否依然在线。目前vipbar网吧,判断当前客户端是否依然在线,就用的是这个option。具体实现方法:TCP每隔一段时间(tcp_keepalive_intvl)会发送一个特殊的 Probe Segment,强制对方回应,如果没有在指定的时间内回应,便会重传,一直到重传次数达到 tcp_keepalive_probes 便认为对方已经crash了。当主动关闭方想关闭TCP connection,发送FIN并且得到相应ACK,从FIN_WAIT_1状态进入FIN_WAIT_2状态,此时不能发送任何data了,只等待对方发送FIN。可以万一对方一直不发送FIN呢?这样连接就一直处于FIN_WAIT_2状态,也是很经典的一个DoS。因此需要一个Timer,超过这个时间,就放弃这个TCP connection了。TIME_WAIT Timer存在的原因和必要性,主要是两个方面:主动关闭方发送了一个ACK给对方,假如这个ACK发送失败,并导致对方重发FIN信息,那么这时候就需要TIME_WAIT状态来维护这次连接,因为假如没有TIME_WAIT,当重传的FIN到达时,TCP连接的信息已经不存在,所以就会重新启动消息应答,会导致对方进入错误的状态而不是正常的终止状态。假如主动关闭方这时候处于TIME_WAIT,那么仍有记录这次连接的信息,就可以正确响应对方重发的FIN了。一个数据报在发送途中或者响应过程中有可能成为残余的数据报,因此必须等待足够长的时间避免新的连接会收到先前连接的残余数据报,而造成状态错误。但是我至今疑惑的是:为什么这个超时时间的值为2MSL?如果为了保证双方向的TCP包要么全部响应完毕,要么全部丢弃不对新连接造成干扰,这个时间应该是:被动关闭方LAST_ACK的超时时间 + 1MSL因为被动关闭方进入LAST_ACK状态后,假设一直没有收到最后一个ACK,会一直重传FIN,一直重传次数到达TCP_RETRIES放弃,将这个时间定义为「被动关闭方LAST_ACK的超时时间」,接着必须等待最后一个重传的FIN失效,需要一个MSL的时间。这样才能保证所有重传的FIN包失效,不干扰新连接吧。TCP/IP Illustrated

TCP(II) 超时重传
查看原文图中黑色那条就是因为定时器超时仍没有收到 ACK,所以引起了发送方超时重传。实际上 TCP 有两个阈值来决定如何重传同一个报文段:一是愿意重传的次数 R1、二是应该放弃当前连接的时机 R2。R1 和 R2 的值应分别至少为 3 次和 100 秒,如果超过任何一个但还没能重传成功,会放弃该连接。当然这两个值是可以设置的,在不同系统里默认值也不同。那么如何设定一个合适的超时的值呢?假设 TCP 工作在静态环境中,这很容易,但真实网络环境不断变化,需要根据当前状态来设定合适的值。RTO(retransmission timeout)一般是根据RTT(round trip time)也就是往返时间来设置的。若 RTO 小于 RTT,则会造成很多不必要的重传;若 RTO 远大于 RTT,则会降低整体网络利用率,RTO 是保证 TCP 性能的关键。并且不同连接的RTT不相同,同一个连接不同时间的 RTT 也不相同,所以 RTO 的设置一直都是研究热点。所以凭我们的直觉,RTO 应该比 RTT 稍大:RTO=RTT+Δt那么,RTT 怎么算呢:SRTT=(1−α)×SRTT+α×RTTnewSRTT(smooth RTT),RTTnew 是新测量的值。如上,为了防止 RTT 抖动太大,给了一个权值a,也叫平滑因子。a 的值建议在 10%~20%。举个例子,当前 RTTs=200ms,RTTs=200ms,最新一次测量的 RTT=800ms,RTT=800ms,那么更新后的 RTTs=200×0.875+800×0.125=275ms,RTTs=200×0.875+800×0.125=275ms.Δt如何得到呢?RFC 2988 规定:RTO=SRTT+4×RTTD因此,按照上面的定义,Δt=4×RTTD. 而 RTTD 计算公式如下:RTTD=(1−β)×RTTD+β×|SRTT−RTTnew|实际上,RTTD 就是一个均值偏差,它就相当于某个样本到其总体平均值的距离。这就好比你的成绩与你班级平均成绩差了多少。RFC 推荐 β=0.25。根据前面的公式,我们可以得到 RTO。一旦超过 RTO 还没收到 ACK,就会引起发送方重传。但如果重传后还是没有在 RTO 时间内收到 ACK,这时候会认为是网络拥堵,会引发 TCP 拥塞控制行为,使 RTO 翻倍。则第 n 次重传的 RTOn 值为:RTOn=2^(n−1)×RTO1下图是一个例子:如上,在时间为0.22531时开始第一次重传,此后重传时间开始指数增大,(在尝试了8次后停下,说明其 R2 的值可能为8)。前面说了 RTO 的公式,它和 RTT 有关,那么每一次的 RTT 是如何得到的呢?在之前 TCP 连接管理的时候讲过,TCP有一个 TSOPT (timestamp option) 选项,它包含两个时间戳值。它允许发送者在报文中带上一个32比特的时间戳值(TSV),然后接收方 将收到的值原封不动的填入 ACK 报文段中 TSOPT 选项的第二部分,时间戳回显字段(TSER)。发送方收到 ACK 以后,将当前时间戳减去 TSOPT 选项的 TSER 就可得到精确的RTT值。还有另一个重要的细节,如果测量 RTT 的样本出现了超时重传,但是我们收到了 ACK 时无法分辨是对哪一次的确认,这时候 RTT 的值可能是不正确的。因此,Karn 算法规定:此时不更新 RTTnew 的值。并且如果发生再次重传,则采用退避后的 RTO 的值,直到发送成功,退避指数重新设定为 1 。假设有三个数据包依次发送,1号和3号先到达,2号数据包由于网络因素最后到达。接收方收到3号时,会发送一个1号的冗余 ACK,然后2号到达,此时会发送一个3号的累积 ACK 表明这三个到达。在这个例子里,3号 ACK 并没有立即返回,发送方收到3号的 ACK 后,根据其 TSER 计算此时的 RTT,就会导致发送方过高的估计 RTT,降低重传积极性,使得 RTO 相应增大,当然这在失序时是有好处的,因为过分积极会导致大量的伪重传。如下图,在发送第四个 ACK 后出现延迟高峰,导致发送方在 RTO 时间内没有收到 5 ~ 8 的 ACK,于是发生重传,然后之前的 ACK 到达,于是又依次发送 6 ~ 8,就导致了不必要的重传。可以用 Eifel 算法来解决(略)。

从前面可以看出,TCP 可以学习链路特征,如 RTT、SRTT 等,但一旦连接关闭,这些信息就会丢失。即使相同的接收方与发送方建立新的连接,也必须从头开始“学习”。较新的 TCP 实现维护了这些值,在 Linux 中可以通过如下命令查看:在大多数情况下,计时器超时并触发重传是不必要的,也不是期望的,因为 RTO 通常是大于 RTT(约2倍或更大),因此基于计时器的重传会导致网络利用率降低。首先我们要知道,接收方收到失序报文段时,应立即生成确认信息(重复 ACK),以便发送方尽快、高效地填补空缺。而发送方在收到重复 ACK 时,无法判断是由于数据包丢失还是仅仅因为延迟,所以发送方等待一定数目的重复 ACK (重复 ACK 阈值,dupthresh),这时可以认为是数据包丢失,即便还未超时,也立即发送丢失的分组。所以快速重传概括如下:TCP 发送方在观测到至少 dupthresh ( 通常是 3 ) 个重复 ACK,立即重传,而不必得到计时器超时。当然也可以同时发送新的数据。当然快速重传也会造成一些问题。在轻微失序的情况下(左图),不会有什么影响。但在严重失序时(右图),4号数据包延迟到达,接收方发送 4 个冗余 ACK ,让发送方认为 4 号分组丢失,造成伪快速重传。尽管可能性较小,但 IP 协议也可能将单个包传输多次。假如 IP 协议将一个包传输了 4 次,然后发送方接收到 3 个冗余 ACK ,也会让发送方以为分组丢失,导致伪快速重传。在上一篇文章中提到过 TCP 的 SACK 选项,它通过若干个 SACK 块来帮助发送方知道接收方有哪些空缺,可以减少不必要的重传。接收端在 TCP 连接建立期间收到 SACK 选项即可生成 SACK。通常来说,当收到失序报文段,接收方就会生成 SACK。第一个 SACK 块包含的应该是最近收到的报文段的序列号范围。由于 SACK 选项空间有限,应尽可能向发送方提供最新信息。其余的 SACK 按先后顺序依次排列,也就是说,该 ACK 报文段除了包含最新接收的序列号信息,还应重复之前的 SACK 信息。这是因为 ACK 报文段是没有重发机制的,可能会丢失,重复提高了其鲁棒性。发送方应该充分利用 SACK 信息来进行重传,称为选择性重传。发送方记录累积 ACK 信息和 SACK 信息,当接收到相应序列号范围内的 ACK 时,在其重传缓存中标记该报文段重传成功。

【tcp】关于tcp 超时重传次数
一般TCP报文的重传超时时间 TCP重传时间间隔有着多种不同的算法,最常见的就是《TCP/IP详解卷1》中关于超时重传的算法。具体算法不再赘述,请大家参考《TCP/IP详解卷1》第21章《TCP的超时与重传》。SYN报文重传间隔时间在实际情况下,由于SYN报文是TCP连接的第一个报文,如果该报文在传输的过程中丢弃了,那么发送方则无法测量RTT,也就无法根据RTT来计算RTO。因此,SYN重传的算法就要简单一些,SYN重传时间间隔一般根据系统实现的不同稍有差别,Windows系统一般将第一次重传超时设为3秒,以后每次超时重传时间为上一次的2倍,如下图所示:报文重传的次数TCP报文重传的次数也根据系统设置的不同而有区分,有些系统,一个报文只会被重传3次,如果重传三次后还未收到该报文的确认,那么就不再尝试重传,直接reset重置该TCP连接,但有些要求很高的业务应用系统,则会不断的重传被丢弃的报文,以尽最大可能保证业务数据的正常交互。数据被重发以后若还是收不到应答,则进行再次发送。此时等待确认应答时间会以2倍、4倍的指数函数延长。此外,数据也不会被无限、反复的重发。达到一定的重发次数之后,如果仍然没有任何确认应答返回,就会判断为网络或者对端主机发生了异常,强制关闭连接。最小重传时间是 200ms最大重传时间是 120s重传次数为 151 保障了业务的可靠性TCP的重传存在原因就是为了保障TCP的可靠性,正是由于TCP存在重传的机制,那些基于TCP的业务应用在网络交互的过程中,不再担心由于丢包、包损坏等导致的一系列应用问题了。2 反映网络通讯的状况由于IP协议的不可靠性和网络系统的复杂性,少量的报文丢失和TCP重传是正常的,但是如果业务交互过程中,存在大量的TCP重传,会严重影响业务系统交互的效率,导致业务系统出现缓慢甚至无响应的情况发生。一般而言,出现大量TCP重传说明网络通讯的状况非常糟糕,需要站在网络层的角度分析丢包和重传的原因。在实际的数据交互过程中,重传报文一般具有以下两个特征:一是TCP交互序列号突然下降;二是其在TCP报头中的序列号、数据长度、应用数据等参数跟前面某TCP报文一致。1 序列号突然下降(一般是TCP重传)在TCP报文传输的过程中,因为其需要不断的交互应用数据,因此,TCP报文的序列号会不断的变大。正常情况下,TCP序列号不会出现下降的情况,出现序列号下降,一般都是TCP的重传报文导致的。如下图所示:在上图中,服务器端交互的TCP报文序列号从24481开始一直处于不断上升的趋势,但是服务器的第六个TCP报文序列号却突然下降为20161,这个情形,基本上可以肯定这第六个TCP报文是前面某个报文的重传报文。2 根据序列号、长度甚至应用数据等确认是哪一个报文的重传。在数据交互过程中,一般情况下,TCP重传的报文跟传输中被丢弃的报文在序列号、数据长度、应用字段值上都是一样的,我们可以利用这个特征来确定某个具体的TCP报文是否是前面某个报文的重传。下图是一个客户端存在重传的数据流图:在上图中,我们看到客户端第三个报文和第四个报文的序列号(Seq)、下一个序列号(Next Seq)以及载荷长度都是一样的,那么我们可以肯定客户端的第四个报文是客户端第三个报文的重传。现在很多的网络分析工具的专家诊断系统基本上都可以针对TCP重传直接告警,我们不需要在去深入分析这个过程了,为我们节省了大量的分析时间。为什么TCP存在重传https://blog.51cto.com/woniu421/900010基础篇 | TCP连接的建立和断开受哪些系统配置影响?https://time.geekbang.org/column/article/284912?utm_source=related_read&utm_medium=article&utm_term=related_readLinux TCP_RTO_MIN, TCP_RTO_MAX and the tcp_retries2 sysctlhttps://pracucci.com/linux-tcp-rto-min-max-and-tcp-retries2.html聊一聊重传次数https://perthcharles.github.io/2015/09/07/wiki-tcp-retriesTCP重传机制https://www.dazhuanlan.com/mofeia/topics/1357902TCP网络关闭的状态变换时序图https://coolshell.cn/articles/1484.htmlTCP 的那些事儿(上)https://coolshell.cn/articles/11564.htmlTCP 的那些事儿(下)https://coolshell.cn/articles/11609.html

一些TCP常见问题如重传、乱序等要如何处理?
TCP连接问题: https://community.emc.com/thread/212373如果SYN报文收到回复RST,则检查拦截了port号的防火墙。三次SYN而没有任何回复,或者是由于应用程序没有响应,或者是由于防火墙拦截了特定端口上的请求。永远记住确认一下是否有NAT,端口转发,以及涉及TCP和UDP端口的机制。这些机制可能会中断TCP正常操作。TCP重传问题:当你看到通信链路上发生重传,进行以下步骤:定位问题——是一个特定IP地址,特定连接,特定应用,还是其他问题。查看问题是否由于通信链路,丢包,慢速服务器还是PC。查看应用是否慢速。如果不是由于上述原因,检查延时变化。TCP重复ACK与乱序:如果重复ACK和重传数量较少(少于1个百分比),是可以接受的。如果重复ACK发生在无线网络环境,或是Internet之上的连接,延时或是延时的改变对于这类网络来说很常见,所以也没有什么可做的。 如果发生在组织内的网络,则可能有问题。如果发生在LAN之上,检查严重的问题,例如缓存和CPU负载,慢速服务器,等等。如果发生在WAN之上,查看延时,负载以及线路不稳定。

本文由 在线网速测试 整理编辑,转载请注明出处。