[[transport-settings]]
==== Advanced transport settings

Use the following advanced settings to configure the transport interface
independently of the <<http-settings,HTTP interface>>. Use the
<<common-network-settings,network
settings>> to configure both interfaces together.

`transport.host`::
(<<static-cluster-setting,Static>>, string)
Sets the address of this node for transport traffic. The node will bind to this
address and will also use it as its transport publish address. Accepts an IP
address, a hostname, or a <<network-interface-values,special value>>.
Use this setting only if you require different configurations for the
transport and HTTP interfaces.
+
Defaults to the address given by `network.host`.

`transport.bind_host`::
(<<static-cluster-setting,Static>>, string)
The network address(es) to which the node should bind in order to listen for
incoming transport connections. Accepts a list of IP addresses, hostnames, and
<<network-interface-values,special values>>. Defaults to the address given by
`transport.host` or `network.bind_host`. Use this setting only if you require
to bind to multiple addresses or to use different addresses for publishing and
binding, and you also require different binding configurations for the
transport and HTTP interfaces.

`transport.publish_host`::
(<<static-cluster-setting,Static>>, string)
The network address at which the node can be contacted by other nodes. Accepts
an IP address, a hostname, or a <<network-interface-values,special value>>.
Defaults to the address given by `transport.host` or `network.publish_host`.
Use this setting only if you require to bind to multiple addresses or to use
different addresses for publishing and binding, and you also require different
binding configurations for the transport and HTTP interfaces.

`transport.publish_port`::
(<<static-cluster-setting,Static>>, integer)
The port of the <<modules-network-binding-publishing,transport publish
address>>. Set this parameter only if you need the publish port to be
different from `transport.port`. Defaults to the port assigned via
`transport.port`.

`transport.connect_timeout`::
(<<static-cluster-setting,Static>>, <<time-units,time value>>)
The connect timeout for initiating a new connection (in
time setting format). Defaults to `30s`.

`transport.compress`::
(<<static-cluster-setting,Static>>, string)
Set to `true`, `indexing_data`, or `false` to configure transport compression
between nodes. The option `true` will compress all data. The option
`indexing_data` will compress only the raw index data sent between nodes during
ingest, ccr following (excluding bootstrap), and operations based shard recovery
(excluding transferring lucene files). Defaults to `indexing_data`.

`transport.compression_scheme`::
(<<static-cluster-setting,Static>>, string)
Configures the compression scheme for `transport.compress`. The options are
`deflate` or `lz4`. If `lz4` is configured and the remote node has not been
upgraded to a version supporting `lz4`, the traffic will be sent uncompressed.
Defaults to `lz4`.

`transport.tcp.keep_alive`::
(<<static-cluster-setting,Static>>, boolean)
Configures the `SO_KEEPALIVE` option for transport sockets, which determines
whether they send TCP keepalive probes. Defaults to `network.tcp.keep_alive`.

`transport.tcp.keep_idle`::
(<<static-cluster-setting,Static>>, integer)
Configures the `TCP_KEEPIDLE` option for transport sockets, which determines
the time in seconds that a connection must be idle before starting to send TCP
keepalive probes. Defaults to `network.tcp.keep_idle` if set, or the system
default otherwise. This value cannot exceed `300` seconds. In cases where the
system default is higher than `300`, the value is automatically lowered to
`300`. Only applicable on Linux and macOS.

`transport.tcp.keep_interval`::
(<<static-cluster-setting,Static>>, integer)
Configures the `TCP_KEEPINTVL` option for transport sockets, which determines
the time in seconds between sending TCP keepalive probes. Defaults to
`network.tcp.keep_interval` if set, or the system default otherwise. This value
cannot exceed `300` seconds. In cases where the system default is higher than
`300`, the value is automatically lowered to `300`. Only applicable on Linux
and macOS.

`transport.tcp.keep_count`::
(<<static-cluster-setting,Static>>, integer)
Configures the `TCP_KEEPCNT` option for transport sockets, which determines the
number of unacknowledged TCP keepalive probes that may be sent on a connection
before it is dropped. Defaults to `network.tcp.keep_count` if set, or the
system default otherwise. Only applicable on Linux and macOS.

`transport.tcp.no_delay`::
(<<static-cluster-setting,Static>>, boolean)
Configures the `TCP_NODELAY` option on transport sockets, which determines
whether {wikipedia}/Nagle%27s_algorithm[TCP no delay] is enabled. Defaults to
`true`.

`transport.tcp.reuse_address`::
(<<static-cluster-setting,Static>>, boolean)
Configures the `SO_REUSEADDR` option for network sockets, which determines
whether the address can be reused or not. Defaults to
`network.tcp.reuse_address`.

`transport.tcp.send_buffer_size`::
(<<static-cluster-setting,Static>>, <<byte-units,byte value>>)
The size of the TCP send buffer for transport traffic. Defaults to
`network.tcp.send_buffer_size`.

`transport.tcp.receive_buffer_size`::
(<<static-cluster-setting,Static>>, <<byte-units,byte value>>)
The size of the TCP receive buffer for transport traffic. Defaults to
`network.tcp.receive_buffer_size`.

`transport.ping_schedule`::
(<<static-cluster-setting,Static>>, <<time-units,time value>>)
Configures the time between sending application-level pings on all transport
connections to promptly detect when a transport connection has failed. Defaults
to `-1` meaning that application-level pings are not sent. You should use TCP
keepalives (see `transport.tcp.keep_alive`) instead of application-level pings
wherever possible.

[[transport-profiles]]
===== Transport profiles

Elasticsearch allows you to bind to multiple ports on different interfaces by
the use of transport profiles. See this example configuration

[source,yaml]
--------------
transport.profiles.default.port: 9300-9400
transport.profiles.default.bind_host: 10.0.0.1
transport.profiles.client.port: 9500-9600
transport.profiles.client.bind_host: 192.168.0.1
transport.profiles.dmz.port: 9700-9800
transport.profiles.dmz.bind_host: 172.16.1.2
--------------

The `default` profile is special. It is used as a fallback for any other
profiles, if those do not have a specific configuration setting set, and is how
this node connects to other nodes in the cluster.
Other profiles can have any name and can be used to set up specific endpoints
for incoming connections.

The following parameters can be configured on each transport profile, as in the
example above:

* `port`: The port to which to bind.
* `bind_host`: The host to which to bind.
* `publish_host`: The host which is published in informational APIs.

Profiles also support all the other transport settings specified in the
<<transport-settings,transport settings>> section, and use these as defaults.
For example, `transport.profiles.client.tcp.reuse_address` can be explicitly
configured, and defaults otherwise to `transport.tcp.reuse_address`.

[[long-lived-connections]]
===== Long-lived idle connections

A transport connection between two nodes is made up of a number of long-lived
TCP connections, some of which may be idle for an extended period of time.
Nonetheless, Elasticsearch requires these connections to remain open, and it
can disrupt the operation of your cluster if any inter-node connections are
closed by an external influence such as a firewall. It is important to
configure your network to preserve long-lived idle connections between
Elasticsearch nodes, for instance by leaving `*.tcp.keep_alive` enabled and
ensuring that the keepalive interval is shorter than any timeout that might
cause idle connections to be closed, or by setting `transport.ping_schedule` if
keepalives cannot be configured. Devices which drop connections when they reach
a certain age are a common source of problems to Elasticsearch clusters, and
must not be used.

[[request-compression]]
===== Request compression

The default `transport.compress` configuration option `indexing_data` will only
compress requests that relate to the transport of raw indexing source data
between nodes. This option primarily compresses data sent during ingest,
ccr, and shard recovery. This default normally makes sense for local cluster
communication as compressing raw documents tends significantly reduce inter-node
network usage with minimal CPU impact.

The `transport.compress` setting always configures local cluster request
compression and is the fallback setting for remote cluster request compression.
If you want to configure remote request compression differently than local
request compression, you can set it on a per-remote cluster basis using the
<<remote-clusters-settings,`cluster.remote.${cluster_alias}.transport.compress` setting>>.


[[response-compression]]
===== Response compression

The compression settings do not configure compression for responses. {es} will
compress a response if the inbound request was compressed--even when compression
is not enabled. Similarly, {es} will not compress a response if the inbound
request was uncompressed--even when compression is enabled. The compression
scheme used to compress a response will be the same scheme the remote node used
to compress the request.
