谈TCP的可靠性,不得不说流量控制
一般来说,我们总是希望数据传输的更快一些,但如果发送方把数据发送的过快,接收方就可能来不及接收,就会造成数据丢失。
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口机制可以很方便地在TCP连接上实现对发送方的流量控制。
TCP接收方利用自己的接收窗口的大小来限制发送方发送窗口的大小
TCP发送方接收到接收方的零窗口通知后,应启动持续计时器。持续计时器超时后,向接收方发送零窗口探测报文
1,初始滑动窗口大小为400字节,发送1-100号字节数据成功,101-200号字节数据成功,这时滑动窗口内还能发送200字节数据,当发送第201-300号自己数据流失了,这时滑动窗口还能发送100字节
2,接受方对收到的201号以前的数据进行累计确认,发现自己的缓冲区快满了,将自己的接收窗口调整为300,并放入TCP首部的‘窗口大小字段’,通过ACK来通知发送方,对发送方进行流控。
3,发送方收到ACK后调整自己的滑动窗口,还能发送201-500号共300个字节数据
4,发送方发送301-400号字节数据,滑动窗口内还剩100字节,继续发送401-500号字节数据,滑动窗口内没有剩余字节了,不能再发送新数据了
5,发送方超时重传计时器超时,重新发送旧数据201-300号字节,不能发送新数据
6,接受方对收到的501号以前的数据进行累计确认,发现自己的缓冲区快满了,将自己的接受窗口调整为100,并放入TCP首部的‘窗口大小字段’,通过ACK来通知发送方,对发送方进行流控。
7,发送方收到ACK后调整自己的滑动窗口,还能发送501-600号共100个字节数据
8,发送方发送501-600号共100字节数据,滑动窗口内没有剩余空间,不能发送新数据了
9,接受方对收到的601号以前的数据进行累计确认,发现自己的缓冲区满了,将自己的接受窗口调整为0,并放入TCP首部的‘窗口大小字段’,通过ACK来通知发送方,对发送方进行流控。
10,发送方收到ACK后调整自己的滑动窗口,发现滑动窗口值是0,不能发送新数据。
11,当接受缓存有了一些存储空间时,接收方调整接受窗口到300,并告诉发送方,等待发送方发送数据,这个时候该通告有可能丢失。
12,发送方为了防止接收方调整窗口的通告丢失,在接到滑动窗口值是0的时候启动持续计时器,
当持续计时器超时,发哦是哪个零窗口探测报文
13,接受方对零窗口探测报文进行确认,并通告自己的接收窗口大小
14,零窗口探测报文段也有持续计时器,如果没有接收到确认信息,也会重新发送零窗口探测报文