停止等待协议:
放送方发送一个数据包,要收到接收方对该包的确认后,才发送下一个数据包。
缺点:慢,信道利用率低。
ARQ Automatic Repeat reQuest
接收方采用累加确认的方式,接收方不必对每一个分组进行缺,只需要对按序到达的最后一个分组发送确认。
缺点:当发送方发送了5个分组,中间第3个丢失,那么接收方只对前两个分组进行确认。发送方只好把后面的3个分组都重传一次。这叫做Go-back-N(回退N)
选择确认 selective ack
接收方对接收到的数据字节流中,若有中间字节块的缺失,只需要重新传输缺失的就可以了,对已经接收到的字节块无需重传。
需要在TCP首部的选项中设置 ”允许SACK” 的选项。
TCP流量控制:
让发送方的发送速率不要太快,要让接收方来得及接收。端到端的问题。
机制:滑动窗口
S--------------->R
当接收方R 的窗口为0时候,S就不能再发送数据了。当R的窗口不为0时候R会发送一个数据给S来表明当前的窗口大小,但是为了防止S收不到R又有窗口的通告,S启动一个持续计时器(persistent timer),只要TCP连接的一方接收到对方的零窗口通告,就启动持续计时器。若持续计时器设置的时间到期,那么发送一个零窗口的探测报文段。
Nagle算法:
此算法在TCP的实现中广泛使用。
若发送应用进程把要发送的数据逐个字节地发送到TCP的发送缓存,则发送方就把第一个数据字节先发出去,把后面到达的数据缓存起来。当发送接收到对第一个数据字符的确认后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。只有收到对前一个报文段的确认后才继续发送下一个报文段。Nagle算法还规定,当到达的数据已经达到发送窗口的一半或已经达到报文段的最大长度时,就立即发送一个报文。
糊涂窗口综合症:
接收方缓存已经满了,并且一次只从缓存读取一个字节,所以通告给发送方的窗口只有一个字节,那么接收方一次只发送一个字节的数据,但是发送效率低,因为一个字节数据要40个字节协议头部。如果每次发送一个字节的话效率很低,解决方法是:让接收方等待一段时间,再通告自己的窗口大小给接收方。
TCP拥塞控制:
是整个网络的问题(全局性的)。
①慢开始和拥塞避免:
发送方维持一个叫做拥塞窗口CWND(congestion window)的状态变量。发送方的拥塞窗口等于自己发送窗口。
慢开始:
发送方一开始设置CWND=1,发送一个包,接收到该包确认后,发送方设置CWND=2,发送之后,接收到该包的确认,发送方设置CWND=4 ……以此类推,成倍增长。
千万注意:窗口大小并不时一次性发送数据的大小,发送方可以根据CWND进行连续几次的发数据,这连续发送的数据大小不应该超过CWND。
为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢启动开始门限 ssthresh 。
当cwnd等于ssthresh 的时候,cwnd并不在是成倍的增长了,而是逐渐加1
当网络拥塞时候(就是发送方没有按时接收到确认),那么就把慢开始门限值设置成当前的CWND的一半,接着将cwnd设置为1,执行慢开始算法。
②快重传和快恢复:
快重传要求接收方收到一个失序报文段后立即发送重复确认(目的是让发送方尽早知道数据段没到达),而不要等到自己发送确认数据时候后捎带。
发送方发送5个报文,第3个缺失,收到第四个报文时候立即发送对第2个的重复确认,接收到第4个、第五个报文时候也发送对第2个的重复确认。只要发送方一连收到3个重复确认就应该重发接收发未收到的报文,而不必等到第3个报文的重传计时器过期才重发。
因此,使用快重传可以提高整个网络的吞吐量。
快恢复与快重传配合使用:
当发送方连续接收到3个重复确认,就执行“乘法减小”算法,把慢开始门限值ssthresh设置为当前CWND的一半,同时,将此时的CWND=新的ssthresh值,接下去并不执行慢开始算法。
因为收到3个重复报文并不时意味着网络出现问题,可能仅仅就是那个包缺失了,所以ssthresh减半后,cwnd在ssthresh的基础上逐渐加1。
原文地址:http://blog.51cto.com/jackor/2088646
时间: 2024-10-11 13:40:33