forked from curl/curl
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Multipath TCP (MPTCP), standardized in RFC8684 [1], is a TCP extension that enables a TCP connection to use different paths. Multipath TCP has been used for several use cases. On smartphones, MPTCP enables seamless handovers between cellular and Wi-Fi networks while preserving established connections. This use-case is what pushed Apple to use MPTCP since 2013 in multiple applications [2]. On dual-stack hosts, Multipath TCP enables the TCP connection to automatically use the best performing path, either IPv4 or IPv6. If one path fails, MPTCP automatically uses the other path. To benefit from MPTCP, both the client and the server have to support it. Multipath TCP is a backward-compatible TCP extension that is enabled by default on recent Linux distributions (Debian, Ubuntu, Redhat, ...). Multipath TCP is included in the Linux kernel since version 5.6 [3]. To use it on Linux, an application must explicitly enable it when creating the socket. No need to change anything else in the application. This attached patch adds an --mptcp option which allows the creation of an MPTCP socket instead of TCP on Linux. If Multipath TCP is not supported on the system, an error will be reported. It is important to note that if the end server doesn't support MPTCP, the connection will continue after a seamless fallback to TCP. Link: https://www.rfc-editor.org/rfc/rfc8684.html [1] Link: https://www.tessares.net/apples-mptcp-story-so-far/ [2] Link: https://www.mptcp.dev [3]improving_network_reliability_using_multipath_tcp Co-developed-by: Dorian Craps <doriancraps@gmail.com> Co-developed-by: Olivier Bonaventure <Olivier.Bonaventure@uclouvain.be> Co-developed-by: Matthieu Baerts <matttbe@kernel.org> Signed-off-by: Dorian Craps <dorian.craps@student.vinci.be>
- Loading branch information
1 parent
721941a
commit dc765f2
Showing
16 changed files
with
161 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
--- | ||
c: Copyright (C) Dorian Craps, <dorian.craps@student.vinci.be> | ||
SPDX-License-Identifier: curl | ||
Long: mptcp | ||
Added: 8.7.0 | ||
Help: Enable Multipath TCP (MPTCP) | ||
Category: connection | ||
Multi: boolean | ||
See-also: | ||
- tcp-fastopen | ||
Example: | ||
- --mptcp $URL | ||
--- | ||
|
||
# `--mptcp` | ||
|
||
Enables the use of Multipath TCP (MPTCP) for connections. MPTCP is an extension | ||
to the standard TCP that allows multiple TCP streams over different network | ||
paths between the same source and destination. This can enhance bandwidth and | ||
improve reliability by using multiple paths simultaneously. | ||
|
||
MPTCP is beneficial in networks where multiple paths exist between clients and | ||
servers, such as mobile networks where a device may switch between Wi-Fi and | ||
cellular data or in wired networks with multiple ISPs. | ||
|
||
## Usage | ||
|
||
To use MPTCP for your connections, add the `--mptcp` option when using `curl`: | ||
|
||
## Requirements | ||
|
||
- This feature is currently only supported on Linux starting from kernel 5.6. | ||
- The server you are connecting to must also support MPTCP. | ||
If not, the connection will fallback to TCP. | ||
|
||
## Availability | ||
|
||
The `--mptcp` option is available starting from `curl` version 8.7.0. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
--- | ||
c: Copyright (C) Dorian Craps, <dorian.craps@student.vinci.be> | ||
SPDX-License-Identifier: curl | ||
Title: CURLOPT_MPTCP | ||
Section: 3 | ||
Source: libcurl | ||
See-also: | ||
- tcp-fastopen (3) | ||
--- | ||
|
||
# NAME | ||
|
||
CURLOPT_MPTCP - enable Multipath TCP | ||
|
||
# SYNOPSIS | ||
|
||
~~~c | ||
|
||
#include <curl/curl.h> | ||
|
||
CURLcode curl_easy_setopt(CURL *handle, CURLOPT_MPTCP, long enable); | ||
~~~ | ||
# DESCRIPTION | ||
Pass a long as parameter set to 1L to enable or 0 to disable. | ||
MPTCP is an extension to the standard TCP that allows multiple TCP streams | ||
over different network paths between the same source and destination. | ||
This can enhance bandwidth and improve reliability by using multiple paths | ||
simultaneously. | ||
MPTCP is beneficial in networks where multiple paths exist between clients | ||
and servers, such as mobile networks where a device may switch between Wi-Fi | ||
and cellular data or in wired networks with multiple ISPs. | ||
Enabling MPTCP can improve the performance and reliability of network requests, | ||
particularly in environments where multiple network paths (e.g., WiFi and | ||
cellular) are available. | ||
Note: MPTCP support depends on the underlying operating system and network | ||
infrastructure. Some networks might drop unknown MPTCP, (...), and its | ||
effectiveness will vary based on the network configuration and conditions. | ||
If MPTCP is not supported by the network or the end server, | ||
the connection will fallback to TCP. | ||
# DEFAULT | ||
0 | ||
# PROTOCOLS | ||
All | ||
# EXAMPLE | ||
~~~c | ||
int main(void) | ||
{ | ||
CURL *curl = curl_easy_init(); | ||
if(curl) { | ||
curl_easy_setopt(curl, CURLOPT_URL, "https://example.com"); | ||
curl_easy_setopt(curl, CURLOPT_MPTCP, 1L); | ||
curl_easy_perform(curl); | ||
} | ||
} | ||
~~~ | ||
|
||
# AVAILABILITY | ||
|
||
Support for MPTCP in libcurl requires Linux 5.6 or later. | ||
The feature's availability in libcurl can also depend on the version of libcurl. | ||
Added in 8.7.0. | ||
|
||
# RETURN VALUE | ||
|
||
Returns CURLE_OK if MPTCP is successfully enabled for the connection, | ||
otherwise returns an error code specific to the reason it could not be enabled, | ||
which might include lack of operating system support or libcurl not being built | ||
with MPTCP support. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters