TCP滑动窗口、流量控制及拥塞控制详解

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

一、TCP滑动窗口

TCP滑动窗口、流量控制及拥塞控制详解TCP虽然是面向字节流的,但是TCP传输的单元确实报文段。一个TCP报文段分为首部和数据部分。TCP首部前20个字节是固定的,后面有4N个字节是可选的。因此,TCP首部最小字节数是20个字节。

下面我们看下一TCP首部中几个重要的字段:

  1. 源端口目的端口 各占两个字节
  2. 序号,占4个字节。序号范围是[0,2^32-1],可以对4GB数据进行编号,到达最大值后,序号会重新从0开始。该序号指的是本报文段所发送数据的第一个字节的序号。
  3. 确认号,占4个字节。期望收到对方数据报的第一个数据字节的序号。举例:假设B收到了A的一个报文,其序列号字段是301,数据长度是200字节,这表示B正确的收到了A发送的500序号为止的所有数据。因此,B期望收到的下一个数据的序号是501,于是B把在回复A的确认报文中的确认字段设置为501。
  4. 确认ACK。当ACK字段为1时,确认号字段才有效。TCP规定,在连接建立后,传输的所有报文段的ACK都必须置1。
  5. 同步SYN。在连接建立时用来同步序列,也就是三次握手的时候会用到。SYN=1,ACK=0,表示这是一个连接请求报文。若对方同一连接,则回复SYN=1,ACK=1。
  6. 终止FIN。当FIN=1时,表示发送方数据已发送完毕,要求释放连接(四次挥手)。
  7. 窗口,表示自己的接收窗口的大小。占两个字节,最大[0,2^32-1],也就是64K。
  8. 选项。长度可变,最大40个字节。当没有使用选项是TCP,首部20占个字节。
1.1 什么是MSS?为什么要有MSS?

最大报文长度MSS(Maxium Segment Size),是每一个TCP报文段中数据字段的最大长度。而一个完整的 TCP报文段 = 数据字段 + 首部长度

为什么要有MSS?因为TCP数据至少要添加20个字节的TCP首部和20个字节的IP首部,才能发送。所以,当发送的数据量少,如一个字节。那么网络的利用率就极低。如果数据太大,会在IP层进行分片。到接收端后还要重组。如果不幸,有数据丢失或者出错,还需要重新发送,导致开销增大。

1.2 随着因特网的发展,又陆续增加了几个选项

窗口扩大选项:互联网早期,窗口大小两个字节,最大64K够用。为了满足发展需要,新增窗口扩大选项,占3个字节。其中有一个字节表示表示移位值S。新的窗口大小位数从16位增加到(16+S),S最大14,故窗口最大值增加到[0,2^30-1].

时间戳选项:占10个字节。其中主要时间戳字段时间戳回送回答字段各占4字节。作用:(1)计算RTT;(2)用于处理序号超过2^32的情况。

选择确认选项:适用于,收到的报文段无差错,只是未按序号,中间还缺少某些序号的数据。选择确认就可以只让发送方发送这些缺少的数据,后面还会详细介绍。

二、TCP滑动窗口

Tcp的滑动窗口是以字节为单位的。

2.1 滑动窗口收发数据流程举例

现在假设发送方A收到了接收方B的确认报文,其中确认字段是31(表示31之前的数据都已收到,需要A从31开始发数据),窗口大小是20。A会根据这两个数据构造出自己的发送窗口,如下:
TCP滑动窗口、流量控制及拥塞控制详解

发送窗口:在没有收到B的确认情况下,A可以连续把窗口内的数据都发出去。发送窗口内的序号都是允许发送的序号。

现假设A又发送了31~41的数据,如下图:
TCP滑动窗口、流量控制及拥塞控制详解B此时的接受窗口如下:
TCP滑动窗口、流量控制及拥塞控制详解此时,B虽然收到了32、33的分组,但是没有按序接收,所以B给出的确认只能还是31。

再假设,B按序接收到了31、32、33。B把接收窗口往后往前移动3个序号,同时给A发出确认报文,窗口值仍为20,但是确认号为34。A在收到确认报文后,将自己的发送窗口也往前移动3个序号,注意,B还收到了37 38 40三个分组的数据,但是没有按照顺序,所以先暂存在自己的接收窗口。 如下:
TCP滑动窗口、流量控制及拥塞控制详解

2.2 选择确认SACK原理

假设接收方收到若干不连续的报文段。序号1~ 1000收到了,但1000 ~ 1500没收到。序号1501~ 3000收到了,但30001~ 3500没收到。序号3501~4500又收到了。如果这些序号都在接受窗口内,接受方先收下这些数据,并把这些消息告诉发送方,让发送方不在发送重复数据。
TCP滑动窗口、流量控制及拥塞控制详解我们可以看到,每个字节块都有左右两个边界,我们只需要告诉发送方这些边界信息,让其从指定序号开始传就达到我们的预期了。

但是,TCP首部没有哪个字段是来描述这些信息的。选择确认选项就派上用场了。如果要使用选择确认,就需要在TCP首部加上允许SACK选项。由于首部选项的长度只有40个字节,每个边界需要4个字节,所以,最多只能传递8个边界。为什么不是5个字节块(10个边界信息)呢?因为这40个字节,还要分出来两个字节,一个用来开启SACK;一个字节用来指出SACK选项占几个字节。

三、TCP流量控制

所谓流量控制就是控制发送方的发送速率,不要太快,让接收方来得及接收处理。利用滑动窗口就可以很方便的在TCP连接上实现对发送方的流量控制。
TCP滑动窗口、流量控制及拥塞控制详解

  • 接收方每次收到数据后,在发送确认的报文的时候,同时告诉发送方自己的接收窗口的大小;
  • 发送方收到确认报文之后,就会调整自己的发送速率,也就是自己的发送窗口大小。当发送方收到win=0时,就会停止发送数据,同时开启一个定时器,每隔一段时间发送探测报文询问接收方是否有空间接受数据,如果收到win>0就发送数据;如果win=0,您先忙,我待会再来问问…

四、拥塞控制

拥塞控制就是防止过多的数据注入网络,导致网络过载。注意与流量控制的区别,流量控制一般是点对点的控制。而拥塞控制是一个全局性的过程,涉及所有的主机和路由器等待。

拥塞控制方法:

4.1 慢开始、拥塞避免

发送方维持一个拥塞窗口cwnd(congestion window)的状态变量。取决于网络拥塞程度,动态变化。发送发控制cwnd的原则:只要网络没出现拥塞就增大cwnd,出现了就减小。

4.1.1 发送方如何判断网络拥塞

当网络出现拥塞时,路由器就要丢弃分组。因此,如果发送方没有按时收到应该到达的确认报文,就认为网络出现拥塞。

4.1.2 算法原理

为方便描述,我们用报文个数作为窗口大小的单位,实际上单位是字节。慢开始的思路就是,刚开始将cwnd设置为一个MSS的数值,每经过一个传输轮次cwnd就加倍。

传输轮次:拥塞窗口所允许的发送的报文都连续发出去,且收到了对已发送的最后一个字节的确认。

因为是加倍(指数)增长,为了防止增长过度引起网络阻塞,还设置一个慢开始门限ssthresh。当cwnd超过ssthresh时,就改为拥塞避免算法,也就是线性缓慢增长。

无论是在慢开始还是拥塞避免阶段,只要发送方判断网络出现拥塞,就会把ssthresh设置为拥塞时发送窗口的一半,cwnd设置为1,重新执行慢开始算法。
TCP滑动窗口、流量控制及拥塞控制详解

4.2 快重传和快恢复

快重传算法要求接收方每收到一个失序的报文段,就立即发出重复确认,目的是使发送方及早知道有报文段丢失。如果发送方连续手动三次重复的确认就立即重传对方未收到的报文。

TCP滑动窗口、流量控制及拥塞控制详解因为可以收到连续三个重复报文的确认,发送方不认为是网络出现了拥塞。使用快恢复算法。快恢复思路是:把cwnd设置为ssthresh的一半,然后开始拥塞避免算法。

TCP滑动窗口、流量控制及拥塞控制详解在采用快重传算法时,慢开始算法只在TCP建立连接和网络出现超时的时候使用。

上面的描述都是假定接收方总是有足够的空间接受数据。实际上接收方的空间也是有限的,接收方根据自己的接受能力设置接受窗口rwnd。因此:

发送方窗口 = MIN[rwnd, cwnd]

文章参考于<零声教育>的C/C++linux服务期高级架构文章来源地址https://www.toymoban.com/news/detail-432420.html

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

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

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

相关文章

  • 【计算机网络】深入理解TCP协议二(连接管理机制、WAIT_TIME、滑动窗口、流量控制、拥塞控制)

    正常情况下,TCP需要经过三次握手建立连接+四次挥手断开链接,下面看一个图: 服务器的状态变化: [CLOSED - LISTEN] 服务器端调用listen后进入LISTEN状态, 等待客户端连接; [LISTEN - SYN_RCVD] 一旦监听到连接请求(同步报文段), 就将该连接放入内核等待队列中, 并向客户端发送SYN确认

    2024年02月07日
    浏览(57)
  • TCP的滑动窗口与拥塞控制

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

    2024年02月07日
    浏览(39)
  • TCP的滑动窗口和拥塞控制

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

    2024年04月10日
    浏览(36)
  • TCP重传机制、滑动窗口、拥塞控制

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

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

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

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

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

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

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

    2024年02月05日
    浏览(35)
  • TCP流量控制+拥塞控制

    目标:流量控制主要解决的是发送方和接收方之间处理能力的不匹配问题。它的目的是确保发送方不会发送数据过快,以至于接收方无法及时接收并处理这些数据,从而避免数据包在网络中堆积和丢失。 实现方式:在TCP协议中,流量控制主要通过使用滑动窗口机制来实现。接

    2024年02月20日
    浏览(37)
  • TCP流量控制和拥塞控制

    当发送方发送速率大于接收方的处理速率时,接收方会把数据包放入缓冲区,当缓冲区满了,就只能将数据包丢弃。为了应对这种情况,流量控制就可以大展身手了 流量控制的作用对象是发送方和接收方 当接收方网络拥塞,未能及时ACK时,导致发送方超时重传大量数据,使

    2024年02月05日
    浏览(51)
  • TCP流量控制与拥塞控制(重要)

     本文参考了一些优秀的书籍-图解TCP/IP,TCP协议卷一,小林coding,还有等等的知乎,百度.   小林coding  小林coding 知乎牛客的文章 : 万字长文 | 23 个问题 TCP 疑难杂症全解析_技术交流_牛客网 本文主要讲解TCP可靠性的机制: 流量控制与拥塞控制 尤其拥塞控制的算法是大公司非常愿

    2023年04月08日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包