Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Update WebRTC message size limit #628

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
achingbrain wants to merge 1 commit into master
base: master
Choose a base branch
Loading
from docs/increase-webrtc-limit

Conversation

@achingbrain
Copy link
Member

@achingbrain achingbrain commented Sep 2, 2024
edited by guillaumemichel
Loading

The browser bugs that made a 16KiB message size limit necessary have long been fixed.

Increase the max size to 256KiB which has been verified experimentally between Firefox/Chrome and update the link to the Mozilla blog entry that discusses the limit and the relevant WebRTC issue that enables 256KiB messages.

Implementation status

cortze reacted with heart emoji
The browser bugs that made a 16KiB message size limit necessary have long been fixed.
Increase the max size to 256KiB which has been verified experimentally between Firefox/Chrome and update the link to the Mozilla blog entry that discusses the limit and the relevant WebRTC issue that enables 256KiB messsages.
Comment on lines 94 to 95
Implementations MAY choose to send smaller messages, e.g. to reduce delays
sending _flagged_ messages.
Copy link
Member Author

@achingbrain achingbrain Sep 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we account for forwards compatibility with future implementations that aren't arbitrarily limited like browsers currently?

Suggested change
Implementations MAY choose to send smaller messages, e.g. to reduce delays
sending _flagged_ messages.
Implementations MAY choose to send smaller messages, e.g. to reduce delays
sending _flagged_ messages, and they MAY choose to accept larger messages
to allow for forwards compatibility with more capable implementations in the
future.

A "be liberal in what you accept, conservative in what you emit" sort of thing.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer separate sentences since they're both important and about different things.

Implementations MAY choose to send smaller messages, e.g. to reduce delays
sending _flagged_ messages.
Implementations MAY choose to accept larger messages
to allow for forwards compatibility with more capable implementations in the
future.

Comment on lines +91 to +93
Encoded messages including their length prefix MUST NOT exceed 256kiB to support
all major browsers. See ["Large Data Channel Messages"](https://blog.mozilla.org/webrtc/large-data-channel-messages/)
and [WebRTC#40644524](https://issues.webrtc.org/issues/40644524).
Copy link
Member

@lidel lidel Sep 5, 2024
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on internal discussions, I believe we've decided to keep it at 16KiB to remain compatible with Kubo 0.30.0.

@achingbrain what is the next step here? figure out next steps without breaking interop? (e.g. how to negotiate higher size limit per connection via something like RTCSctpTransport/maxMessageSize?)

Copy link
Member Author

@achingbrain achingbrain Sep 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’m doing some experiments in the test plans repo to validate that we do in fact see a throughput increase with larger messages.

Marking this as a draft pending the outcome of that.

Copy link
Member Author

@achingbrain achingbrain Mar 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See linked performance graphs here: #628 (comment)

@achingbrain achingbrain marked this pull request as draft September 5, 2024 18:08
Copy link
Contributor

2color commented Nov 1, 2024

I'm curious, what was the conclusion with this PR and the potential throughput increase?

Copy link
Member Author

achingbrain commented Nov 1, 2024
edited
Loading

The result was a roughly 30% speed increase when going from 16KB to 265KB chunks.

See "Throughput" at the bottom of this page: https://observablehq.com/@libp2p-workspace/performance-dashboard?branch=a44f101803381ea2547e2eb44abc7fb6279d41f2#branch

Upload Download
16KB 28.2 MB/s 26.9 MB/s
256KB 36.1 MB/s 35.6 MB/s
Diff +28% +32%

I think this is still worth doing but we need the go/rust implementations to accept larger chunks - I think rust-libp2p will still reject them.

p-shahi reacted with rocket emoji

Copy link
Member

p-shahi commented Dec 2, 2024

Here's the draft pr @sukunrt created for go-libp2p: libp2p/go-libp2p#2949
The rust-libp2p pr is waiting for the spec to be merged before shipping: libp2p/rust-libp2p#5589

Is everyone agreed that we want to increase the message size? If so, we can proceed with merging the go & rust pr
@achingbrain @sukunrt

achingbrain reacted with thumbs up emoji

Copy link
Member Author

achingbrain commented Mar 11, 2025
edited
Loading

@p-shahi I think we should increase the message size. WebRTC is by far the slowest libp2p transport but also one of the most useful since it's the only one that lets browsers dial each other directly, so anything that speeds it up is very welcome.

@achingbrain achingbrain marked this pull request as ready for review March 11, 2025 13:09
Copy link
Member

@sukunrt sukunrt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there's a way to make this backwards compatible for /webrtc-direct using the datachannel 0 that we use for handshaking.

  1. Both server and client use SDPs that indicate that peer supports 256kB messages.

  2. sever and client use the noise handshake early data extension to send the max message size.

  3. Depending on the max message size received in the handshake we the server and client decide whether to actually send 256kB messages or 16 kB messages.

`RESET_STREAM` frame in reply. The `STOP_SENDING` frame is used for accurate
accounting of the number of bytes sent for connection-level flow control in
QUIC. The libp2p WebRTC message framing is not concerned with flow-control and
thus does not need the `RESET_STREAM` frame to be send in reply to a
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you edit the webrtc-direct file to remove this line where we recommend a max-message size of 16kB
https://github.com/libp2p/specs/blob/1253e2a1deec908037fba924fcd350ec16df13a6/webrtc/webrtc-direct.md?plain=1#L79

Encoded messages including their length prefix MUST NOT exceed 16kiB to support
all major browsers. See ["Understanding message size
limits"](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Using_data_channels#understanding_message_size_limits).
Encoded messages including their length prefix MUST NOT exceed 256kiB to support
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why 256kB, can we support more? Can we add links for the browser specific limts here?

Comment on lines 94 to 95
Implementations MAY choose to send smaller messages, e.g. to reduce delays
sending _flagged_ messages.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer separate sentences since they're both important and about different things.

Implementations MAY choose to send smaller messages, e.g. to reduce delays
sending _flagged_ messages.
Implementations MAY choose to accept larger messages
to allow for forwards compatibility with more capable implementations in the
future.

sukunrt added a commit to libp2p/go-libp2p that referenced this pull request Mar 26, 2025
In experiments with js we've found that increasing the message size
increases throughput. See: libp2p/specs#628 (comment)
for details. 
This changes the protobuf reader for the stream to read 256kB messages.
This isn't enough to support larger messages. We most likely need to
change the inferred SDP of the server to use 256kB maxMessageSize, and
need some backwards compatible mechanism in the handshake to opt in to
large messages. See: libp2p/specs#628 for
details
sukunrt added a commit to libp2p/go-libp2p that referenced this pull request Mar 26, 2025
In experiments with js we've found that increasing the message size
increases throughput. See: libp2p/specs#628 (comment)
for details. 
This changes the protobuf reader for the stream to read 256kB messages.
This also forces a change to the connection SCTP read buffer to be
increased to about 2.5 MB, to support 1 message being buffered for 10
streams.
This isn't enough to support larger messages. We most likely need to
change the inferred SDP of the server to use 256kB maxMessageSize, and
need some backwards compatible mechanism in the handshake to opt in to
large messages. See: libp2p/specs#628 for
details
sukunrt added a commit to libp2p/go-libp2p that referenced this pull request Mar 27, 2025
In experiments with js we've found that increasing the message size
increases throughput. See: libp2p/specs#628 (comment)
for details. 
This changes the protobuf reader for the stream to read 256kB messages.
This also forces a change to the connection SCTP read buffer to be
increased to about 2.5 MB, to support 1 message being buffered for 10
streams.
This isn't enough to support larger messages. We most likely need to
change the inferred SDP of the server to use 256kB maxMessageSize, and
need some backwards compatible mechanism in the handshake to opt in to
large messages. See: libp2p/specs#628 for
details
sukunrt added a commit to libp2p/go-libp2p that referenced this pull request Apr 1, 2025
In experiments with js we've found that increasing the message size
increases throughput. See: libp2p/specs#628 (comment)
for details. 
This changes the protobuf reader for the stream to read 256kB messages.
This also forces a change to the connection SCTP read buffer to be
increased to about 2.5 MB, to support 1 message being buffered for 10
streams.
This isn't enough to support larger messages. We most likely need to
change the inferred SDP of the server to use 256kB maxMessageSize, and
need some backwards compatible mechanism in the handshake to opt in to
large messages. See: libp2p/specs#628 for
details
sukunrt added a commit to libp2p/go-libp2p that referenced this pull request Apr 1, 2025
In experiments with js we've found that increasing the message size
increases throughput. See: libp2p/specs#628 (comment)
for details. 
This changes the protobuf reader for the stream to read 256kB messages.
This also forces a change to the connection SCTP read buffer to be
increased to about 2.5 MB, to support 1 message being buffered for 10
streams.
This isn't enough to support larger messages. We most likely need to
change the inferred SDP of the server to use 256kB maxMessageSize, and
need some backwards compatible mechanism in the handshake to opt in to
large messages. See: libp2p/specs#628 for
details
sukunrt added a commit to libp2p/go-libp2p that referenced this pull request Apr 1, 2025
In experiments with js we've found that increasing the message size
increases throughput. See: libp2p/specs#628 (comment)
for details. 
This changes the protobuf reader for the stream to read 256kB messages.
This also forces a change to the connection SCTP read buffer to be
increased to about 2.5 MB, to support 1 message being buffered for 10
streams.
This isn't enough to support larger messages. We most likely need to
change the inferred SDP of the server to use 256kB maxMessageSize, and
need some backwards compatible mechanism in the handshake to opt in to
large messages. See: libp2p/specs#628 for
details
@p-shahi p-shahi requested a review from jxs April 7, 2025 16:24
Copy link
Member Author

@p-shahi p-shahi mentioned this pull request Jun 17, 2025
19 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@sukunrt sukunrt sukunrt left review comments

@MarcoPolo MarcoPolo Awaiting requested review from MarcoPolo

@lidel lidel Awaiting requested review from lidel

@jxs jxs Awaiting requested review from jxs

Requested changes must be addressed to merge this pull request.

Assignees

No one assigned

Labels

None yet

Projects

Status: Triage

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /