方差分析中重复次数计算方法如下:
1组间效应分析
分析结果来源于SPSSAU
分析组间效应,即两种药物类型(新药和旧药)对于抑郁的差异性,上表可知:药物类型并没有呈现出显著性(F =0224,p =0646>005),说明新药和旧药对于抑郁症没有明显的差异,也即说明药物对于抑郁症治疗没有明显的帮助。
2球形度检验
分析结果来源于SPSSAU
SPSSAU分析建议
针对组内项时间点进行球形度检验可知:本次重复测量方差模型没有通过球形度检验(p=0031<005),并且球形度W值为0463<075,因此最终应该以GG校正结果为准。
PS:如果组内项水平数量为2(比如两个时间点)则不需要进行球形度检验;如果有缺失数据,可能导致无法进行球形度检验。
3组内效应分析
分析结果来源于SPSSAU
球形度检验显示最终应该使用GG校正结果,上表格中用蓝色标识出最终需要查看的结果值。对于时间点来看,其呈现出01水平的显著性(F =4136,p =0055 <01),即说明不同时间点时患者的抑郁症程度有着明显的差异性。同时对于时间与药物类型交互项上,其并没有呈现出显著性(F =0591,p =0499> 005),说明并不存在差异效应。
4折线图分析
分析结果来源于SPSSAU
从上图可以看出:第1周时抑郁程度分值为400分,第4周时为408分,第8周明显上升为483分,说明随着时间的变化,患者抑郁情况有加重迹象,尤其从第4周到第8周变化时,抑郁程度分值由408分明显上升到483分。(PS: SPSSAU还提供了药物类型均值折线图以及交互项的均值折线图。)
5均值分析
分析结果来源于SPSSAU
上表可以看出第1周、第4周、第8周的平均值、标准差以及样本量。 (PS:SPSSAU还提供了药物类型均值表以及交互项的均值表)
6事后多重比较
分析结果来源于SPSSAU
对于第1周-第8周来看,其呈现出01水平的显著性(p =0050 <01),即说明二者具有差异性。
对于第4周-第8周来看,其呈现出01水平的显著性(p =0087 <01),即说明二者具有差异性。
7简单效应比较
分析结果来源于SPSSAU
上表结果显示:对于第1周、第4周、第8周来看,P值均大于01,即说明三个时间点的药物类型均不具有差异性。
查看原文
图中黑色那条就是因为定时器超时仍没有收到 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+α×RTTnew
SRTT(smooth RTT),RTTnew 是新测量的值。如上,为了防止 RTT 抖动太大,给了一个权值 a ,也叫平滑因子。a 的值建议在 10%~20%。举个例子,当前 RTTs=200ms,RTTs=200ms,最新一次测量的 RTT=800ms,RTT=800ms,那么更新后的 RTTs=200×0875+800×0125=275ms,RTTs=200×0875+800×0125=275ms
Δt 如何得到呢?RFC 2988 规定:
RTO=SRTT+4×RTTD
因此,按照上面的定义, Δt=4×RTTD 而 RTTD 计算公式如下:
RTTD=(1−β)×RTTD+β×|SRTT−RTTnew|
实际上,RTTD 就是一个均值偏差,它就相当于某个样本到其总体平均值的距离。这就好比你的成绩与你班级平均成绩差了多少。RFC 推荐 β=025。
根据前面的公式,我们可以得到 RTO。一旦超过 RTO 还没收到 ACK,就会引起发送方重传。但如果重传后还是没有在 RTO 时间内收到 ACK,这时候会认为是网络拥堵,会引发 TCP 拥塞控制行为,使 RTO 翻倍。则第 n 次重传的 RTOn 值为:
RTOn=2^(n−1)×RTO1
下图是一个例子:
如上,在时间为022531时开始第一次重传,此后重传时间开始指数增大,(在尝试了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 算法来解决(略)。
<img src=">第一次握手 :
建立连接时, 客户端发送SYN 包(SYN=j)到服务器,并进入 SYN_SEND状态 ,等待服务器确认。
(SYN:同步序列编号(Synchronize Sequence Numbers)。)
服务器 收到SYN包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即 SYN+ACK包 ,此时服务器进入 SYN_RECV状态 。
客户端 收到服务器的SYN+ACK包, 向服务器发送确认包ACK (ack=k+1),此包发送完毕, 客户端和服务器进入ESTABLISHED状态 ,完成3次握手。
完成3次握手,客户端与服务器端开始传送数据。
涉及的几个重要概念:
1未连接队列
在3次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
2 backlog参数
未连接队列的最大容纳数
3SYN-ACK重传次数
服务器发送完SYN-ACK包,如果未收到客户端确认包,服务器进入首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
4 半连接存活时间/ timeout时间/ SYN_RECV存活时间
半连接队列的条目存活的最长时间,即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间综合。
为什么不是两次
我们先来将三次握手这个过程捋一遍。(S-服务端,C-客户端)
假想一下,如果我们去掉了第三次呢?
因为我们不进行第三次握手,所以在S对C的请求进行回应(第二次握手)后,就会理所当然的认为连接已建立,而如果C并没有收到S的回应呢?此时,C仍认为连接未建立,S会对已建立的连接保存必要的资源,如果大量的这种情况,S会崩溃。
因此第三次握手是必要的。
为什么不是四次
首先,如果乐于思考的同学应该会对上面有这样的疑问:
既然没法确认第二次的握手,C是否可以收到,
那么怎么确定第三次握手S就可以收到呢?
不错,这根本没法确定,因为完全可靠的通信协议是根本不存在的,我们任何的通信协议都是在接受这样的现实情况之上进行的。
而 三次握手后,C和S至少可以确认之前的通信情况,但无法确认之后的情况。
在这个道理上说,无论是四次还是五次或是更多次都是徒劳的 。
假设Client端发起中断连接请求,也就是发送FIN报文。 Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以 你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文 ,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。 Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态, 如果Server端没有收到ACK则可以重传。“, Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL( 最大报文段生存时间 )后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!
为什么必须是四次挥手?不能是两次?
TCP连接是全双工的, 也就是说接收到FIN只是说没有数据再发过来但是还是可以发送数据的,也就是接受到一个FIN只是关闭了一个方向的数据传输,另一个方向还可以继续发送数据。在四次挥手的时候也是这样 前两次挥手只是确认关闭了一个方向的数据,加上后面两次挥手才真正的关闭了整个全双工连接 。
问题1为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
问题2为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假设网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
因次,各月的流转次数计算如下:
1月份:=170/(52+63)/2=296(次)
2月份:=180/(63+47)/2=327(次)
3月份:=150/(47+58)/2=286(次)
季度的商品流转次数=(170+180+150)/((52+63)/2+(63+47)/2+(47+58)/2/3=909(次)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)