tcp协议-流量控制
前言
原因:数据传输总是尽可能要求的快。但如果发送方把数据发得过快,接收方就可能来不及接收,这就会造成数据的丢失。流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接收。
实现方向:TCP的流量控制通过滑动窗口机制来实现,数据接收端可根据自己的资源情况,随时动态地调整对方的传输窗口大小。
滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。其中一个重要区别是,一个是针对于帧的传送,另一个是字节数据的传送(TCP是面向字节的)。
TCP是面向字节流的,发送的数据块视为一连串无结构的字节流,每次发送提取一部分字节构建一个TCP报文段,即TCP不保证接收方收到的数据块与发送方的数据库大小相同。这是TCP实现可靠传输、流量控制、拥塞控制的基础。
过程
假设A要向B发送数据,主机建立TCP连接时,B告诉A接收窗口rwnd 的大小。
假设A发送的每个TCP报文段可携带100个字节数据,每个小格子是100个字节数据。
A向B将窗口内的数据封装成报文段发送(在发送数据后,便立刻创建一个该报文段的重传计时器),凡是没有收到确认的数据都会保留在发送缓存,以便在超时重传时使用。
B会对接收到的报文段进行累计确认,返回确认报文段,确认位ACK=1(在建立连接后ACK都为1),ack=201(确认号为接收方期待发送方发送的下一个报文数据的第一个字节的序号), B根据缓存大小返回 rwnd接收窗口大小,假设返回值为300。
A收到B发送的确认报文段:
A会将窗口调整为300;
并删除缓存中已经被确认的数据报 ;
则撤销已被确认的报文的重传计时器;
假设A发送的数据报中途丢失,该报文段的重传计时器超时后,则A重发报文段,直到B返回确认报文段。
TCP发送方的发送窗口 = min{ 自身拥塞窗口,TCP接收方的接收窗口 }
死锁:
当B向A发送了0窗口报文,B此时已经没有空间接受A发送的数据了,通知A停止发送。A在收到后即停止发送,等待一段时间后,B有了一些空间,可以继续接收了,此时再向A发送非0窗口报文。
如果此非0窗口报文在网络中丢失,那么A将一直等待非零窗口的通告,B也一直在等待A发来的数据,这样就会造成死锁。
解决:
假设A收到B发送的零窗口通知,A就会启动持续计时器。
若持续计时器超时,A会发送零窗口探测报文。
B收到后将当前窗口大小值返回给A。
如果窗口仍是0,重启持续计时器,超时后再发送探测报文段。
假设rwnd不为0,则A改变发送窗口大小,开始发送报文段。
补充
零窗口探测报文段也有重传计时器,若零窗口探测报文段丢失,当重传计时器超时,零窗口探测报文段会重传