TCP重传机制、滑动窗口、拥塞控制

这篇具有很好参考价值的文章主要介绍了TCP重传机制、滑动窗口、拥塞控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、总述

TCP,Transmission Control Protocol,是一个面向连接、基于流式传输可靠传输协议,考虑到的内容很多,比如数据包的丢失、损坏、分片和乱序等,TCP协议通过多种不同的机制来实现可靠传输。今天,重点分析重传机制滑动窗口,以及拥塞控制

二、重传机制

在三握四挥的过程中,服务器和客户端之间就通过带有不同标志位的TCP报文来通知或判断对端或本地是否成功建立、断开连接。

接收主机在接收到数据之后往往都会返回一个应答消息,网络错综复杂,面对随时可能发生的数据丢失问题,TCP使用重传机制解决。常见的重传机制有以下四种:

  • 超时重传
  • 快速重传
  • SACK
  • D_SACK
(一) 超时重传

超时重传,顾名思义,在发送数据时,会设定一个定时器,当超过指定的时间过后,没有收到对端的ACK确认应答报文,就会重写发送该数据。而这又可以分为两种情况:

  • 数据包丢失
  • ACK确认应答丢失

在了解如何设置超时时间之前,先来看看什么是RTT(Round-Trip Time)往返时延

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

RTT,往返时延,数据从一端到另一端。其中,往返这个词是表明了什么范围是所需的时间。

知道了RTT,在来看点相关的:RTO,Retransmission Timeout,直译“超时重传时间”。这个时间的设置毫无疑问关系到我们重传机制的效率高低,看以下两种情况:

  • RTO>>RTT,重发慢,没有效率;
  • RTO<<RTT,包可能还没到就开始重发,重发出去的包数量多了,网络无疑会拥塞,超时的包越来越多,恶性循环。

那么结论显而易见——RTO的值,应该略大于RTT

很容易想到的是,报文往返的RTT值会是经常变化的,所以RTO也应该是一个动态变化的值。(在Linux中,通常会采样RTT的值然后加权算平均,不详细谈了)

而在超时时,TCP的策略是超时间隔加倍

(二) 快速重传

Fast Retransmit,快速重传,不以时间为驱动,而以数据驱动重传

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

在上图中,Seq2一直没有成功被接收方收到,当发送端收到三个Ack=2的确认,就会在定时器过期之前,重传丢失的Seq2

不过,发送方并不知道Ack=2是谁传回来的,那么是重传Seq2还是把之前的所有包都重传呢?根据TCP实现的不同,上述两种情况都是可能的。

(三) SACK

SACK是指Selective Acknowledgment,选择性确认,这种方式通过在TCP头部"选项"字段添加一个SACK,把缓存的地图发送给发送方,这样发送方就知道哪些数据需要重传了。

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议


如果要支持SACK,双方都要支持,在Linux下,通过net.ipv4.tcp_sack这个参数打开(Linux2.4后默认打开)。

(四) Duplicate SACK

D_SACK,主要使用SACK来通知发送方有哪些数据被重复接收了,下面通过两个例子来说明,这个Duplicate到底有什么妙用。

  • ACK丢包

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

发送端通过ACK和SACK就可以明确,是发出去的包丢了还是接收方返回的ACK确认报文丢了

  • 网络延时

在判定网络延迟时,Duplicate的含义才更加明显地体现了出来,即复制的、完全一样的。

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

如上图中提及,在经历了网络延迟和三次相同ACK触发快速重传后,网络延迟的包终于送达,此时返回ACK=3000,SACK=1000~1500(注意之前的SACK范围总是大于ACK),就知道了这个SACK是D_SACK,是重复的包。

三、滑动窗口(流量控制)

(一) 滑动窗口

滑动窗口,Sliding Window,是一种流量控制机制,同时也是一种保持通信效率的技术。已知的是,每当有一个数据包发出,发送端总盼望得到一个ACK确认;那么要是在得到ACK之前不做任何动作,效率的高低明显可见。

为此,TCP引入了窗口的概念,通过指定窗口大小(数据最大值),来进行无需等待确认应答的通信

在实际实现时,是由操作系统开辟一个缓存空间。在发送方得到确认应答前,已发送的数据都会保存在缓冲区,如果按期收到确认应答,此时数据就可以从缓冲区清除。

如此一来,有了累计确认(或累计应答)模式:

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

  • 那么引申出一个问题——窗口的大小由哪一方决定?

TCP报头中有一个16位的字段:窗口尺寸Window,这个字段是由接收方通知发送方自己还有多少缓冲区可以用来接收数据。以免接收方无法正常接收到数据。

  • 发送方,滑动窗口分为4个部分

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

它的工作方式很容易想到:ACK确认一部分,可用窗口就扩大一部分;当发送窗口满了,在接收ACK之前就不再发送数据。

  • 接收方,滑动窗口分为3个部分

TCP重传机制、滑动窗口、拥塞控制,计算机基础知识,网络,tcp/ip,网络协议

值得注意的是,两个窗口的大小是约等于的关系,而不是一模一样。因为滑动窗口不是一成不变的。如果接收方的读取速度有了很大提升,会通过TCP报文通知发送方新的窗口大小。

(二) 窗口关闭问题

TCP中,通过接收方指定窗口尺寸来进行流量控制。在通信中,当接收方窗口被填满,会向发送方说明窗口尺寸位0;等处理好数据后,才会又通告一个窗口非0的ACK报文。不过,要是这个非0报文丢失,就会陷入死锁的状态(双方同时等待)。

  • 窗口探测报文

为了解决这个问题,TCP为每个连接设置了一个持续计时器,只要收到0窗口通告,就启动计时器。当计时器超时,就会发送窗口探测报文,这个报文的用意显而易见。(窗口探测的次数一般是3次)。

(三) 糊涂窗口问题

糊涂窗口是指接收方在处理数据时的速度过慢,导致窗口的尺寸不断变小的现象。实际上就是两个动作让这个现象出现:

  • 接收方通告小窗口
  • 发送方发送小数据

想要避免这种现象,解决上述两个问题就好了。

  1. 在接收方,当窗口小于min(MSS, 缓存空间/2),就会告知对方0窗口,到后面合适的时机再通知非0窗口。
  2. 在发送方,使用Nagle算法进行延时处理,要等到发送窗口大小>=MSS,或者接收到ACK确认报文,才会停止囤积数据。这个算法是默认打开的,在使用telnet和ssh等交互性比较强的程序时,通过TCP_NODELAY来关闭。

四、拥塞控制

(一) 什么是拥塞

上文的流量控制是避免发送方的数据填满接收方的缓存,而拥塞控制,则是为了避免在整个网络环境处于拥堵时,还继续发送大量数据包的手段(可能导致数据包时延、丢失等,重传也会加重拥塞)。

那么很明显,拥塞控制是在发送端实现的。为了调节发送数据的量,定义了“拥塞窗口”的概念。

(二) 什么是拥塞窗口

拥塞窗口,是一个由发送方维护的状态变量,根据网络的拥塞程度动态变化。前面的发送窗口和接收窗口在有了拥塞窗口的加入以后,是这样的关系:

  • 发送=min(拥塞,接收)

拥塞窗口的动态变化也很简答:有拥塞,就变小;没拥塞,就变大。

(三) 如何判断拥塞

只要发送方没在规定的时间内接收到ACK确认报文(发生超时重传),就会认为网络出现了拥塞。

(四) 拥塞控制算法——慢启动

TCP在刚建立完连接后,会经历慢启动,逐步提高发送数据包的数量。规则是:

  • 发送方每收一个ACK,拥塞窗口cwnd的大小就增加1。

所以,这个增长是指数性的

那什么时候是个头呢?——当达到慢启动门限(slow start threshold)后,就会使用拥塞避免算法

(五) 拥塞避免算法

慢启动门限ssthresh一般的大小为65535字节,在进入拥塞避免算法后,窗口增长的规则是:

  • 每当收到一个ACK,cwnd增加1/cwnd。

如此一来,线性增长

在此后一直增长,网络就会进入拥塞的状态,出现丢包和丢包重传,触发了重传,也就进入了拥塞发生算法

(六) 拥塞发生

在上文提到过,重传的机制也有两种:1. 超时重传,2. 快速重传。接下来进行分述:

  • 超时重传的拥塞发生算法

ssthresh设置为cwnd/2,cwnd重置为1,然后重新开始慢启动。不过这种方式会突然减少数据流,可能网络卡顿(就像是急刹车)。

  • 快速重传的拥塞发生算法

在快速重传时,接收方发送三次前一个包的ACK通知发送端重传(大部分没丢,只丢了小部分)。

cwnd=cwnd/2,ssthresh=cwnd,然后进入快速恢复算法

(七) 快速恢复

快速重传一般和快速恢复算法同时使用,这种情况会判断网络情况并不是特别严峻,反映也不会像RTO那样强烈。

快速恢复算法

  • cwnd=ssthresh+3
  • 重传丢失的数据包
  • 如果再收到重复的ACK,cwnd+1
  • 如果收到新ACK(说明D_SACK时的数据全部收到,恢复过程结束),cwnd=ssthresh,恢复到之前二点拥塞避免状态

本文作为笔记,图片来源:

30 张图解: 面试必问的 TCP 重传、滑动窗口、流量控制、拥塞控制_面试回答 tcp流量控制-CSDN博客https://blog.csdn.net/qq_34827674/article/details/105606205文章来源地址https://www.toymoban.com/news/detail-846648.html

到了这里,关于TCP重传机制、滑动窗口、拥塞控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网路原理-传输层UDP,TCP/IP(确认应答,超时重传,连接管理,三次握手,四次挥手,状态转换,流量控制,滑动窗口,拥塞控制,延时应答,捎带应答,异常情况,面向字节流)-网络层(IP协议,地址管理)

    本节重点 • 理解传输层的作⽤,深⼊理解TCP的各项特性和机制 • 对整个TCP/IP协议有系统的理解 • 对TCP/IP协议体系下的其他重要协议和技术有⼀定的了解 我们之前编写完了基本的 java socket ,要知道,我们之前所写的所有代码都在应⽤层,都是为了 完成某项业务,如翻译等。

    2024年04月15日
    浏览(58)
  • TCP的滑动窗口和拥塞控制

    目录 滑动窗口 1.发送窗口和接收窗口 2.滑动窗口的分类 停止等待协议:发送窗口大小 = 1, 接收窗口大小= 1 后退N帧协议(GBN):发送窗口大小 1,接收窗口大小 = 1 选择重传协议(SR) :发送窗口大小 1, 接收窗口大小 1 拥塞控制 慢开始算法和拥塞避免: 快重传和快恢复:

    2024年04月10日
    浏览(38)
  • TCP的滑动窗口与拥塞控制

    客户端每发送的一个包,服务器端都应该有个回复,如果服务器端超过一定的时间没有回复,客户端就会重新发送这个包,直到有回复。 为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。为了保证不丢包,对于发

    2024年02月07日
    浏览(40)
  • TCP滑动窗口、流量控制及拥塞控制详解

    TCP虽然是面向字节流的,但是TCP传输的单元确实报文段。一个TCP报文段分为首部和数据部分。TCP首部前20个字节是固定的,后面有4N个字节是可选的。因此,TCP首部最小字节数是20个字节。 下面我们看下一TCP首部中几个重要的字段: 源端口 和 目的端口 各占两个字节 序号 ,占

    2024年02月02日
    浏览(38)
  • 【网络】传输层——TCP(滑动窗口&&流量控制&&拥塞控制&&延迟应答&&捎带应答)

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 上篇文章对TCP可靠性机制讲解了一部分,这篇文章接着继续讲解。 在上篇文章中,本喵讲解了TCP的确认应答机制: 如上图所示,主机A每发送一个数据段,主机B都要给一个 ACK 确认应答,

    2024年02月12日
    浏览(56)
  • 拥塞控制(TCP限制窗口大小的机制)

            拥塞控制机制可以使滑动窗口在保证可靠性的前提下,提高传输效率         关于滑动窗口的属性以及部分机制推荐看TCP中窗口和滑动窗口的含义以及流量控制         看了上面推荐的博客我们已经知道了,由于接收方接收数据的能力有限,所以要通过流量控制的

    2024年02月11日
    浏览(48)
  • TCP/IP网络参考模型(端口号、TCP滑动窗口、TCP拥塞控制、IP协议号、以太网帧)

    目录 TCP/IP四/五层模型 应用层常见协议——传输数据PDU 传输层协议——传输数据段 端口号 TCP面向连接服务CONS  TCP报文格式 TCP数据传输——ACK确认机制 TCP会话建立——三次握手 TCP会话结束——四次握手 TCP流量控制——滑动窗口协议 TCP可靠传输机制 TCP拥塞控制 UDP无面向连

    2024年02月03日
    浏览(60)
  • TCP之超时重传、流量控制和拥塞控制

    TCP超时重传是TCP协议中的一种机制,用于在发生丢包或数据包未及时确认的情况下,重新发送未确认的数据段。 当发送方发送一个数据段后,会启动一个定时器(称为超时计时器),等待接收方的确认。如果在超时时间内未收到确认,发送方就会认为该数据段已经丢失,并进

    2024年02月10日
    浏览(48)
  • TCP的拥塞控制算法:慢启动、拥塞避免、快重传、快恢复

    一、前言:什么是拥塞?什么是拥塞控制? 拥塞 :随着网络中的主机增加其发送速率并使网络变得十分拥挤,此时会经常发生丢包现象,导致网络的传输效率急剧降低。 分组的超时重传通常被作为网络拥塞的标志 。 如果不对网络拥塞进行控制,整个网络的吞吐量将随着输

    2024年02月02日
    浏览(42)
  • TCP协议之滑动窗口和拥塞窗口

    如果发送一个新的包,需要等待上一个包的 ACK 回来之后才能发送,这样效率显然是很低的。也就是每经过一个 RTT(RTT指的是一个数据包从发送到接收到ACK确认包的花费时间,RTT是会随着网络的变化而变化) 的时间,我们只能发送一个包,假设一个 RTT 是 100ms,那在一秒中我

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包