5. 流量控制
(1)流量控制:就是让发送方的发送速率不要太快,要让接收方来得及接收。
(2)流量控制原理
①在客户端向服务器发送TCP连接请求时,TCP首部会包含客户端接收窗口的大小,服务器就会根据这个窗口调整自己发送窗口的大小。
②在传输过程中,客户端发送的确认数据包,除了确认号还包含窗口信息,服务器收到确认数据包后,会根据窗口信息调整发送窗口。通过这种方法进行流量控制。
(3)流量控制过程
①在连接建立时,B告诉A“我的接收窗口(rwnd)为400字节”,这时A的发送窗口就被设置为400。(注意,ACK表示首部中的确认位,ack表示确认号)
②假设A发送第1~3分组出去,其中B收到1、2分组,但第3个分组丢失。这时A还没来得及发送第4个数组包,就收到了B发送的的确认包(Ack=1,ack=201,rwnd=300,其中的rwnd是B根据自己当前的缓存情况给出的)
③A将自己的发送窗口调整为300(第1次流量控制)并前移200字节,然后发送第4、5个分组。假设之后第3个分组超时重传时间到,就会接着发送第3个分组。
④B收到3、4、5分组以后发送确认,并根据自己缓存情况调用接收窗口(设为100)。
⑤A收到B的确认以后,调整发送窗口为100(第2次流量控制),并发送第6个分组。
⑥B收到第6个分组后,缓存满就会发送(ACK=1,ack=601,rwnd=0)的确认包让A停止发送。
⑦A收到确认包以后将发送窗口调整为0(第3次流量控制),然后停止发送。
⑧当B缓存有空间时,会调整接收窗口(400),并向A发送确认包(Ack=1,ack=601,rwnd=400)让A继续发送分组。如果B的这个确认包中途丢失,TCP为每一个连接设置了一个持续计时器。只要一方收到零窗口通知,就启动计时器。若计时器到时,就会发送一个零窗口探测报文要求对方给出窗口值,以避免A和B处于互相等待的死锁状态。