在理解流量控制之前我们先需要理解TCP的发送缓冲区和接收缓冲区,也称为套接字缓冲区。首先我们先知道缓冲区存在于哪个位置?
其中缓冲区存在于Socket Library层。 而我们的发送窗口和接收窗口就存在于缓冲区当中。在实现滑动窗口时则将两个指针指向缓冲区的两个位置来维持一个窗口,通过指针的移动来实现窗口的滑动。
1.在发送窗口中存在着四个区域。其中第一个是已经发送并且已经收到确认的,另一个是已经发送但是未收到确认的,另一个是未发送的,最后一个是不能发送的。窗口滑动的时机是:收到对方的ack,此时滑动窗口开始移动。
2.在接收窗口存在着四个区域。其中第一个是已经被应用程序读取的,另一个是还未收到的,另一个是收到的,另一个是不允许接收的。窗口滑动的时机是:应用程序将收到的数据读取走此时滑动窗口开始移动。
采用上述方法来实现流量控制。
当窗口缩小到0时将不能在发送数据,此时处于等待状态,等待接收方发送ack使得窗口变大,但是倘若ack报文丢失,双方将处于死锁状态,为了防止这种情况发生就使用一个定时器,当一段时间后发送方给接收方发送报文询问窗口是否扩大,以此来解决问题。
为了提高网络的吞吐量,提高网络传输效率。
一、我们可以启用nagle算法:
算法思想是只允许发送窗口内存在一个未被ack的小包数据。其中的特点是:
1.如果包的大小>mss则允许发送 2.包含FIN报文允许发送 3设置了TCP_NODELAY允许发送 4超时200ms允许发送。
nagle算法将包累积到一起进行发送,提高了吞吐量但是牺牲了时延。类似于公交车是一次拉满人还是多拉几次。比较适用于人比较多的情况。同样此算法适用于网络数据比较多的情况。
二、我们可以延迟ACK:
延迟时间通常是200ms