private boolean isGoodPingAck(long data) {
        // 'isPendingPingAck()' can return false when channel read some data other than PING ACK frame
        // or a PING ACK is received without sending PING in first place.
        if (!isPendingPingAck()) {
            logger.debug("{} PING(ACK=1, DATA={}) ignored", channel, data);
            return false;
        }
        if (lastPingPayload != data) {
            logger.debug("{} Unexpected PING(ACK=1, DATA={}) received, " +
                         "but expecting PING(ACK=1, DATA={})", channel, data, lastPingPayload);
            return false;
        }
        return true;
    }
A {@link KeepAliveHandler} that sends an HTTP/2 PING frame
when neither read nor write was performed within the specified {@code pingIntervalMillis},
and closes the connection when neither read nor write was performed within
the given {@code idleTimeoutMillis}.

<p>Once a {@link Http2PingFrame} is written, then either an ACK for the {@link Http2PingFrame} or any data
is read on connection will invalidate the condition that triggers connection closure.

<p>This class is <b>not</b> thread-safe and all methods are to be called from single thread such
as {@link EventLoop}.

@see Flags#defaultClientIdleTimeoutMillis()
@see Flags#defaultServerIdleTimeoutMillis()
@see Flags#defaultPingIntervalMillis()
core/src/main/java/com/linecorp/armeria/internal/common/Http2KeepAliveHandler.java