In fact, these keep-alive packets are not used to support TCP! They are used to detect window size updates.
Wireshark treats them as keep-alive packets only because these packets look like keep-alive packets.
A TCP keepalive packet is simply an ACK with a sequence number set one less than the current sequence number for the connection.
(We assume that ip 10.120.67.113 refers to host A, 10.120.67.132 refers to host B.) In packet No. 244911 A acks seq 24507484. In the next packet (No. 2491212) B send seq 24507483 (24507484-1)).

Why are there so many keep-alive packages, what are they used for?
A sends data to B, and B responds with a zero-window size to inform A that it is temporarily no longer able to receive data. To ensure that A knows when B can receive data again, A sends a keep-alive packet again and again B with a persistence timer , B responds to A with its window size information (In our case, window size B was always zero )
And normal TCP exponential rollback is used when calculating a constant timer. So, we can see that A sends its first “keep-alive” packet after 0.2 s, sends its second packet after 0.4 s, the third goes after 0.8, the intermediate goes after 1.6 s ...
This phenomenon is related to TCP flow control .
cosven
source share