【TCP】 tcp四次挥手状态 TIME_WAIT

【TCP】 tcp四次挥手状态 TIME_WAIT,第1张

首先,我们需要明确, 只有主动断开的那一方才会进入 TIME_WAIT 状态 ,且会在那个状态持续 2 个 MSL(Max Segment Lifetime)。

为了讲清楚 TIME_WAIT,需要先介绍一下 MSL 的概念。

MSL(报文最大生存时间)是 TCP 报文在网络中的最大生存时间。这个值与 IP 报文头的 TTL 字段有密切的关系。

IP 报文头中有一个 8 位的存活时间字段(Time to live, TTL)如下图。 这个存活时间存储的不是具体的时间,而是一个 IP 报文最大可经过的路由数,每经过一个路由器,TTL 减 1,当 TTL 减到 0 时这个 IP 报文会被丢弃。

TTL 经过路由器不断减小的过程如下图所示,假设初始的 TTL 为 12,经过下一个路由器 R1 以后 TTL 变为 11,后面每经过一个路由器以后 TTL 减 1

从上面可以看到 TTL 说的是「跳数」限制而不是「时间」限制,尽管如此我们依然假设 最大跳数的报文在网络中存活的时间不可能超过 MSL 秒 。

Linux 的套接字实现假设 MSL 为 30 秒,因此在 Linux 机器上 TIME_WAIT 状态将持续 60秒。

要构造一个 TIME_WAIT 非常简单,只需要建立一个 TCP 连接,然后断开某一方连接,主动断开的那一方就会进入 TIME_WAIT 状态,我们用 Linux 上开箱即用的 nc 命令来构造一个。

过程如下图:

在机器 c2 上用nc -l 8888启动一个 TCP 服务器

在机器 c1 上用 nc c2 8888 创建一条 TCP 连接

在机器 c1 上用 Ctrl+C 停止 nc 命令,随后在用netstat -atnp | grep 8888查看连接状态。

第一个原因是:数据报文可能在发送途中延迟但最终会到达,因此要等老的“迷路”的重复报文段在网络中过期失效,这样可以避免用相同源端口和目标端口创建新连接时收到旧连接姗姗来迟的数据包,造成数据错乱。

比如下面的例子

假设客户端 10211552 的 61594 端口与服务端 102115510 的 8080 端口一开始建立了一个 TCP 连接。

假如客户端发送完 FIN 包以后不等待直接进入 CLOSED 状态,老连接 SEQ=3 的包因为网络的延迟。过了一段时间 相同 的 IP 和端口号又新建了另一条连接,这样 TCP 连接的四元组就完全一样了。

恰好 SEQ 因为回绕等原因 也正好相同,那么 SEQ=3 的包就无法知道到底是旧连接的包还是新连接的包了,造成新连接数据的混乱。

TIME_WAIT 等待时间是 2 个 MSL,已经足够让一个方向上的包最多存活 MSL 秒就被丢弃,保证了在创建新的 TCP 连接以后,老连接姗姗来迟的包已经在网络中被丢弃消逝,不会干扰新的连接。

第二个原因是确保可靠实现 TCP 全双工终止连接。

关闭连接的四次挥手中,最终的 ACK 由主动关闭方发出,如果这个 ACK 丢失,对端(被动关闭方)将重发 FIN,如果主动关闭方不维持 TIME_WAIT 直接进入 CLOSED 状态,则无法重传 ACK,被动关闭方因此不能及时可靠释放。

如果四次挥手的第 4 步中客户端发送了给服务端的确认 ACK 报文以后不进入 TIME_WAIT 状态,直接进入 CLOSED状态,然后重用端口建立新连接会发生什么呢?

如下图所示

主动关闭方如果马上进入 CLOSED 状态,被动关闭方这个时候还处于LAST-ACK状态,主动关闭方认为连接已经释放,端口可以重用了, 如果使用相同的端口三次握手发送 SYN 包,会被处于 LAST-ACK状态状态的被动关闭方返回一个 RST,三次握手失败。

为什么时间是两个 MSL?

1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端

1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达

2MS = 去向 ACK 消息最大存活时间(MSL) + 来向 FIN 消息的最大存活时间(MSL)

在一个非常繁忙的服务器上,如果有大量 TIME_WAIT 状态的连接会怎么样呢?

连接表无法复用

socket 结构体内存占用

连接表无法复用  因为处于 TIME_WAIT 的连接会存活 2MSL(60s),意味着相同的TCP 连接四元组(源端口、源 ip、目标端口、目标 ip)在一分钟之内都没有办法复用,通俗一点来讲就是“占着茅坑不拉屎”。

假设主动断开的一方是客户端,对于 web 服务器而言,目标地址、目标端口都是固定值(比如本机 ip + 80 端口),客户端的 IP 也是固定的,那么能变化的就只有端口了,在一台 Linux 机器上,端口最多是 65535 个( 2 个字节)。

如果客户端与服务器通信全部使用短连接,不停的创建连接,接着关闭连接,客户端机器会造成大量的 TCP 连接进入 TIME_WAIT 状态。

可以来写一个简单的 shell 脚本来测试一下,使用 nc 命令连接 redis 发送 ping 命令以后断开连接。

如果在 60s 内有超过 65535 次 redis 短连接 *** 作,就会出现端口不够用的情况,这也是使用 连接池 的一个重要原因。

针对 TIME_WAIT 持续时间过长的问题,Linux 新增了几个相关的选项,netipv4tcp_tw_reuse 和 netipv4tcp_tw_recycle。

下面我们来说明一下这两个参数的用意。 这两个参数都依赖于 TCP 头部的扩展选项:timestamp

TCP 头部时间戳选项(TCP Timestamps Option,TSopt)

除了我们之前介绍的 MSS、Window Scale 还有以一个非常重要的选项:时间戳(TCP Timestamps Option,TSopt)

它由四部分构成:类别(kind)、长度(Length)、发送方时间戳(TS value)、回显时间戳(TS Echo Reply)。

时间戳选项类别(kind)的值等于 8,用来与其它类型的选项区分。长度(length)等于 10。两个时间戳相关的选项都是 4 字节。

如下图所示:

是否使用时间戳选项是在三次握手里面的 SYN 报文里面确定的。

下面的包是 curl githubcom 抓包得到的结果:

发送方发送数据时,将一个发送时间戳 1734581141 放在发送方时间戳 TSval 中

接收方收到数据包以后,将收到的时间戳 1734581141 原封不动的返回给发送方,放在 TSecr 字段中,同时把自己的时间戳 3303928779 放在 TSval 中

后面的包以此类推

有几个需要说明的点:

1 时间戳是一个单调递增的值,与我们所知的 epoch 时间戳不是一回事。 这个选项不要求两台主机进行时钟同步

2 timestamps 是一个双向的选项,如果只要有一方不开启,双方都将停用 timestamps。

比如下面是curl >>

 通常会采用修改注册表的方式改进Windows的系统参数。下面将为大家介绍Windows系统下的TCP参数优化方式,适用于Windows 2003、Windows XP、Windows 7以及Server版。对于具体的系统环境与性能需求,优化方式会有所差异,效果也不尽相同,仅是个人的建议。所有的优化 *** 作都通过修改注册表实现,需要使用regedit命令进入注册表并创建或修改参数,修改完成后需要重启系统,以使之生效。以下使用的参数值均为10进制。

1 TCPWindowSize

TCPWindowSize的值表示TCP的窗口大小。TCP Receive Window(TCP数据接收缓冲)定义了发送端在没有获得接收端的确认信息的状态下可以发送的最大字节数。此数值越大,返回的确认信息就越少,相应的在发送端和接收端之间的通信就越好。此数值较小时可以降低发送端在等待接收端返回确认信息时发生超时的可能性,但这将增加网络流量,降低有效吞吐率。TCP在发送端和接收端之间动态调整一个最大段长度MSS(Maximum Segment Size)的整数倍。MSS在连接开始建立时确定,由于TCP Receive Window被调整为MSS的整数倍,在数据传输中完全长度的TCP数据段的比例增加,故而提高了网络吞吐率。

缺省情况下,TCP将试图根据MSS来优化窗口大小,起始值为16KB,最大值为64KB。TCPWindowSize的最大值通常为65535字节(64KB),以太网最大段长度为1460字节,低于64KB的1460的最大整数倍为62420字节,因而可以在注册表中将TCPWindowSize设置为62420,作为高带宽网络中适用的性能优化值。具体 *** 作如下:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TCPWindowSize的REG_DWORD值,该值的范围是从0到65535,将该值设置为62420。

2 TCP1323Opts 

为了更高效地利用高带宽网络,可以使用比上述TCP窗口大得多的TCP窗口大小,此特性是Windows 2000和Windows Server 2003中的新特性,称为TCP Window Scaling,它将以前的65535字节(64KB)的限制提高到了1073741824字节(1GB)。在带宽与延迟的乘积值很高的连接上(例如卫星连接),可能需要将窗口的大小增加到64KB以上。使用TCP Window Scaling,系统可以允许确认信息间更大数据量的传输,增加了网络吞吐量及性能。发送端和接收端往返通信所需的时间被称为回环时间(RTT)。TCP Window Scaling仅在TCP连接的双方都开启时才真正有效。TCP有一个时间戳选项,通过更加频繁地计算来提高RTT值的估测值,此选项特别有助于估测更长距离的广域网上连接的RTT值,并更加精确地调整TCP重发超时时间。时间戳在TCP报头提供了两个区域,一个记录开始重发的时间,另一个记录接收到的时间。时间戳对于TCP Window Scaling,即确认信息收到前的大数据包传送特别有用,激活时间戳仅仅在每个数据包的头部增加12字节,对网络流量的影响微乎其微。数据完整性与数据吞吐率最大化哪个更为重要是个需要评估的问题。在某些环境中,例如视频流传输,需要更大的TCP窗口,这是最重要的,而数据完整性排在第二位。在这种环境中,TCP Window Scaling可以不打开时间戳。当发送端和接收端均激活TCP Window Scaling和时间戳时,此特性才有效。不过,若在发包时加入了时间戳,经过NAT之后,如果前面相同的端口被使用过,且时间戳大于这个连接发出的SYN中的时间戳,就会导致服务器忽略该SYN,表现为用户无法正常完成TCP的3次握手。初始时生成小的TCP窗口,之后窗口大小将按照内部算法增大。具体 *** 作如下:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TCP1323Opts的REG_DWORD值,该值的具体含义为:0(缺省值)表示禁用TCP Window Scaling和时间戳;1表示只启用TCP Window Scaling;2表示只启用时间戳;3表示同时启用TCP Window Scaling和时间戳。TCP1323Opts设置为激活TCP Window Scaling后,可以将上文中的注册表项TCPWindowSize的值增大,最大能达到1GB,为了达到最佳性能,这里的值最好设置成MSS的倍数,推荐值为256960字节。

3 TCP 控制块表

对于每个TCP连接,控制变量保存在一个称为TCP控制块(TCB)的内存块中。TCB表的大小由注册表项MaxHashTableSize控制。在活动连接很多的系统中,设定一个较大的表可以降低系统定位TCB表的时间。在TCB表上分区可以降低对表的访问的争夺。增加分区的数量,TCP的性能会得到优化,特别是在多处理器的系统上。注册表项NumTcbTablePartitions控制分区的数量,默认是处理器个数的平方。TCB通常预置在内存中,以防止TCP反复连接和断开时,TCB反复重新定位浪费时间,这种缓冲的方式促进了内存管理,但同时也限制了同一时刻允许的TCP连接数量。注册表项MaxFreeTcbs决定了处于空闲等待状态的TCB重新可用之前的连接数量,在NT架构中常设置成高于默认值,以确保有足够的预置的TCB。从Windows 2000开始添加了一个新特性,降低超出预置TCB运行的可能性。如果处于等待状态的连接多于MaxFreeTWTcbs中的设置,所有等待时间超过60秒的连接将被强制关闭,以后再次启用。此特性合并到Windows 2000 Server和Windows Server 2003后,MaxFreeTcbs将不再用于优化性能。具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为MaxHashTableSize的REG_DWORD值,该值的范围是从1到65536,并且必须为2的N次方,缺省值为512,建议设为8192。然后在Parameters子键下创建或修改名为NumTcbTablePartitions的REG_DWORD值,该值的范围是从1到65536,并且必须为2的N次方,缺省值为处理器个数的平方,建议设为处理器核心数的4倍。

4 TcpTimedWaitDelay

TcpTimedWaitDelay的值表示系统释放已关闭的TCP连接并复用其资源之前,必须等待的时间。这段时间间隔就是以前的Blog中提到的TIME_WAIT状态(2MSL,数据包最长生命周期的两倍状态)。如果系统显示大量连接处于TIME_WAIT状态,则会导致并发量与吞吐量的严重下降,通过减小该项的值,系统可以更快地释放已关闭的连接,从而为新连接提供更多的资源,特别是对于高并发短连接的Server具有积极的意义。

该项的缺省值是240,即等待4分钟后释放资源;系统支持的最小值为30,即等待时间为30秒。具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TcpTimedWaitDelay的REG_DWORD值,该值的范围是从0到300,建议将该值设置为30。

5 MaxUserPort

MaxUserPort的值表示当应用程序向系统请求可用的端口时,TCP/IP可分配的最大端口号。如果系统显示建立连接时出现异常,那么有可能是由于匿名(临时)端口数不够导致的,特别是当系统打开大量端口来与Web service、数据库或其他远程资源建立连接时。

该项的缺省值是十进制的5000,这也是系统允许的最小值。Windows默认为匿名(临时)端口保留的端口号范围是从1024到5000。为了获得更高的并发量,建议将该值至少设为32768以上,甚至设为理论最大值65534,特别是对于模拟高并发测试环境的Client具有积极的意义。具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为MaxUserPort的REG_DWORD值,该值的范围是从5000到65534,缺省值为5000,建议将该值设置为65534。

6 动态储备

动态储备的值使系统能自动调整其配置,以接受大量突发的连接请求。如果同时接收到大量连接请求,超出了系统的处理能力,那么动态储备就会自动增大系统支持的暂挂连接的数量(即Client已请求而Server尚未处理的等待连接数,TCP连接的总数包括已连接数与等待连接数),从而可减少连接失败的数量。系统的处理能力和支持的暂挂连接的数量不足时,Client的连接请求将直接被拒绝。

缺省情况下,Windows 不启用动态储备,可以通过以下 *** 作进行开启和设置:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters注册表子键,在Parameters子键下创建或修改下列名称的REG_DWORD值。

EnableDynamicBacklog,值为1,表示开启动态储备。

MinimumDynamicBacklog,值为128,表示支持的最小暂挂连接的数量为128。

MaximumDynamicBacklog,值为2048,表示支持的最大暂挂连接的数量为2048。对于高并发短连接的Server,建议最大值设为1024及以上。

DynamicBacklogGrowthDelta,值为128,表示支持的暂挂连接的数量的增量为128,即数量不足时自增长128,直到达到设定的最大值,如2048。

7 KeepAliveTime

KeepAliveTime的值控制系统尝试验证空闲连接是否仍然完好的频率。如果该连接在一段时间内没有活动,那么系统会发送保持连接的信号,如果网络正常并且接收方是活动的,它就会响应。如果需要对丢失接收方的情况敏感,也就是说需要更快地发现是否丢失了接收方,请考虑减小该值。而如果长期不活动的空闲连接的出现次数较多,但丢失接收方的情况出现较少,那么可能需要增大该值以减少开销。

缺省情况下,如果空闲连接在7200000毫秒(2小时)内没有活动,系统就会发送保持连接的消息。 通常建议把该值设为1800000毫秒,从而丢失的连接会在30分钟内被检测到。具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为KeepAliveTime的REG_DWORD值,为该值设置适当的毫秒数。

8 KeepAliveInterval

KeepAliveInterval的值表示未收到另一方对“保持连接”信号的响应时,系统重复发送“保持连接”信号的频率。在无任何响应的情况下,连续发送“保持连接”信号的次数超过TcpMaxDataRetransmissions(下文将介绍)的值时,将放弃该连接。如果网络环境较差,允许较长的响应时间,则考虑增大该值以减少开销;如果需要尽快验证是否已丢失接收方,则考虑减小该值或TcpMaxDataRetransmissions值。

缺省情况下,在未收到响应而重新发送“保持连接”的信号之前,系统会等待1000毫秒(1秒),可以根据具体需求修改,具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为KeepAliveInterval的REG_DWORD值,为该值设置适当的毫秒数。

9 TcpMaxDataRetransmissions

TcpMaxDataRetransmissions的值表示TCP数据重发,系统在现有连接上对无应答的数据段进行重发的次数。如果网络环境很差,可能需要提高该值以保持有效的通信,确保接收方收到数据;如果网络环境很好,或者通常是由于丢失接收方而导致数据的丢失,那么可以减小该值以减少验证接收方是否丢失所花费的时间和开销。

缺省情况下,系统会重新发送未返回应答的数据段5次,可以根据具体需求修改,具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TcpMaxDataRetransmissions的REG_DWORD值,该值的范围是从0到4294967295,缺省值为5,根据实际情况进行设置。

10 TcpMaxConnectRetransmisstions

TcpMaxConnectRetransmisstions的值表示TCP连接重发,TCP退出前重发非确认连接请求(SYN)的次数。对于每次尝试,重发超时是成功重发的两倍。在Windows Server 2003中默认超时次数是2,默认超时时间为3秒(在注册表项TCPInitialRTT中)。速度较慢的WAN连接中超时时间可相应增加,不同环境中可能会有不同的最优化设置,需要在实际环境中测试确定。超时时间不要设置太大否则将不会发生网络连接超时时间。具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters注册表子键,在Parameters子键下创建或修改名为TcpMaxConnectRetransmisstions的REG_DWORD值,该值的范围是从0到255,缺省值为2,根据实际情况进行设置。然后在Parameters子键下创建或修改名为TCPInitialRTT的REG_DWORD值,同样根据实际情况进行设置。

11 TcpAckFrequency

TcpAckFrequency的值表示系统发送应答消息的频率。如果值为2,那么系统将在接收到2个分段之后发送应答,或是在接收到1个分段但在200毫秒内没有接收到任何其他分段的情况下发送应答;如果值为3,那么系统将在接收到3个分段之后发送应答,或是在接收到1个或2个分段但在200毫秒内没有接收到任何其他分段的情况下发送应答,以此类推。如果要通过消除应答延迟来缩短响应时间,那么建议将该值设为1。在此情况下,系统会立即发送对每个分段的应答;如果连接主要用于传输大量数据,而200毫秒的延迟并不重要,那么可以减小该值以降低应答的开销。

缺省情况下,系统将该值设为2,即每隔一个分段应答一次。该值的有效范围是0到255,其中0表示使用缺省值2,可以根据具体需求修改,具体 *** 作:

浏览至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\xx(xx由网络适配器决定)注册表子键,在xx子键下创建或修改名为TcpAckFrequency的REG_DWORD值,该值的范围是从1到13,缺省值为2,根据希望每发送几个分段返回一个应答而设置该值,建议百兆网络设为5,千兆网络设为13。

>

对于流计算来说,最核心的概念就是无穷数据集,而用来处理无穷数据集的计算就可以称为流计算。面对无穷数据集,有多种多样的处理方式,但是大致上可以分为四类:

1、时间无关:最基础的场景就是Filter,我们只关心我们想要的数据,这跟数据源是否是无穷的、失序都没有关系了。

2、近似算法:比如近似Top-N、流K-means聚类等。他们都以无穷数据为输入,并计算出差不多你想要的结果。

3、窗口:而窗口其实就是对无穷数据集进行分片,一种化无穷为有穷的抽象概念。

显然,无穷数据集有N多分片的方式,因此也就对应着N多的窗口。而其中最为引人注目的就是按时间划分的窗口了,是的,没有比时间窗口更有吸引力的划分方式了。而在时间窗口中,核心的一个概念就是时间,在流计算中一般可以分为处理时间和事件时间,当然还可以定义更多时间的概念,这完全看你自己喽。在Flink中就有这么一个东西:摄入时间。在这里,想说的是,只有事件时间才能保证正确性,程序进行回放也能保证一致性。

对于无穷数据集,我们缺乏一种有效的方式来判断数据完整性,因此就有了WaterMark。watermark是建立在事件时间上的一个概念,用来刻画数据流的完整性。如果按照处理时间来衡量事件,一切都是有序的,完美的,自然而然也就无需watermark了。

换句话说事件时间引入了乱序的问题,而watermark就是用来解决乱序问题。所谓的乱序,其实就是有事件迟到了,对于迟到的元素,我们不可能无限期的等下去,必须要有一种机制来保证一个特定的时间后,必须触发window进行计算了。这个特别的机制,就是watermark,它告诉了算子时间不大于 也就是小于等于 WaterMark 的消息不应该再被接收(如果出现意味着延迟到达)。

备注:后边有句话,当watermark时间 >= window maxTimestamp时,就符合了window触发的条件了,可以帮助理解这句话

在Flink中,window是按照自然时间进行划分的,如果window大小是3秒,那么1分钟内会把window划分为如下的形式:

如果window大小是10秒,则window会被分为如下的形式:当然还有一个offset值可以控制window的起始值不是整点。

到 EventTimeTrigger 的 onElement 中看看: EventTimeTrigger 中当 ctxgetCurrentWatermark >= windowmaxTimestamp 时立刻触发窗口计算。

windowmaxTimestamp = 窗口结束时间 - 1,flink时间窗口的单位为ms,也就是时间戳,也就是说就差一毫秒,也不会触发窗口。

然后到调用Evictor的地方看看:没有内容是不会触发计算的

输入的数据中,根据自身的Event Time,将数据划分到不同的window中,如果window中有数据,则当 watermark 时间 >= window maxTimestamp 时,就符合了window触发的条件了,最终决定window触发,还是由数据本身的Event Time所属的window中的window maxTimestamp决定。

waterMark,checkpoint其实都是上游节点广播消息给下游节点来处理的行为(都是在流中插入一种特殊的数据结构来做处理)

即按照固定的时间间隔周期的生成水位线。这个时间间隔可以通过 ExecutionConfigsetAutoWatermarkInterval() 进行设置。当然只有新生成的水位线不为空并且大于上一次生成的水位线,新水位线才会被发出。

生成新的水位线的逻辑完全是由用户自己定义的。最简单的水位线生成算法就是取目前为止最大的事件时间。当然这种算法比较暴力,容易水位线提升突涨(这个最大时间戳可能过大),因此该算法对乱序事件的容忍程度比较低,容易出现大量迟到事件。当然我们用的最多的是KeyedWindow,一个Window往往有多个输入,而Window算子会选择其中最小的一个。

通过数据流中某些特殊标记事件来触发新水位线的生成。

虽然水位线指示着早于它的事件不应该再出现,但是在实际情况中,水位线生成算法,往往生不成完美水位线,接收到水位线以前的的消息是不可避免的,这就是所谓的迟到事件。实际上迟到事件是乱序事件的特例,和一般乱序事件不同的是它们的乱序程度超出了水位线的预计,导致窗口在它们到达之前已经关闭。

迟到事件出现时窗口已经关闭并产出了计算结果,因此处理的方法有3种:

1、重新激活已经关闭的窗口并重新计算以修正结果。

2、将迟到事件收集起来另外处理。

3、将迟到事件视为错误消息并丢弃。

Flink 默认的处理方式是第3种直接丢弃,其他两种方式分别使用Side Output和Allowed Lateness。

Side Output机制可以将迟到事件单独放入一个数据流分支,这会作为 window 计算结果的副产品,以便用户获取并对其进行特殊处理。

Allowed Lateness机制允许用户设置一个允许的最大迟到时长。Flink 会再窗口关闭后一直保存窗口的状态直至超过允许迟到时长,这期间的迟到事件不会被丢弃,而是默认会触发窗口重新计算。因为保存窗口状态需要额外内存,并且如果窗口计算使用了 ProcessWindowFunction API 还可能使得每个迟到事件触发一次窗口的全量计算,代价比较大,所以允许迟到时长不宜设得太长,迟到事件也不宜过多,否则应该考虑降低水位线提高的速度或者调整算法。

以上就是关于【TCP】 tcp四次挥手状态 TIME_WAIT全部的内容,包括:【TCP】 tcp四次挥手状态 TIME_WAIT、NTP数据帧上的时间戳怎么理解、windows系统下的tcp参数优化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9574853.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)