In 8.3 the default TCP keep alive settings introduced in https://github.com/elastic/elasticsearch/pull/59278 are not applied by default, therefore it uses the OS default values. See:

8.3.0:
```
cat connections-8.3.0.txt  | grep -e '930[01]' | head
ESTAB  0       0         [::ffff:127.0.0.1]:46818     [::ffff:127.0.0.1]:9301    timer:(keepalive,119min,0) uid:1038 ino:6837419 sk:a2 <->
ESTAB  0       0         [::ffff:127.0.0.1]:37928     [::ffff:127.0.0.1]:9300    timer:(keepalive,119min,0) uid:1038 ino:6834869 sk:a3 <->
ESTAB  0       0         [::ffff:127.0.0.1]:9301      [::ffff:127.0.0.1]:46808   timer:(keepalive,119min,0) uid:1038 ino:6830957 sk:a4 <->
ESTAB  0       0         [::ffff:127.0.0.1]:37942     [::ffff:127.0.0.1]:9300    timer:(keepalive,119min,0) uid:1038 ino:6834871 sk:a5 <->
ESTAB  0       0         [::ffff:127.0.0.1]:9301      [::ffff:127.0.0.1]:46828   timer:(keepalive,119min,0) uid:1038 ino:6834882 sk:a6 <->
ESTAB  0       0         [::ffff:127.0.0.1]:37926     [::ffff:127.0.0.1]:9300    timer:(keepalive,119min,0) uid:1038 ino:6834868 sk:a7 <->
ESTAB  0       0         [::ffff:127.0.0.1]:9301      [::ffff:127.0.0.1]:46826   timer:(keepalive,119min,0) uid:1038 ino:6834881 sk:a8 <->
ESTAB  0       0         [::ffff:127.0.0.1]:46824     [::ffff:127.0.0.1]:9301    timer:(keepalive,119min,0) uid:1038 ino:6837425 sk:a9 <->
ESTAB  0       0         [::ffff:127.0.0.1]:37944     [::ffff:127.0.0.1]:9300    timer:(keepalive,119min,0) uid:1038 ino:6834879 sk:aa <->
ESTAB  0       0         [::ffff:127.0.0.1]:46828     [::ffff:127.0.0.1]:9301    timer:(keepalive,119min,0) uid:1038 ino:6837430 sk:ab <->
```

8.2.2:
```
cat connections-8.2.2.txt  | grep -e '930[01]' | head
ESTAB  0       0         [::ffff:127.0.0.1]:46752     [::ffff:127.0.0.1]:9301    timer:(keepalive,4min52sec,0) uid:1038 ino:6833637 sk:6e <->
ESTAB  0       0         [::ffff:127.0.0.1]:9301      [::ffff:127.0.0.1]:46746   timer:(keepalive,4min52sec,0) uid:1038 ino:6831684 sk:6f <->
ESTAB  0       0         [::ffff:127.0.0.1]:46732     [::ffff:127.0.0.1]:9301    timer:(keepalive,4min52sec,0) uid:1038 ino:6833629 sk:70 <->
ESTAB  0       0         [::ffff:127.0.0.1]:37876     [::ffff:127.0.0.1]:9300    timer:(keepalive,4min52sec,0) uid:1038 ino:6833618 sk:71 <->
ESTAB  0       0         [::ffff:127.0.0.1]:9301      [::ffff:127.0.0.1]:46730   timer:(keepalive,4min52sec,0) uid:1038 ino:6831676 sk:72 <->
ESTAB  0       0         [::ffff:127.0.0.1]:46748     [::ffff:127.0.0.1]:9301    timer:(keepalive,4min52sec,0) uid:1038 ino:6833640 sk:73 <->
ESTAB  0       0         [::ffff:127.0.0.1]:46736     [::ffff:127.0.0.1]:9301    timer:(keepalive,4min52sec,0) uid:1038 ino:6833631 sk:74 <->
ESTAB  0       0         [::ffff:127.0.0.1]:9301      [::ffff:127.0.0.1]:46732   timer:(keepalive,4min52sec,0) uid:1038 ino:6831677 sk:75 <->
ESTAB  0       0         [::ffff:127.0.0.1]:37860     [::ffff:127.0.0.1]:9300    timer:(keepalive,4min52sec,0) uid:1038 ino:6833611 sk:76 <->
ESTAB  0       0         [::ffff:127.0.0.1]:46734     [::ffff:127.0.0.1]:9301    timer:(keepalive,4min52sec,0) uid:1038 ino:6833630 sk:77 <->
```

It's possible that after moving `NetUtil` to the netty module https://github.com/elastic/elasticsearch/pull/85953 some of the internal details used are not available anymore.
modules/transport-netty4/src/main/java/org/elasticsearch/http/netty4/Netty4HttpServerTransport.java
ch.pipeline().addLast("aggregator", aggregator);
            if (handlingSettings.compression()) {
                ch.pipeline().addLast("encoder_compress", new HttpContentCompressor(handlingSettings.compressionLevel()));
            }
            ch.pipeline().addLast("pipelining", new Netty4HttpPipeliningHandler(logger, transport.pipeliningMaxEvents, transport));
            transport.serverAcceptedChannel(nettyHttpChannel);
        }
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
            ExceptionsHelper.maybeDieOnAnotherThread(cause);
            super.exceptionCaught(ctx, cause);
        }
    }
    @ChannelHandler.Sharable
    private static class ServerChannelExceptionHandler extends ChannelInboundHandlerAdapter {
        static final ServerChannelExceptionHandler INSTANCE = new ServerChannelExceptionHandler();
        private ServerChannelExceptionHandler() {}
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            ExceptionsHelper.maybeDieOnAnotherThread(cause);
            Netty4HttpServerChannel httpServerChannel = ctx.channel().attr(HTTP_SERVER_CHANNEL_KEY).get();
            if (cause instanceof Error) {
                AbstractHttpServerTransport.onServerException(httpServerChannel, new Exception(cause));
            } else {
                AbstractHttpServerTransport.onServerException(httpServerChannel, (Exception) cause);
            }
        }
    }
}