---
title: "Multiplexed transport"
description: "Learn about multiplexed transports and how IceRPC uses them."
url: https://docs.icerpc.dev/icerpc/multiplexed-transport
docs_index: https://docs.icerpc.dev/llms.txt
---

> For an index of every page, see [llms.txt](https://docs.icerpc.dev/llms.txt).

# Multiplexed transport

Learn about multiplexed transports and how IceRPC uses them.

A multiplexed transport is an abstraction that provides multiplexed communications between a client and server using several streams. [QUIC](https://www.rfc-editor.org/rfc/rfc9000.html) and [Slic](https://docs.icerpc.dev/icerpc/slic-transport/overview.md) are multiplexed transports provided by IceRPC.

The multiplexed transport abstraction allows writing custom multiplexed transports. Such a custom transport needs to conform to the requirements documented on this page.

The [icerpc protocol](https://docs.icerpc.dev/icerpc/protocols-and-transports/icerpc-multiplexed-transports.md) implementation provided by IceRPC relies on the multiplexed transport abstraction.

## The multiplexed transport requirements

IceRPC requires a multiplexed transport to be [connection-oriented](https://en.wikipedia.org/wiki/Connection-oriented_communication) and to support the following features:

- [full-duplex](https://en.wikipedia.org/wiki/Duplex_(telecommunications)#Full_duplex) communication over multiple independent streams
- [flow-control](https://en.wikipedia.org/wiki/Flow_control_(data)) for each stream
- a mechanism to limit the number of active streams opened on a connection
- stream half-closure where each side of the stream can be closed independently
- graceful connection closure to notify the peer of the connection closure and wait for its acknowledgment
- abortive closure to close the connection and release its resources immediately without waiting for the peer to acknowledge the connection closure

## Multiplexed transport and TLS

The TLS configuration from the application is passed through the multiplexed transport abstraction to allow the transport implementation to set up TLS for multiplexed connections.

A transport is free to only support non-secure connections, only support secure connections or support both. For example, Slic with TCP can create secure and non-secure connections while QUIC can only create secure connections.

If the application provides TLS configuration, the transport must create secure connections. If it doesn't support TLS, it must fail.

See also [Security with TLS](https://docs.icerpc.dev/icerpc/connection/security-with-tls.md) for additional information.

## The C# multiplexed transport abstraction

The C# multiplexed transport abstraction consists of a number of interfaces that a custom transport needs to implement:

- [`IMultiplexedClientTransport`](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.Transports.IMultiplexedClientTransport.html): a factory to create outgoing connections
- [`IMultiplexedServerTransport`](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.Transports.IMultiplexedServerTransport.html): a factory to create listeners
- [`IListener<IMultiplexedConnection>`](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.Transports.IListener-1.html): a factory to listen for and create incoming connections
- [`IMultiplexedConnection`](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.Transports.IMultiplexedConnection.html): a connection to accept and create streams
- [`IMultiplexedStream`](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.Transports.IMultiplexedStream.html): a stream to allow a client and server to communicate

The API documentation of these interfaces specifies the contract a custom transport needs to comply with.

To use a custom transport, the application needs to provide an instance of `IMultiplexedServerTransport` or `IMultiplexedClientTransport` to the [Server](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.Server.html), [ConnectionCache](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.ConnectionCache.html) or [ClientConnection](https://code.icerpc.dev/csharp/0.6.x/api/reference/IceRpc.ClientConnection.html) constructors.
