标签:
(一)一般实现可靠性传输有两种元素
——通过Acknowledgements (接收方收到一个数据,就发送一个ACK表示他收到了)
——通过计时器 (即一个数据发送出去开始计时,如果时间到了依然没有收到对应的ACK,就重新法术数据包)
(二)停止等待协议
——同一个时间,在链路上只能发送一个数据包,如果没有接受到ACK,就不能发送第二个数据包,这样做浪费带宽。
如图所示的情况。
——同样的,他可能会导致重复收到同样的数据包,(ACK可能会LOST或者DELAY,都会造成TIMEOUT,导致重新发送数据包)
(三)滑动窗口协议
滑动窗口协议则可以让,多个数据包在外面同时进行传送。同时对每一个数据包用Sequence number来继续编号,为了维持他的顺序。
多个数据包到底有多少个呢?一般是 delay*bandwidth 的大小,让数据可以充满这个信道。
对于发送方和接收方都有一个滑动窗口。
Sender
SWS(发送方的窗口大小)=delay*bandwidth
LAR(Last Acknowledgement Receiver) 最后收到的确定数据包
LFS(Last Frame Sent) 最后发送的数据包
Receiver
RWS(接收方的滑动窗口大小) = 1 或者 SWS 之间
LAF (Largest Acceptable frame) 可以接受的最大的SEQ号码的数据包
LFR (Last Frame Receive) 最近按照顺序收到的数据包
SWS滑动的条件 就是收到(LAR+1)ACK编号的数据包,如果不是都不能滑动。
RWS滑动的条件 就是收到LFR+1编号的数据包,如果不是都不能滑动。
当SWS=RWS时, SWS<(MaxSeqNum+1)/2, 否则会导致重复接受到同样的数据包。
可以看例子
这是不符合的情况
如果改成就可以 SWS<(MaxSeqNum+1)/2
ACK的形式
——NAK,(当收到错误的数据包时,会回复一个NAK,告诉Sender这个包是错误的,这样就不用等到TIMEOUT就才重送,一般一个TIMEOUT>RTT)
——Cumulative acknowledgement (他回复的ACK他是有累计的意义,假设回复一个4,就代表之前的0,1,2,3的数据包全都收到了)比较常用。
滑动窗口协议的三个功能
——提供可靠性的传输
——提供传输的循序(送给上一层的会按顺序,虽然传输的时候有可能乱序,但是之前收到的数据包,可以先存在buffer里面,等到全部好了,在传给上面一层)
——流量控制(通过调整RWS,RWS越大流量越大)
标签:
原文地址:http://www.cnblogs.com/wpqwpq/p/5735159.html