Movatterモバイル変換


[0]ホーム

URL:


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

TCP: avoid stall with larger MSS#493

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
djs55 wants to merge2 commits intomirage:main
base:main
Choose a base branch
Loading
fromdjs55:avoid-stall-larger-mss

Conversation

@djs55
Copy link
Member

(I'm not an expert on this so I might have misunderstood something!)

If the connection requests a large MSS > 16k, for example to exploit a large MTU, then writes block because available space is believed to be 0.

Consider UTX.available:

let available t =    let a = Int32.sub t.max_size t.bufbytes in    match a < (Int32.of_int (Window.tx_mss t.wnd)) with    | true -> 0l    | false -> a

Initially max_size = 16k (hardcoded in flow.ml) and bufbytes = 0, so a = 16k (meaning 16k space is free in the buffer).

If the free space (a) is less than an MSS, we return 0 and the connection stalls.

I think the assumption is that the UTX can buffer at least an MSS worth of data so that when the free space (a) is less than an MSS, the buffer already contains an MSS worth of data to transmit to make progress (does this make sense? Or does it only need to contain 1 byte, so it could be MSS + 1?)

Bump the user buffer size to 128k which is 2x a 64k MSS (where 64k is the max value of the 16-bit MSS option). (Does this need to be configurable somewhere? Linux hasip route add 192.168.1.0/24 dev eth0 advmss 65536 and socket options.)

My hope is that forhttps://github.com/moby/vpnkit which will use aSOCK_DGRAM interface tosend andrecv ethernet frames via Apple virtualization.framework and qemu, I'll be able to bump the ethernet MTU and TCP MSS to 64k to reduce the number of packets, since there's a syscall overhead per-packet.

I'm not completely sure this change is correct and I've not got a 64k MTU/MSS working end-to-end yet. I thought it was worth making the PR for discussion.

This might need rethinking if we support segmentation offload because we might see segments >> MTUs.

Signed-off-by: David Scottdave@recoil.org

If the connection requests a large MSS > 16k, for example to exploit alarge MTU, then writes block because available space is believed to be 0.Consider UTX.available:```let available t =    let a = Int32.sub t.max_size t.bufbytes in    match a < (Int32.of_int (Window.tx_mss t.wnd)) with    | true -> 0l    | false -> a```Initially max_size = 16k (hardcoded in flow.ml) and bufbytes = 0,so a = 16k (meaning 16k space is free in the buffer).If the free space (a) is less than an MSS, we return 0 and the connection stalls.I think the assumption is that the UTX can buffer at least 2*MSS worth ofdata so that when the free space (a) is less than an MSS, the buffer alreadycontains an MSS worth of data to transmit to make progress.Bump the user buffer size to 128k which is 2x a 64k MSS (where 64k is the maxvalue of the 16-bit MSS option).This might need rethinking if we support segmentation offload because we mightsee even bigger segments.Signed-off-by: David Scott <dave@recoil.org>
@avsm
Copy link
Member

avsm commentedOct 4, 2022
edited
Loading

I'll revisit thinking about this one when:

I've not got a 64k MTU/MSS working end-to-end yet

... just to be able to look at a whole feature patchset. Mainly the interactions with TSO, as you note.

djs55 added a commit to djs55/vpnkit that referenced this pull requestOct 13, 2022
-mirage/mirage-tcpip#492 : remove 4000 byte maximum-mirage/mirage-tcpip#493 : avoid stall with large MSSSigned-off-by: David Scott <dave@recoil.org>
djs55 added a commit to djs55/vpnkit that referenced this pull requestOct 13, 2022
-mirage/mirage-tcpip#492 : remove 4000 byte maximum-mirage/mirage-tcpip#493 : avoid stall with large MSSSigned-off-by: David Scott <dave@recoil.org>
djs55 added a commit to djs55/vpnkit that referenced this pull requestOct 13, 2022
-mirage/mirage-tcpip#492 : remove 4000 byte maximum-mirage/mirage-tcpip#493 : avoid stall with large MSSSigned-off-by: David Scott <dave@recoil.org>
djs55 added a commit to djs55/vpnkit that referenced this pull requestOct 26, 2022
-mirage/mirage-tcpip#492 : remove 4000 byte maximum-mirage/mirage-tcpip#493 : avoid stall with large MSSSigned-off-by: David Scott <dave@recoil.org>
@dinosaure
Copy link
Member

I would like a double check from someone else about this PR. Therefore, I would like to merge (or not) and cut a release 👍 .

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

@avsmavsmavsm left review comments

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

3 participants

@djs55@avsm@dinosaure

[8]ページ先頭

©2009-2025 Movatter.jp