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/transport/netty4/NetUtils.java
* Returns the extended TCP_KEEPCOUNT socket option, if available on this JDK
     */
    public static SocketOption<Integer> getTcpKeepCountSocketOptionOrNull() {
        return getExtendedSocketOptionOrNull("TCP_KEEPCOUNT");
    }
    @SuppressWarnings("unchecked")
    private static <T> SocketOption<T> getExtendedSocketOptionOrNull(String fieldName) {
        try {
            final Class<?> extendedSocketOptionsClass = Class.forName("jdk.net.ExtendedSocketOptions");
            final Field field = extendedSocketOptionsClass.getField(fieldName);
            return (SocketOption<T>) field.get(null);
        } catch (Exception t) {
            
            return null;
        }
    }
    /**
     * If SO_KEEPALIVE is enabled (default), this method ensures sane default values for the extended socket options
     * TCP_KEEPIDLE and TCP_KEEPINTERVAL. The default value for TCP_KEEPIDLE is system dependent, but is typically 2 hours.
     * Such a high value can result in firewalls eagerly closing these connections. To tell any intermediate devices that
     * the connection remains alive, we explicitly set these options to 5 minutes if the defaults are higher than that.
     */
    public static void tryEnsureReasonableKeepAliveConfig(NetworkChannel socketChannel) {
        assert socketChannel != null;
        try {
            if (socketChannel.supportedOptions().contains(StandardSocketOptions.SO_KEEPALIVE)) {
                final Boolean keepalive = socketChannel.getOption(StandardSocketOptions.SO_KEEPALIVE);
                assert keepalive != null;
                if (keepalive.booleanValue()) {
                    for (SocketOption<Integer> option : Arrays.asList(