TCP流量控制

流量控制平衡了生产者和消费者的速度


如上图例子:                                                      

(1)客户端发送SYN报文段请求连接(初始序号100),服务器接受SYN,并分配800字节的接收缓存,设置窗口大小rwnd=800

(2)服务器发送SYN+ACK报文段(rwnd=800  序列号seqNo=1000 确认号ackNo=101)rwnd是通知客户端窗口大小为800字节。

(3)客户端接收SYN+ACK后,发送ACK

(4)客户端推送200字节数据数据,报文段(seqNo=101 数据长度200字节) 缓存区中101~300编号的字节已发送待确认接收后就可以释放空间。服务器接收到该TCP报文段,这200字节数据被保存到接收缓存。

(5)服务器发送ACK(ackNo=301 rwnd=600)表示期望接收第301个字节开始的数据,同时窗口大小减小至600,虽然接受缓存大小为800字节,但是窗口不能打开,所以将其右臂右移。告诉客户端也需要同样的设置。

客户端接收到ACK后,待确认的200字节得到确认,空间得到回收。窗口左侧右移200,此时窗口大小正好是600字节。

(6)客户端推送300字节数据,报文段(seqNo=301 数据长度为300),服务器接收到该报文段,并且进程处理了接收缓存中的100字节数据,此时接受缓存中已到未处理的数据(201~600),窗口左边又关闭了300字节同时右边打开100字节,所以此时窗口大小为400

(7)服务器发送ACK(ackNo=601  rwnd=400)告知客户端,可以接收以601开头的数据同时调整窗口大小为400。

客户端接收到该ack后,已发送待确认的301~600编号数据空间得到回收,窗口左侧关闭300字节后窗口大小为300,所以此刻窗口右侧还需打开100字节,保证窗口大小复合服务器的标准。

(8)服务器进程又拉进200字节,左侧窗口关闭200,接收缓存中的数据减少了。同时窗口右侧打开200字节,使得窗口大小增加到600字节。

所以此时服务器发送ack(ackNo=601 rwnd=600)告诉客户端

(9)客户端在接受到该ack后,做出相应调整....

.......


2、相关问题:

(1)发送方接收方窗口右侧尽量不左移,解决办法:

1)为避免发送方接收方窗口右侧左移:接收方推迟发送反馈,直至他的窗口有足够的缓存空间时,才反馈一个ack

2)接收端可以发送窗口大小为0的报文段来暂时关闭窗口。此时发送方并不是真正的将窗口大小设置为0,而是暂停发送数据,直到收到一个新的通告为止。

但是如果服务器发送的新的ack丢失了,会产生死锁怎么办?-->发送方可以采用探测数据报来防止死锁。这里和重传机制避免死锁的方式一致,探测数据报指设置一个持续计时器


3、糊涂窗口综合征

发送程序产生数据太慢,或者接受程序处理数据太慢,或者二者都有,导致每次发送的报文段很小。因为报文段每次要引入20字节的TCP首部+20字节的IP首部,所以当数据量太小时,效率低。这种现象叫做糊涂窗口综合征

解决办法:强迫TCP等待,把数据集集成一个大块后再发送。 

Nagle算法:第一块数据发送出去;发送第一段报文段后,发送TCP就开始缓存直到收到ack后,才集成大块再发送。该算法权衡了发送方产生数据的速率和网络运输的速率。

Clark方法;因为TCP携带的数据块有一定长度,所以当接收方至少有一半缓存为空之前就通告窗口值为0,让发送方先不再发送。

推迟确认


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值