首页 > 其他分享 >窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理

时间:2023-08-25 11:01:11浏览次数:54  
标签:窗口 重传 IP 网络 TCP 发送 拥塞 滑动

本文分享自华为云社区《窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理》,作者: Lion Long。

当涉及网络性能优化和数据传输可靠性时,TCP/IP滑动窗口是一个关键的技术。本文将深入揭示TCP/IP滑动窗口的工作原理,探讨其在确保数据准确性和实现高效通信方面的重要性。通过对滑动窗口大小、流控制和数据包确认机制的解析,我们将揭示如何通过优化窗口大小和流控制参数来提升网络性能。

一、TCP报头

0              |1              |2              |3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-------------------------------+-------------------------------+
|		Source Port	|	Destination Port	|
+---------------------------------------------------------------+
|			Sequence Number				|
+---------------------------------------------------------------+
|			Acknowledgment Number			|
+-------+-----------+-+-+-+-+-+-+-------------------------------+
| Header|   Reserve |U|A|P|R|S|F|				|
| Length|           |R|C|S|S|Y|I|		Window	size	|
|       |           |G|K|H|T|N|N|				|
+-------------------------------+-------------------------------+
|		Checksum    	|		Urgent Pointer 	|
+---------------------------------------------------------------+
|				Option				|
+---------------------------------------------------------------+
|				Data				|
|				...				|
+---------------------------------------------------------------+

二、TCP流量控制

一般来说,我们希望数据传输得更快;但如果发送方发送数据过快,接收方还没来得急接收数据,就会造成丢包现象。

流量控制就是让发送方控制发送速率,让接收方能及时接收数据。TCP利用滑动窗口机制实现发送方的流量控制。

网络上进行数据传输的时候,需要考虑如何达到高效的收发数据。那么就需要考虑接收方可以接收多少网络包和网络上可以发送多少网络包的问题。

接收方通过发送数据出去的时候,同时告诉发送方我还能接收多少数据包。

要知道网络上数据传输的状态,可以通过计算往返时间。

2.1、持续计时器

TCP为每一个连接设有一个持续计时器。只有TCP的一方收到对方的零窗口通知,就启动持续计时器;只要持续计时器超时,就放送一个零窗口探测报文,携带一字节的数据;而对方收到零窗口探测报文时,回复自己现有的接收窗口值。如果窗口大小依旧是零,那么收到报文的一方就重新启动持续计时器。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_数据传输

零窗口探测报文丢失是不是无法打破死锁?零窗口探测报文发送的时候也会启动重传计时器,不必担心零窗口探测报文丢失会无法打破死锁局面。

持续计时器是为了解决双方相互等待(A等待B发送非零窗口的通知,B等待A发送数据)而形成的死锁现象。这种现象一般发生在发送窗口大小数据包丢失时。

2.2、RTT

RTT,全称Round Trip Time,即往返时间。由链路传播时间、末端系统处理时间、路由器缓存中排队和处理的时间组成。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_TCP/IP_02

Round Trip Time

对于TCP来说,路由器缓存中排队和处理的时间会随着网络拥塞程度辩护而变化。通过计算RTT可以反应网络拥塞程度,从而拥塞控制。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_数据传输_03

RTT

RTT的计算公式:new_RTT = percent*pre_RTT+(1-percent)*RTT;

其中percent取值范围0.8~0.9 ;pre_RTT是上一次的RTT,RTT是本次RTT。计算出来new_RTT,如果RTT大于new_RTT,那么就超时。

2.3、RTO

RTO,全称Retransmission TimeOut,即重传超时时间。

超时之后TCP进入Loss状态,重传所有没有被确认的报文,同时进入慢启动的回复过程。

2.4、拥塞的定义

随着网络上的主机不断增加其发送速率,会使整个网络变得非常拥挤;这会导致网络经常出现丢包现象,使网络传输效率大幅度下降。

如果不对网络做拥塞控制,会降低整个网络的传输效率,直到吞吐量为0,进入死锁。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_TCP_04

拥塞

2.5、慢启动和拥塞控制

(1)一条TCP连接开始时,window size被设置为1 MSS(最大报文段大小)。

(2)TCP发送方发送完发送窗口数据,并收到所有的确认,window size以指数增长(以2的倍数进行翻倍),即慢启动阶段。

(3)window size增长到一个慢启动的阈值thresh,开始执行拥塞控制算法(window size呈线性增长),进入拥塞控制阶段。

(4)随着window size增长,发送速率提高,出现网络拥塞,分组超时重传。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_数据传输_05

慢启动

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_TCP/IP_06

拥塞控制

慢启动是指一开始向网络中发送的报文段少,而不是指拥塞窗口增长速度慢。

拥塞避免不是指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为线性规律增长,使网络比较不容易出现拥塞。

2.6、快重传和快恢复

1990增加新的拥塞控制算法:快重传和快恢复。用于改进TCP的性能。

有时候,个别报文会在网络中丢失,当实际上网络并没有发生拥塞,这将导致发送方超时重传并认为网络出现了拥塞;从而错误的启动慢启动算法,因此降低传输效率。为此,引入快重传算法,可以让发送方尽早知道个别报文段的丢失。

所谓快重传,就是发送方尽快的进行重传,而不是等超时计时器超时才重传。快重传可以使整个网络吞吐量提高约20%。

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理_数据传输_07

发送方接收到3个重复确认,就知道只丢失了个别报文段,于是不启动慢启动算法,而是执行快恢复算法。

所谓快恢复,就是发送方将慢启动上限和拥塞窗口值调整为当前窗口的一半,开始执行拥塞避免算法。

三、滑动窗口

TCP基于以字节为单位的滑动窗口来实现可靠传输。

滑动窗口需要考虑网络上能发多少以及接收方能接收多少;即窗口大小=min{接收方窗口,网络上可发送数据包大小};

两个指针,前指针指示已接收或已发送并确认的字节序,后指针指示不允许接收/发送的开始位置,两个指针之间就是可收发数据的窗口大小。

|<---------- window size ---------->|
+--------------+-----------------------------------+-------------+
|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21  |
+--------------+--------------------+--------------+-------------+
|已发送并确认  P1   已发送未确认    P2	 未发送	   P3   不可接收 |
+----------------------------------------------------------------+

窗口大小是动态的,可以通过RTT计算。比如发4K到网络,出现拥塞,那么就将窗口逐渐减小。RTT防抖,可以推算窗口大小。

四、思考

(1)接收方不recv,发送方一直send,send的数据去哪里了??

这种情况接收方的缓冲区逐渐饱和,达到饱和时滑动窗口为0,此时发送方还在send,那么数据就会滞留在发送方的缓冲区,发送方缓冲区也会逐渐饱和,当发送方缓冲区无法再写入数据时,send返回-1,告诉应用程序IO不可写。

(2)tcp如何保证顺序?

不能保证接收序号是顺序的,只能保证应用程序取的时候是顺序的。适当延迟回复ACK可以提高TCP的传输效率,一般最多延迟0.5秒,否则可能会使重传计时器超时出现重传。

总结

  1. TCP通过以字节为单位的滑动窗口实现可靠传输。
  2. TCP进行流量控制时使用四个算法:慢启动、拥塞避免、快重传、快恢复。
  3. 滑动窗口是动态的,它的大小取接收端可接受窗口大小和网络可发送大小的最小值。比如一条公共路段和接收方的仓库,发送的货物多少取决于公路和仓库的最小值;公路很大但仓库很小,公路上运输再多的货物而仓库无法装载得下;仓库很大但公路较小,仓库就算能装再多的货物而公路只能运输少量的货物。
  4. 滑动窗口为0时,会开启持续计时器,用于探测接收方是否有空间接收数据,防止进入无休止的等待,即死锁。
  5. 详细的计算机网络知识,可以参看湖科大计算机网络视频。

   点击关注,第一时间了解华为云新鲜技术~

标签:窗口,重传,IP,网络,TCP,发送,拥塞,滑动
From: https://blog.51cto.com/u_15214399/7227596

相关文章

  • 窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理
    本文分享自华为云社区《窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理》,作者:LionLong。当涉及网络性能优化和数据传输可靠性时,TCP/IP滑动窗口是一个关键的技术。本文的摘要将深入揭示TCP/IP滑动窗口的工作原理,探讨其在确保数据准确性和实现高效通信方面的重要性。通过对滑动窗......
  • TCP/IP网络模型
    为什么要有TCP/IP网络模型?为了兼容多种多样的设备,需要协商出通用的网络协议。一、应用层专注于为用户提供应用功能,比如HTTP、FTP、Telnet、DNS、SMTP等。应用层工作在操作系统的用户态,传输层及以下则工作在内核态。二、传输层应用层的数据包会传给传输层,传输层为应用层提供......
  • 【校招VIP】java语言考点之双亲委派模型
    考点介绍:双亲委派是校招面试中的高频考点之一。双亲委派机制定义:当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候,才会由当前这个加载器来负责类的加载......一、考点题目1、为什......
  • 【校招VIP】专业课考点之死锁检测与恢复
    考点介绍:根据不少同学的面试反馈,最近阿里和字节跳动面试时面试官都问到了死锁问题。如字节跳动考察的问题是:什么是线程死锁?死锁如何产生?死锁如何检测与恢复?其产生的原理与对应的解决方案都是重点考察对象。一、考点试题1.死锁如何检测与解除?解答:死锁检测需要一种数据结构,保......
  • 华为数通方向HCIP-DataCom H12-821题库(单选题:261-280)
    第261题以下关于IPv6过渡技术的描述,正确的是哪些项?A、转换技术的原理是将IPv6的头部改写成IPv4的头部,或者将IPv4的头部改写成IPv6的头部B、使用隧道技术,能够将IPv4封装在IPv6隧道中实现互通,但是隧道的端点需要支持双栈技术C、转换技术适用于纯IPv4网络与纯IPv6网络之间的通信,方......
  • 抽取数据出现ODBC data source<IP>error message for operation <SQLGetData>: <[Micr
    一、问题描述抽取数据时出现ODBCdatasource<IP>errormessageforoperation<SQLGetData>:<[Microsoft][SQLServerNativeClient10.0]InvalidDescriptorIndex>,发现查询源数据库是正常的,查询网上说是要按数据库表字段的顺序抽取数据,仔细对比之后发现原来的表和现在的表字......
  • SAP GUI Scripting VBA Code Snippet to Detect all IDs of the UI Elements
    '-Begin-----------------------------------------------------------------OptionExplicitDimgColl()AsStringDimjAsIntegerSubGetAll(ObjAsObject)'---------------------------------------------'-'-Recursivelycalledsubro......
  • 【校招VIP】前端校招考点之页面转换算法
    考点介绍:在地址映射过程中,若在页面中发现所要访问的页面不在内存中,则产生缺页中断。当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。一、考点题目1......
  • centos系统firewalld&iptables常用命令
    firewalld添加规则:firewall-cmd--permanent--add-rich-rule="rulefamily="ipv4"sourceaddress="192.168.142.166"portprotocol="tcp"port="5432"accept" 允许192.168.142.166访问5432端口firewall-cmd--add-port=80/t......
  • [C#] 使用HslCommunication访问乐创寄存器#MULTIPROG EXPRESS
    使用MULTIPROGEXPRESS软件打开乐创工程后,在变量声明中可看到变量及其分配的Modbus地址 乐创寄存器   施耐德寄存器   %IX100.0 输入寄存器,地址100,bit0BOOL类型长度为Bit1  MW100 保持寄存器,地址100  %ID100 输入寄存器,地址100  MX100......