运输层—TCP的流量控制

来源:互联网 发布:nba2017新秀目前数据 编辑:程序博客网 时间:2024/05/30 23:38

通过滑动窗口协议我们知道传输的销量变高了,但是可能会发生这样的情况,发送方发送数据太快,接收方就来不及接受,造成了数据的损失,这时候就需要利用TCP的流量控制来进行处理:让发送方发送速率不要太快,要让接收方来得及接


A向B发送数据,在连接建立的时候,B就会首先告诉A:我的接收窗口rwnd(receiver window)是400,同时我们要注意的是TCP的窗口单位是字节,而不是报文段,默认每个报文段都是100字节大小。
我们从图中可以分析到:A向B发送了序号1到100的报文段,seq表示序号,接着发送101到201的报文段,然后201到301的报文段丢失了,这时候B向A发送确认,ACK表示确认字段是否有意义(只有当ACK=1的时候确认字段号才有意义),ack表示允许发送的的初始序号,rwnd为300,表示还能够发送300字节的报文。接着A继续发送了301到401,401到501的报文段,然后由于发送方没有收到seq=201的确认,所以通过超时重传,将seq=201的报文段进行重传。B又发送了确认,表示还能发送100字节的报文段,A继续发送501到601报文段,B发送确认,告诉rwnd=0,不能发送新的报文段。
这里还需要我们考虑到一种情况,接着上述的过程,如果B又有了400的缓存空间,那么就要向A发送确认,但是不幸的是,确认报文丢失了,那么这时候A和B都不会在进行操作,都在等对方发送,就造成了死锁。为了解决这个问题,TCP为每一个连接都设有一个持续计时器,只要TCP连接中的一方收到了另一方的零窗口通知,就启动持续计时器。如果持续计时器的 时间到了,就发送一个零窗口的探测报文段(仅仅携带1字节的数据)。
流量控制还必须考虑的一点是传输效率,我们可以采用下面三种发送机制来发送数据:
(1)如果缓存中的数据到达了最大报文长度,那么就发送出去
(2)根据应用进程发送的push指令来进行发送数据
(3)设置一个计时器,计时器时间到,就发送数据
在TCP实现中,广泛采用了Nagle算法:发送方先把第一个数据字节发送出去,将后面的数据字节缓存起来,等到接收方对这第一个数据字节发出确认之后,再把缓存中的数据字节全部发送。
另外,我们需要探讨下怎么解决糊涂窗口综合症(silly window syndrome):如果接收方的缓存已经满了,应用进程每次只从缓存中读取一个字节,然后接收方就向发送方发出确认,说现在有1个字节的空间了,接着发送方的又发送了一个字节的数据,接收方又忙了。如此循环下去,造成网络效率非常低。要解决这个问题,可以这样做:让接收方等待一段时间,不能有一点空间就进行发送确认,知道缓存中有足够的空间才进行发送确认操作。另外,发送方也不要发送太小的数据,要合理利用上面的三种机制的配合进行发送。
1 0
原创粉丝点击