TCP如何进行流量控制?

发布者:上海IT外包来源:http://www.lanmon.net点击数:1411

我们都知道TCP是一种可靠的,面向连接的传输层协议。我们总是希望TCP能够尽可能快地传输数据。如果出现这种情况,发送方的数据发送速度非常快,接收方耗尽自己的资源,没有时间接收它。然后将丢弃冗余数据,这与TCP可靠性的目的相反。
因此,有必要引入一种流量控制方式:让发送方不要发送太快,以便接收方能够顺利接收数据,并且不会导致网络链路阻塞。
思想
按照这种想法:让发件人不要发送太快。然后让接收方控制发送方的数据大小,并在每次响应响应时通知发送方剩余多少空间来接收数据。当然,实际的互动并不是那么简单,只是提供了一个想法。使用这个想法,滑动窗口的方式诞生了。
滑动窗口
滑动窗口就像一个窗口,告诉发件人可以发送的数据的大小。也可以说窗口标记了接收器缓冲区的大小。窗口的大小还表示一次可以发送多少数据,并且可以刷窗口,因此滑动窗口得名。
如何判断发件人窗口大小?
如何判断发件人窗口大小?重新发送数据包告诉对方是不合理的吗?确认响应包可以巧妙地使用。仅有一个确认响应包是不够的。如果是第一次互动,则需要在握手三次时通知对方。 (rwnd表示接收窗口)
在原始确认响应策略中,每次发送数据时,都需要Ack响应。收到Ack后,发送下一个数据段。发件人未收到Ack响应。这样做的方式太低了。使用滑动窗口,只要不超过另一个窗口的大小,就可以多次发送数据。这大大提高了效率。
滑动窗口细节
接收器可以自己接收的缓冲区的大小在TCP报头的“窗口大小”字段中表示,并且发送方由Ack通知。
窗口大小是发件人可以发送的最大值。也就是说,可以省略Ack响应,并且可以发送多个数据。发送的数据总量不应超过窗口大小。
大窗口大小表示高网络吞吐量操作系统内核维护一个接收缓冲区,只有Ack应答后的数据才能从缓冲区中删除。
一旦接收器发现其缓冲区几乎已满,它将通知另一方其窗口值较小。
如果接收器发现其缓冲区已满,则会将窗口大小设置为0.此时,发送方将不再发送数据,但需要定期发送一个窗口检测数据段,以便接收方将告诉发件人窗口大小。 (为此,为什么需要定期发送窗口探测?可以想象,如果接收缓冲区已满,则Ack通知发送方窗口大小为0.发送方永远不会向接收方发送数据,接收方无法告诉对方缓冲区可以接收数据,并且会出现“捕获”情况。

A向B发送数据。建立连接后,B告诉A:“我的接收窗口rwnd=400(字节)。注意:图中箭头上方的大写ACK表示标题中的确认位ACK,小写字母ack表示确认字段的值。
上面的过程是这样的:
A发送数据序列号1到100,也可以发送300个字节。
A发送数据序列号101到200,也可以发送200个字节。
A发送数据序列号201到300,但丢失了数据。
B发送ACK并同时通知A,允许A发送201到500,300字节的序列号。
A发送数据号301到400,也可以发送100个字节。
A发送数据号为401到500,并且不能发送数据。
超时重新传输旧数据,但无法发送新数据
B发送ACK并同时通知A,允许A发送序列号501到600,100字节。
A发送数据序列号501到600,并且不能发送数据。
B发送ACK,同时通知A,不允许A发送数据。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部