TCP的流量控制
1. 概述
实现方式: TCP的流量控制通过滑动窗口机制来实现,数据接收端可根据自己的资源情况,随时动态地调整对方的传输窗口大小。
注:
- 滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。其中一个重要区别是,一个是针对于帧的传送,另一个是字节数据的传送(TCP是面向字节的)。
- TCP是面向字节流的,发送的数据块视为一连串无结构的字节流,每次发送提取一部分字节构建一个TCP报文段,即TCP不保证接收方收到的数据块与发送方的数据库大小相同。这是TCP实现可靠传输、流量控制、拥塞控制的基础
2. 过程总结
假设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返回确认报文段
3. 其他保证可靠传输的机制
- 发送方的 超时重传计时器
- 流量控制
- 拥塞控制
- TCP首部的校验和字段
4. 死锁
当B向A发送了0窗口报文,B此时已经没有空间接受A发送的数据了,通知A停止发送。A在收到后即停止发送,等待一段时间后,B有了一些空间,可以继续接收了,此时再向A发送非0窗口报文。
如果此非0窗口报文在网络中丢失,那么A将一直等待非零窗口的通告,B也一直在等待A发来的数据,这样就会造成死锁。
解决:
假设A收到B发送的零窗口通知,A就会启动持续计时器
若持续计时器超时,A会发送零窗口探测报文
B收到后将当前窗口大小值返回给A
- 如果窗口仍是0,重启持续计时器,超时后再发送探测报文段
- 假设rwnd不为0,则A改变发送窗口大小,开始发送报文段
注意:零窗口探测报文段也有重传计时器,若零窗口探测报文段丢失,当重传计时器超时,零窗口探测报文段会重传