背景:
双方在通信的时候,发送方和接受方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这个时候会把处理不过来的数据缓存到缓存区里,如果缓存区满了,发送方还在发数据,那么就要丢弃这些数据,大量的丢包会浪费网络资源。
流量控制是为了让发送方发送速率不要过快,保证接收方来得及接受,防止分组丢失。接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。
如何控制:
接收方每次收到数据包,可以在发送确认报文的时候,同时告诉发送方自己的缓存区还剩多少是空闲的,我们也把缓存区的剩余大小称之为接受窗口的大小,用变量wein来表示接受窗口的大小。
发送方收到之后,变回调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接受窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况。
发送方何时再继续发送数据
当发送方停止发送数据后,该怎样才知道自己可以继续发送数据?
当接受方处理好数据,接受窗口win>0,接受方发个通知报文去通知发送方,告诉他可以继续发送数据了。当发送方收到窗口大于0的报文时,就可以继续发送数据。
但是会出现,可能接受方发出的通知报文在网络传输中丢了,那么发送方一直接受不到继续传输的指令,那么双方就陷入僵局了。
为了解决这个通知报文被丢失,我们当发送方收到接受窗口win=0时,发送方会停止发送报文,并同时开启一个定时器,每隔一段时间就发一个测试报文去询问接收方,打听是否可以继续发送数据了,如果可以就告诉他此时接受窗口的大小;如果接受窗口大小还是0,则发送方再次刷新启动定时器。
TCP规定,即使设置零窗口,也必须接受以下几种报文:
1.零窗口探测报文
2.确认报文
3.携带紧急数据的报文段
附加问题: