滑动窗口
TCP协议中,由于一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大提高性能(将多个段的等待时间重叠在一起)
窗口大小指的是无需确认应答而可以继续发送数据的最大值,上图窗口大小就是4000个字节(四个段) 发送前四个段,不需要等待任何ACK,直接发送 收到第一个ACK,滑动窗口向后移动,继续发送第五个段的数据,依次类推 操作系统为了维护这个滑动窗口,需要开辟一个发送缓冲区来记录当前没有应答的数据,而确认应答过的数据,会从缓冲区删除 窗口越大,则网络的吞吐率越高
滑动窗口也有丢包情况,如何进行重传呢? 情况一:数据包到达,ACK丢了 这种情况下,部分ACK丢了不要紧,可以通过后续ACK进行确认;
**情况二:**数据包丢了
当某一段报文段丢失后,发送端会一直收到1001这样的ACK,当发送端主机连续收到了三次同样的”1001“这样的应答,就会重发对应的数据1001—2000。 此时接收端收到了1001之后。再次返回的ACK就是7001了(因为2001——7000)接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中,这种机制被称为”高速重发机制“(快重传)。
流量控制
由于接收端处理数据是有限的,如果发送端发的太快,导致接收端缓冲区满了,这时发送端继续发送数据将会导致丢包,继而会引起一系列重传反应,因此TCP根据接收端的处理能力来决定发送的速度,这就是流量控制。
接收端将自己可以接受的缓冲区大小放入TCP首部中的“窗口大小”字段,通过ACK段通知发送端窗口的字段越大,网络吞吐量越高。 接收端一旦发现自己快满了,就会将窗口大小设置成一个更小的值传给发送端,发送端接收到这个数据后就会减缓发送速度。 如果接收端缓冲区满了,此时窗口大小设置为0,发送端将不会在发送数据,而是定期发送一个窗口探测数据段,使接收端将窗口大小告诉发送端。
拥塞控制
核心就是防止开始传输时由于传输数据过大,网络不好而引起的大量丢包问题,引入慢启动机制,开始先发送少量数据看网络是否堵塞,然后在决定以多大的速度传输数据。
引入一个概念称为拥塞窗口,发送开始的时候, 定义拥塞窗口大小为1,每次收到一个ACK应答, 拥塞窗口加1。 每次发送数据包的时候, 将拥塞窗口和流量控制的窗口大小做比较, 取较小的值作为实际发送的窗口。 拥塞窗口是按指数增加的,为了避免拥塞窗口增长的太快,引入一个慢启动阈值,当拥塞窗口超过这个阈值的时候,变为线性增长。 慢启动开始的时候,阈值等于窗口的最大值,每次超时重传时阈值变为原来的一半,拥塞窗口置回1。 当TCP开始通信的时候,网络吞吐量开始上升,随着网络拥堵,吞吐量立刻下降。
拥塞控制归根结底就是 TCP协议尽可能的将数据传输给对方,但又要避免给网络造成太大的压力的折中方案。
延迟应答
如果接收端接收到数据就返回一个ACK的话,此时返回的ACK就会很小,比如说:如果接收端缓冲区为800KB的话,发送一个400KB的数据,立即返回的话窗口大小只有400KB,但是延迟一会再发的话,缓冲区可能就会把这400KB的数据处理掉了,这时返回的窗口大小就为800KB,极大的提高传输效率。 但并不是所有的包都可以延迟应答,他会收到数量限制和时间限制,每隔一定数量的包就应答一次,超过最大延迟时间就应答一次。
捎带应答
在延迟应答基础上,客户端服务器在应用层上也是“一发一收的”,那么此时ACK就可以搭顺风车和服务器回应的数据一起回给客户端。
|