首页 > 其他分享 >TCP的滑动窗口与拥塞控制

TCP的滑动窗口与拥塞控制

时间:2023-09-15 21:36:14浏览次数:110  
标签:重传 确认 TCP 发送 拥塞 滑动 超时 cwnd

客户端每发送的一个包,服务器端都应该有个回复,如果服务器端超过一定的时间没有回复,客户端就会重新发送这个包,直到有回复。

为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。为了保证不丢包,对于发送的包都要进行应答,但是这个应答也不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式称为累计确认或者累计应答(cumulative acknowledgment)。

为了记录所有发送的包和接收的包,TCP 也需要发送端和接收端分别都有缓存来保存这些记录。发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分。

1、发送了并且已经确认的。这部分就是你交代下属的,并且也做完了的,应该划掉的。

2、发送了并且尚未确认的。这部分是你交代下属的,但是还没做完的,需要等待做完的回复之后,才能划掉。

3、没有发送,但是已经等待发送的。这部分是你还没有交代给下属,但是马上就要交代的。

4、没有发送,并且暂时还不会发送的。这部分是你还没有交代给下属,而且暂时还不会交代给下属的。

在 TCP 里,接收端会给发送端报一个窗口的大小,叫 Advertised window。这个窗口的大小应该等于上面的第二部分加上第三部分,就是已经交代了没做完的加上马上要交代的。超过这个窗口的,接收端做不过来,就不能发送了。

TCP的滑动窗口与拥塞控制_拥塞控制

对于接收端来讲,它的缓存里记录的内容要简单一些。

1、接受并且确认过的。也就是我领导交代给我,并且我做完的。

2、还没接收,但是马上就能接收的。也即是我自己的能够接受的最大工作量。

3、还没接收,也没法接收的。也即超过工作量的部分,实在做不完。

TCP的滑动窗口与拥塞控制_拥塞控制_02

AdvertisedWindow=MaxRcvBuffer-((NextByteExpected-1)-LastByteRead)。

一种方法就是超时重试,也即对每一个发送了,但是没有 ACK 的包,都有设一个定时器,超过了一定的时间,就重新尝试。但是这个超时的时间如何评估呢?这个时间不宜过短,时间必须大于往返时间 RTT,否则会引起不必要的重传。也不宜过长,这样超时时间变长,访问就变慢了。

估计往返时间,需要 TCP 通过采样 RTT 的时间,然后进行加权平均,算出一个值,而且这个值还是要不断变化的,因为网络状况不断地变化。除了采样 RTT,还要采样 RTT 的波动范围,计算出一个估计的超时时间。由于重传时间是不断变化的,我们称为自适应重传算法(Adaptive Retransmission Algorithm)。

TCP 的策略是超时间隔加倍。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。

有一个可以快速重传的机制,当接收方收到一个序号大于下一个所期望的报文段时,就会检测到数据流中的一个间隔,于是它就会发送冗余的 ACK,仍然 ACK 的是期望接收的报文段。而当客户端收到三个冗余的 ACK 后,就会在定时器过期之前,重传丢失的报文段。

LastByteSent - LastByteAcked <= min {cwnd, rwnd} ,是拥塞窗口和滑动窗口共同控制发送的速度。

对于到网络上,通道的容量 = 带宽 × 往返延迟。

一条 TCP 连接开始,cwnd 设置为一个报文段,一次只能发送一个;当收到这一个确认的时候,cwnd 加一,于是一次能够发送两个;当这两个的确认到来的时候,每个确认 cwnd 加一,两个确认 cwnd 加二,于是一次能够发送四个;当这四个的确认到来的时候,每个确认 cwnd 加一,四个确认 cwnd 加四,于是一次能够发送八个。可以看出这是指数性的增长。

涨到什么时候是个头呢?有一个值 ssthresh 为 65535 个字节,当超过这个值的时候,就要小心一点了,不能倒这么快了,可能快满了,再慢下来。

每收到一个确认后,cwnd 增加 1/cwnd,我们接着上面的过程来,一次发送八个,当八个确认到来的时候,每个确认增加 1/8,八个确认一共 cwnd 增加 1,于是一次能够发送九个,变成了线性增长。

拥塞的一种表现形式是丢包,需要超时重传,这个时候,将 sshresh 设为 cwnd/2,将 cwnd 设为 1,重新开始慢启动。这真是一旦超时重传,马上回到解放前。但是这种方式太激进了,将一个高速的传输速度一下子停了下来,会造成网络卡顿。

快速重传算法。当接收端发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,cwnd 减半为 cwnd/2,然后 sshthresh = cwnd,当三个包返回的时候,cwnd = sshthresh + 3,也就是没有一夜回到解放前,而是还在比较高的值,呈线性增长。

TCP的滑动窗口与拥塞控制_滑动窗口_03

TCP 的拥塞控制主要来避免的两个现象都是有问题的。

第一个问题是丢包并不代表着通道满了,也可能是管子本来就漏水。例如公网上带宽不满也会丢包,这个时候就认为拥塞了,退缩了,其实是不对的。

第二个问题是 TCP 的拥塞控制要等到将中间设备都填充满了,才发生丢包,从而降低速度,这时候已经晚了。其实 TCP 只要填满管道就可以了,不应该接着填,直到连缓存也填满。

 TCP BBR 拥塞算法。它企图找到一个平衡点,就是通过不断地加快发送速度,将管道填满,但是不要填满中间设备的缓存,因为这样时延会增加,在这个平衡点可以很好的达到高带宽和低时延的平衡。

TCP的滑动窗口与拥塞控制_滑动窗口_04

标签:重传,确认,TCP,发送,拥塞,滑动,超时,cwnd
From: https://blog.51cto.com/key3feng/7486723

相关文章

  • WebRTC C++ RTP over TCP配置
    前言RTPoverTCP这种情况,一般是WebRTCP2P打洞失败,才会选择WebRTC默认使用UDP传输,但是也可以通过TCP传输。使用TCP传输,需要服务器中转,turnserver,licode,janus之类的服务器解决方案搭建coTurn中转服务器https://blog.51cto.com/fengyuzaitu/7265986C++修改代码url后面必须指定?t......
  • 滑动窗口框架:来自 labuladong
    /*滑动窗口算法框架*/voidslidingWindow(strings,stringt){unordered_map<char,int>need,window;for(charc:t)need[c]++;intleft=0,right=0;intvalid=0;while(right<s.size()){//c是将移入窗口的字符......
  • Xilinx平台以太网接口(一)TCP-IP基础
    汇总篇:XilinxFPGA平台以太网接口(汇总篇)_xilinxethernet_子墨祭的博客-CSDN博客 本系列文章基于xilinx三速以太网IP进行学习介绍。在完成以太网通信实验之前,必须要对以太网基础知识进行了解。时间充裕的可以看看《图解TCP/IP》作为扫盲。本文重点对以太网帧结构进行介绍。......
  • 计算机网络HTTP与TCP常见知识点思维导图
    本篇思维导图主要介绍了HTTP与TCP常见知识点,广度与深度兼具,希望对大家有帮助,需要xmind格式联系我,转发请备注来源,谢谢! ......
  • tcp三次握手
    tcpdump-ieth1port80使用tcpdump一定要用-i参数指定下监听哪个网卡,可以使用ifconfig查看当前ip的网卡,有的是eth0,有的是eth1,这样可以抓取到这个网卡上的数据.还要过滤一下端口号,一般就只看80端口的数据就可以了TCP三次握手的过程,可以在下面的请求中看得到.第一次握手:10......
  • selenium左右页面右侧滑动
    正常网页的情况翻页滑动或者滑动到底部,都是定位标签,对于网页分左右测,不含框架,可以定位div标签,如果真找不到可以换个浏览器也许会有特殊的发现。          ......
  • 《从实践中学习TCP/IP协议》笔记
    2.2网络体系802.3以太网802.11无线网络802.16WiMAX2.4以太网以太网采用附加冲突检测的载波侦听多路访问(CSMA/CD)机制,以太网中所有节点都可以看到在网络中发送的所有信息,以太网是一种广播网络以太网帧结构,由前同步码+帧开始定界符+以太网报头(目的地址+源地址+类型假定IP)+......
  • 关于TCP 和 UDP 的 Socket 调用
    在网络层,Socket函数需要指定到底是IPv4还是IPv6,分别对应设置为AF_INET和AF_INET6。另外,还要指定到底是TCP还是UDP。TCP协议是基于数据流的,所以设置为SOCK_STREAM,而UDP是基于数据报的,因而设置为SOCK_DGRAM。TCP的服务端要先监听一个端口,一般是先调用bind函数,给这......
  • 使用 tcpkill 杀掉 tcp 连接
    安装:aptinstalldsniff-yyuminstalldsniff-y操作命令:tcpkill-ieth0-9port1234tcpkilliphost10.168.1.1tcpkill-9port1234查看连接: ss-ant......
  • TCP编程
    网络相关概念网络通信概念:两台设备之间通过网络实现数据传输。网络通信:将数据通过网络从一台设备传输到另一台设备中。java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信。网络概念:两台或多台设备通过一定物理设备连接起来构成了网络。根据网络的覆盖范围不同,对网络进行......