Also sometimes called lazy negotiation or lazy multistream-select.
In {Go,Rust} (unsure about others) we do an optimistic multistream-select when we know the peer supports a certain protocol. The dialer writes the multistream header, the application protocol id, and then application data at once without waiting for the peer to echo back the application protocol id. This lets us remove one round trip when creating a stream and it helps for the one stream per RPC use case.
However, afaict, we have not documented this or what pitfalls to be aware of. Three pitfalls come to mind:
Also sometimes called lazy negotiation or lazy multistream-select.
In {Go,Rust} (unsure about others) we do an optimistic multistream-select when we know the peer supports a certain protocol. The dialer writes the multistream header, the application protocol id, and then application data at once without waiting for the peer to echo back the application protocol id. This lets us remove one round trip when creating a stream and it helps for the one stream per RPC use case.
However, afaict, we have not documented this or what pitfalls to be aware of. Three pitfalls come to mind: