qdeconinck / mp-quic Goto Github PK
View Code? Open in Web Editor NEWPlease read https://multipath-quic.org/2017/12/09/artifacts-available.html to figure out how to setup the code.
License: MIT License
Please read https://multipath-quic.org/2017/12/09/artifacts-available.html to figure out how to setup the code.
License: MIT License
Does MPQUIC not perform full mesh with the client host? For example, there are two hosts (client and server), each host has two interfaces, in MPTCP there are 4 subflows creating the full mesh, however, in MPQUIC I only see 2 subflows created in the pathmanager. How does MPQUIC work, does it not do full mesh?
During the process of installing mpquic, I have met a lot of problems. I found that mpquic was completed around 2 years ago and it has not been updated now, however, quic-go is being continually updated. Could you please tell me which version of quic-go support the existed mpquic?
Hi, I tested
go run main.go -bind ":8088"
on a terminal and
go run client/main.go https://localhost:8088
on another terminal
I got the error:
Closing session with error:ProofInvalid
Connection fec6298ed2bab059 closed
panic: Get https://localhost:8088/demo/tiles: ProofInvalid
I have the id_rsa, id_rsa.pub and authorized_keys file in ~/.ssh
I read the README.md, it seems that the privkey.pem and fullchain.pem file in invalid
So I need to get a new privkey.pem and fullchain.pem in example file right? : -)
There isn't an update version of the CoNEXT 2017 Artifacts Available to figure out how to setup the code?
I have tested your code and find a problem,the client has two ips and the server is one, but when i tested it, lots of udp packets were sent through one ip of the client and a few udp packets were sent through the other ip. so the aggregated output is quite low,Do you test it between the clouds server and your client or you just test it locally ? Have you found this problem?
The provided VM at this link https://multipath-quic.org/kvm-mpquic.vmdk.zip is not booting up. it keeps stuck at busy box(initramfs) when it tries to boot. I've tried many solutions and still can not boot it via VirtualBox and VMware.
Hello, everybody! I want to install the mpquic in real environment, however, I could not install when I executed _go get github.com/lucas-clemente/quic-go and go get -t -u ./... . Does anybody successfully install it? I would very appreciated if someone could tell me how to install it. Thank you so much for your attention and participation.
I used MPQUIC to transfer files from a server in cloud with one NIC to a client with two NIC, the output log shows that two paths are established but only one path can receive packets. I print the 4 tuple of the two paths from both perspective of client and server, from server's viewpoint, the client addresses are behind NAT(shown in the figure). So the reason of path unable to receive packet is the server can't find the local address of client behind NAT?
Hi,
I can see multiple references to Reno in cubic_sender.go . Now I'm a bit confused. Is Cubic really implemented in cubic_sender.go or does this implement Reno or both?
Hello everyone, I have an issue when running the "go get -t -u ./..." command to download dependency packages for mpquic.
I flowed this tutorial " https://multipath-quic.org/2017/12/09/artifacts-available.html", using go1.17.5 instead of go1.9, and I got the following error:
internal/crypto/key_derivation.go:47:60: cs.KeyLen undefined (type mint.CipherSuiteParams has no field or method KeyLen)
internal/crypto/key_derivation.go:48:58: cs.IvLen undefined (type mint.CipherSuiteParams has no field or method IvLen)
I tried to reset the mint repo, as it is mentioned in the tutorial, but it didn't solve the problem.
it's possible to implement MP Quic on windows 10??
hello,
I'm using an unpublic project which uses MPQUIC, I followed the instructions mentioned in its readme file to build and install the project, but when I ran the go install ./... command it gave me an error:
go build github.com/lucas-clemente/quic-go/benchmark: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/benchmark
go build github.com/lucas-clemente/quic-go/integrationtests/chrome: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/integrationtests/chrome
go build github.com/lucas-clemente/quic-go/integrationtests/gquic: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/integrationtests/gquic
go build github.com/lucas-clemente/quic-go/integrationtests/self: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/integrationtests/self
could you please help me fix this error?
Best regards,
I just do as the steps mentioned in https://multipath-quic.org/2017/12/09/artifacts-available.html
Unfortunately,when i run the "go get -t -u ./...",
It showed the error above.
Could you please tell me why this happened and how i can solve this problem?
Hello,
I read your paper: Adding Forward Erasure Correction to QUIC, and noticed
that you've already added FEC in MPQUIC and designed a scheduler named HighRB Scheduler, but I didn't find the code, is the code available?It would be appreciated if you could answer this question.
Zero-length connection ID should not be enabled if a host want to advertise multipath-support. The same requirement was stated in QUIC transport draft to support connection migration, NAT rebinding, or client port reuse.
Hello,
I followed the tutorial https://multipath-quic.org/2017/12/09/artifacts-available.html
But when I got to go get -t -u ./...
, there was a problem as belong showing:
#github.com/lucas-clemente/quic-go/internal/crypto
internal/crypto/key_derivation.go:47:60: cs.KeyLen undefined (type mint.CipherSuiteParams has no field or method KeyLen)
internal/crypto/key_derivation.go:48:58: cs.IvLen undefined (type mint.CipherSuiteParams has no field or method IvLen)
Can you tell me what is the problem is?And I notice there's no reply to lots of issues, is mpquic dead?
Dear @qdeconinck ,
I have a question about InitialPath (PathID=0). I know that the path used for establishing the QUIC connection and the cryptographic handshake is done on this path.
However, in the scheduler, I try to return InitialPath for all packets to send, and it works. Especially, the transmission time is fast (compare to other schedulers as minRTT, BLEST,...).
Looking forward to your explanation of how this path works. Thank you
While the intention of the populateServerConfig
function seems to be to enable path creation by default (the comments explicitly say that we want to "Grant this ability by default for a server"), and the implementation sets the CreatePaths
value to true for the passed *Config...
Lines 166 to 171 in 7a91883
... the value of the passed config.CreatePaths
is never propagated to the returned *Config
meaning that it takes the default bool value (false) whenever populateServerConfig
is called.
Lines 200 to 209 in 7a91883
populateServerConfig
is in the call chain for all of the Listen*
functions which means that unless you are creating the internal server
struct with a config that has CreatePaths
set, it is impossible to set the value to true.
Further down the call path, when the value of session.createPaths
is false, the pathManager
will never call createPaths
in run
which means that the pathManagers
on the server never get a chance to call advertiseAddresses
.
Impact:
This bug means that server pathManagers
will never call createPaths
-- preventing them from advertising local addresses to clients, and client pathManagers
are currently prevented from advertising paths. I believe this means that configurations where the client has multiple addresses and the server has a single address will work as expected as the client will create connections from each suitable local address to the singular remote it knows about. The server will integrate these connections into the session properly using createPathFromRemote
. However, in configurations where the server has multiple available addresses, the client will not be able discover the additional paths.
Fix:
Propagate the value of config.CreatePaths
in populateServerConfig
.
// populateServerConfig populates fields in the quic.Config with their default values, if none are set
// it may be called with nil
func populateServerConfig(config *Config) *Config {
...
return &Config{
Versions: versions,
...
MaxReceiveStreamFlowControlWindow: maxReceiveStreamFlowControlWindow,
MaxReceiveConnectionFlowControlWindow: maxReceiveConnectionFlowControlWindow,
+ CreatePaths: config.CreatePaths,
}
}
TLDR: The value of CreatePaths
in the Config is not forwarded in populateServerConfig
meaning that the current implementation does not allow the server to enable path advertisement no matter what value is passed in via config in the Listen*
functions.
I followed the instruction and I met this error when I ran go get -t -u ./..
in the directroy of ~/go/src/github.com/lucas-clemente/quic-go
directory "/root/go/src/github.com/lucas-clemente" is not using a known version control system
has anyone met with that problem? Could you teach me how to fix that? Thanks in advance. : )
Hello,
I found your excellent job in MlitipathTester,which support ios OS,I'm curious if MPQUIC can be used in Android?
I was trying to build mp-quic repo and on the official site, mininet vm is already given with all the dependencies installed. I tried to install from the link http://onlab.vicci.org/mininet-vm/mininet-2.2.1-150420-ubuntu-14.04-server-amd64.zip.
Can someone tell me if the link is still working?
1.from ‘setup()’
` // Initial PathID is 0
// PathIDs of client-initiated paths are even
// those of server-initiated paths odd
if pm.sess.perspective == protocol.PerspectiveClient {
pm.nxtPathID = 1
} else {
pm.nxtPathID = 2
}
`
2.from ‘createPathFromRemote(p *receivedPacket)’
` // Sanity check: odd is client initiated, even for server initiated
if pm.sess.perspective == protocol.PerspectiveClient && pathID%2 != 0 {
return nil, errors.New("server tries to create odd pathID")
}
if pm.sess.perspective == protocol.PerspectiveServer && pathID%2 == 0 {
return nil, errors.New("client tries to create even pathID")
}
`
So who created the odd numbered paths and who created the even numbered paths?
Hello, everyone! I want to reproduce the environment in the real machine. However, when I tested the performance of the handover, I met an error like this:
panic: NetworkIdleTimeout: No recent network activity
Due to this error, the QUIC connection was always closed. However, even if the client connects two paths, when one of the paths is canceled, the connection fails again!
Could everyone help me? Thanks in advance!
Hello,
We've used this project to do some experiments,if client and server both with 2 interfaces communicate with each other with MPQUIC,client and server can only get one address of each other,so there's a problem establishing paths,it would be great if you reply me this question.
(server) h1 can only get address 10.0.2.2 of h2 (client),but cannot get 10.0.3.2.Same situation of h2.
Hello,
I am following the installation guide provided here ( https://multipath-quic.org/2017/12/09/artifacts-available.html ). However, I am getting some errors. Let me share them step by step:
First, I have go installed in the required 1.9 version:
delia@vm:~$ go version
go version go1.9.2 linux/amd64
Then, I try to get the github repo and I already get some errors. I don't know if I am supposed to have some requirements pre-installed:
delia@vm:~$ go get github.com/lucas-clemente/quic-go
package github.com/onsi/ginkgo/v2/ginkgo: cannot find package "github.com/onsi/ginkgo/v2/ginkgo" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/ginkgo (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/ginkgo (from $GOPATH)
package net/netip: unrecognized import path "net/netip" (import path does not begin with hostname)
package slices: unrecognized import path "slices" (import path does not begin with hostname)
package golang.org/x/sys/cpu: C source files not allowed when not using cgo or SWIG: cpu_gccgo_x86.c
package go.uber.org/mock/mockgen: import "go.uber.org/mock/mockgen" is a program, not an importable package
package golang.org/x/net/ipv4: found packages ipv4 (batch.go) and main (gen.go) in /home/delia/go/src/golang.org/x/net/ipv4
package golang.org/x/net/ipv6: found packages ipv6 (batch.go) and main (gen.go) in /home/delia/go/src/golang.org/x/net/ipv6
package golang.org/x/sys/unix: found packages unix (affinity_linux.go) and main (mkasm.go) in /home/delia/go/src/golang.org/x/sys/unix
But well, I continue and go to branch conext17
delia@vm:~$ cd ~/go/src/github.com/lucas-clemente/quic-go
delia@vm:~/go/src/github.com/lucas-clemente/quic-go$ git remote add mp-quic https://github.com/qdeconinck/mp-quic.git
delia@vm:~/go/src/github.com/lucas-clemente/quic-go$ git fetch mp-quic
remote: Enumerating objects: 108, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 108 (delta 16), reused 17 (delta 16), pack-reused 88
Receiving objects: 100% (108/108), 142.86 KiB | 1.06 MiB/s, done.
Resolving deltas: 100% (23/23), completed with 14 local objects.
From https://github.com/qdeconinck/mp-quic
* [new branch] conext17 -> mp-quic/conext17
* [new branch] gh-pages -> mp-quic/gh-pages
delia@vm:~/go/src/github.com/lucas-clemente/quic-go$ git checkout conext17
branch 'conext17' set up to track 'mp-quic/conext17'.
Switched to a new branch 'conext17'
And finally, go get cannot finish due to multiple errors.
delia@vm:~/go/src/github.com/lucas-clemente/quic-go$ go get -t -u ./...
package crypto/ecdh: unrecognized import path "crypto/ecdh" (import path does not begin with hostname)
package github.com/hashicorp/golang-lru/v2/simplelru: cannot find package "github.com/hashicorp/golang-lru/v2/simplelru" in any of:
/usr/local/go/src/github.com/hashicorp/golang-lru/v2/simplelru (from $GOROOT)
/home/delia/go/src/github.com/hashicorp/golang-lru/v2/simplelru (from $GOPATH)
package github.com/onsi/ginkgo/v2/formatter: cannot find package "github.com/onsi/ginkgo/v2/formatter" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/formatter (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/formatter (from $GOPATH)
package github.com/onsi/ginkgo/v2/internal: cannot find package "github.com/onsi/ginkgo/v2/internal" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/internal (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/internal (from $GOPATH)
package github.com/onsi/ginkgo/v2/internal/global: cannot find package "github.com/onsi/ginkgo/v2/internal/global" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/internal/global (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/internal/global (from $GOPATH)
package github.com/onsi/ginkgo/v2/internal/interrupt_handler: cannot find package "github.com/onsi/ginkgo/v2/internal/interrupt_handler" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/internal/interrupt_handler (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/internal/interrupt_handler (from $GOPATH)
package github.com/onsi/ginkgo/v2/internal/parallel_support: cannot find package "github.com/onsi/ginkgo/v2/internal/parallel_support" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/internal/parallel_support (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/internal/parallel_support (from $GOPATH)
package github.com/onsi/ginkgo/v2/internal/testingtproxy: cannot find package "github.com/onsi/ginkgo/v2/internal/testingtproxy" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/internal/testingtproxy (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/internal/testingtproxy (from $GOPATH)
package github.com/onsi/ginkgo/v2/reporters: cannot find package "github.com/onsi/ginkgo/v2/reporters" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/reporters (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/reporters (from $GOPATH)
package github.com/onsi/ginkgo/v2/types: cannot find package "github.com/onsi/ginkgo/v2/types" in any of:
/usr/local/go/src/github.com/onsi/ginkgo/v2/types (from $GOROOT)
/home/delia/go/src/github.com/onsi/ginkgo/v2/types (from $GOPATH)
package golang.org/x/net/html/atom: found packages atom (atom.go) and main (gen.go) in /home/delia/go/src/golang.org/x/net/html/atom
package golang.org/x/text/encoding/internal/identifier: import "golang.org/x/text/encoding/internal/identifier" is a program, not an importable package
package golang.org/x/text/encoding/charmap: found packages charmap (charmap.go) and main (maketables.go) in /home/delia/go/src/golang.org/x/text/encoding/charmap
package golang.org/x/text/encoding/htmlindex: import "golang.org/x/text/encoding/htmlindex" is a program, not an importable package
package golang.org/x/text/unicode/bidi: found packages bidi (bidi.go) and main (gen.go) in /home/delia/go/src/golang.org/x/text/unicode/bidi
package golang.org/x/text/unicode/norm: found packages norm (composition.go) and main (maketables.go) in /home/delia/go/src/golang.org/x/text/unicode/norm
package golang.org/x/net/http2/hpack: found packages hpack (encode.go) and main (gen.go) in /home/delia/go/src/golang.org/x/net/http2/hpack
package io/fs: unrecognized import path "io/fs" (import path does not begin with hostname)
Is this a known issue or I am missing something?
Have you considered other congestion control algorithms? Like LIA and BALIA
I run MPQUIC on two real machines,but only one path working.I tested on mininet with one network interface ,but there were two pathes.I wonder if there's any solution.Thanks a lot!
[root@localhost client]# go run main.go https://liyanjunlab.vip:6121
GET https://liyanjunlab.vip:6121
Created pconn_manager, any on [::]:55716
Starting new connection to liyanjunlab.vip ([::]:55716 -> 192.168.237.150:6121), connectionID 9e94571b99992a51, version 512
Sending CHLO:
SNI : "liyanjunlab.vip"
VER : "Q512"
CCS : "\x01\xe8\x81`\x92\x92\x1a\xe8~퀆\xa2\x15\x82\x91"
MSPC: "d\x00\x00\x00"
PDMD: "X509"
ICSL: "\x1e\x00\x00\x00"
MIDS: "d\x00\x00\x00"
CFCW: "\x00\xc0\x00\x00"
SFCW: "\x00\x80\x00\x00"
PAD : (893 bytes)
-> Sending packet 0x1 (1069 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
Dequeueing handshake retransmission for packet 0x1
-> Sending packet 0x2 (1072 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x2, PacketNumberLen: 0x2}
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
Dequeueing handshake retransmission for packet 0x2
-> Sending packet 0x3 (1072 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x3, PacketNumberLen: 0x2}
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
Queueing packet 0x3 for retransmission (RTO), 1 outstanding
Dequeueing handshake retransmission for packet 0x3
-> Sending packet 0x4 (1072 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x4, PacketNumberLen: 0x2}
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
-> Sending packet 0x5 (33 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Queueing packet 0x4 for retransmission (RTO), 2 outstanding
Queueing packet 0x5 for retransmission (RTO), 1 outstanding
Dequeueing handshake retransmission for packet 0x4
-> Sending packet 0x6 (1072 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x6, PacketNumberLen: 0x2}
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
Dequeueing handshake retransmission for packet 0x5
-> Sending packet 0x7 (36 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x6, PacketNumberLen: 0x2}
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
-> Sending packet 0x8 (33 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Queueing packet 0x6 for retransmission (RTO), 3 outstanding
Queueing packet 0x7 for retransmission (RTO), 2 outstanding
Queueing packet 0x8 for retransmission (RTO), 1 outstanding
Dequeueing handshake retransmission for packet 0x6
-> Sending packet 0x9 (1072 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x9, PacketNumberLen: 0x2}
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
Dequeueing handshake retransmission for packet 0x7
-> Sending packet 0xa (36 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x9, PacketNumberLen: 0x2}
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Dequeueing handshake retransmission for packet 0x8
-> Sending packet 0xb (36 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0x9, PacketNumberLen: 0x2}
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
-> Sending packet 0xc (33 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Queueing packet 0x9 for retransmission (RTO), 4 outstanding
Queueing packet 0xa for retransmission (RTO), 3 outstanding
Queueing packet 0xb for retransmission (RTO), 2 outstanding
Queueing packet 0xc for retransmission (RTO), 1 outstanding
Dequeueing handshake retransmission for packet 0x9
-> Sending packet 0xd (1072 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0xd, PacketNumberLen: 0x2}
-> &wire.StreamFrame{StreamID: 1, FinBit: false, Offset: 0x0, Data length: 0x410, Offset + Data length: 0x410}
Dequeueing handshake retransmission for packet 0xa
-> Sending packet 0xe (36 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0xd, PacketNumberLen: 0x2}
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Dequeueing handshake retransmission for packet 0xb
-> Sending packet 0xf (36 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0xd, PacketNumberLen: 0x2}
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Dequeueing handshake retransmission for packet 0xc
-> Sending packet 0x10 (36 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.StopWaitingFrame{LeastUnacked: 0xd, PacketNumberLen: 0x2}
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
-> Sending packet 0x11 (33 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.PathsFrame{MaxNumPaths:0xff, NumPaths:0x1, PathIDs:[]protocol.PathID{0x0}, RemoteRTTs:[]time.Duration{3600000000000}}
Closing session with error: HandshakeTimeout: Crypto handshake did not complete in time.
-> Sending packet 0x12 (76 bytes) for connection 9e94571b99992a51 on path 0, unencrypted
-> &wire.ConnectionCloseFrame{ErrorCode:0x43, ReasonPhrase:"Crypto handshake did not complete in time."}
Connection 9e94571b99992a51 closed.
panic: Get "https://liyanjunlab.vip:6121": HandshakeTimeout: Crypto handshake did not complete in time.
goroutine 6 [running]:
main.main.func1(0xc000075170, 0xc000022334, 0x7ffe40e357fd, 0x1c)
/usr/local/gopath/src/github.com/lucas-clemente/quic-go/example/client/main.go:56 +0x2f9
created by main.main
/usr/local/gopath/src/github.com/lucas-clemente/quic-go/example/client/main.go:53 +0x3ba
exit status 2
in your paper,I found that you said “it is possible to send ack frame over different paths”.However,I didn't find such packages in my log. Is this function realized?or how can i confirm it?
Hello,
I’m writing an MPQUIC client-server connection using Golang in a Mininet environment. I want to forward a file from the server to the client, so I send the whole stream over the connection and I create a buffer to read data from the stream and store it to the received file.
Everything went well until I added loss/delay options to the Mininet environment. Although the loss was only 1%, the number of packet losses was bigger than what was expected. Sometimes I lose more than half of the amount of data. I don’t know where the problem is exactly? Maybe the MPQUIC protocol and Mininet’s way of simulating package loss and delay do not go well together. If yes, could you please direct me to the right software that can be more efficient than Mininet?
I have 2 paths, one the one to my router (192.168.0.X) and other one to a virtual machine that gives an error when trying to write to it.
The problem is that although the first path (the one to my router) is working properly, when the second path fails the entire connection is dropped. If a path fails it should only be cleared from that connection, and fail the entire connection only when all paths fail.
In this case the problem is obvious, but a socket write could fail for a lot of reasons, so I guess it must be handled properly.
Hello,
I am using the MPQUIC implementation extracted from the VM in physical computers. It works in both computers if I use mininet, however, if I want to use it between the two computers it does not create multiple paths and I am not sure why since I am replicating the environment in mininet.
In mininet, I have a client and a server. The client has this routes:
default via 10.0.0.2 dev client-eth0
10.0.0.0/8 dev client-eth0 proto kernel scope link src 10.0.0.1
11.0.0.0/8 dev client-eth1 proto kernel scope link src 11.0.0.1
The server has this routes:
default via 100.0.0.2 dev server-eth0
100.0.0.0/8 dev server-eth0 proto kernel scope link src 100.0.0.1
I am using a code for sending a file in .go and if I capture the conversation, I see both paths being created (even if one is under used):
I am taking the same code but to a real network and now it is not working anymore. I have a client computer with this routes:
default via 10.51.0.10 dev enx32cf238b3519 proto dhcp src 10.51.0.9 metric 104
10.48.0.140/30 dev enx52277ba0b7d5 proto kernel scope link src 10.48.0.142 metric 105
10.51.0.8/30 dev enx32cf238b3519 proto kernel scope link src 10.51.0.9 metric 104
And a server computer with this routes:
default via 10.11.23.1 dev ens160 proto static metric 102
10.11.23.0/24 dev ens160 proto kernel scope link src 10.11.23.229 metric 102
However, if I use the same server-client code in .go, I only see the creation of one path
I am not sure why is this happening. I have some assumptions but I am not sure why. I have tried modifing the routes and also having a second ip address in the server but it is not working. I also wonder if there is a way to control the paths in mpquic other than
quicConfig := &quic.Config{
CreatePaths: true,
}
Because I guess than if I can control the creation of paths directly in the code I might fix this...
By the way, I obviously have connectivity from both interfaces of the client to the server:
$ ping 10.11.23.229 -I enx32cf238b3519
PING 10.11.23.229 (10.11.23.229) from 10.51.0.9 enx32cf238b3519: 56(84) bytes of data.
64 bytes from 10.11.23.229: icmp_seq=1 ttl=61 time=15.9 ms
^C
--- 10.11.23.229 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 15.863/15.863/15.863/0.000 ms
$ ping 10.11.23.229 -I enx52277ba0b7d5
PING 10.11.23.229 (10.11.23.229) from 10.48.0.142 enx52277ba0b7d5: 56(84) bytes of data.
64 bytes from 10.11.23.229: icmp_seq=1 ttl=61 time=16.0 ms
^C
--- 10.11.23.229 ping statistics ---
Hi
I cant install the server on Linux(fedora 27 /debian 9) 64bit. I use Version 1.9.4 of Go.
If i clone the git repository then enter the directory and finally execute go get -t -u ./... I get the error:
unrecognized import path "_/home/test/Downloads/mp-quic" (import path does not begin with hostname)
I also tried to follow the instructions on https://multipath-quic.org/2017/12/09/artifacts-available.html. But here i always got
[root@localhost quic-go]# go get -t -u ./...
# github.com/lucas-clemente/quic-go/internal/handshake
internal/handshake/mint_utils.go:57:16: mc.conn.State undefined (type *mint.Conn has no field or method State, but does have mint.state)
Like i said i tried it on two different distributions with Go 1.9.4 and i tested those two scenarios.
I am very new to this and would like to know how to implement mpquic in a mininet sample topology?
I followed the instructions and when I started to run the .py file saved in the /minitopo-experiences/experiences files. I got the error:
AttributeError: 'ExperienceLauncher' object has no attribute 'num'
I used python quicreqres_test.py
。
I don't know how to fix that. If anyone has met with that problem, could you teach me how to fix that? Thanks in advance: -)
I tried different ways to install MPQuic, but were not successful. How can I install MPQuic? and what version of quic-go is compatible?
I tried this tutorial
https://multipath-quic.org/2017/12/09/artifacts-available.html
but when I try "go get -t -u ./..."
I get error
package golang.org/x/net/lex/httplex: cannot find package "golang.org/x/net/lex/httplex" in any of: /usr/local/go/src/golang.org/x/net/lex/httplex (from $GOROOT) /home/thomas/go/src/golang.org/x/net/lex/httplex (from $GOPATH)
So, I change this files request_writer.go and roundtrip.go
"golang.org/x/net/lex/httplex" ==> "golang.org/x/net/http/httpguts"
And when I try again "go get -t -u ./..."
I got this error:
github.com/lucas-clemente/quic-go/internal/crypto internal/crypto/key_derivation.go:47:60: cs.KeyLen undefined (type mint.CipherSuiteParams has no field or method KeyLen) internal/crypto/key_derivation.go:48:58: cs.IvLen undefined (type mint.CipherSuiteParams has no field or method IvLen)
Hello, Quentin De, Thanks for your excellent work! I want to reproduce your result with your VM zip files! However, I do not know how to set up the client VM and the server VM for running a script (for instance quic_mptcp_https_tests_expdes_wsp_lowbdp_quic.py), just like you said in the link-https://multipath-quic.org/2017/12/09/artifacts-available.html. Would you please tell me how to run the test code? if anyone has successfully run these test files, please help me! Thanks a lot!
Hi! Today when I was trying the echo example, I was thinking if I can change it little and transfer files from one vm one PC to vm on another PC. I set up the provided virtual machine one each side and configure the routing table. But every time I try to transfer some big files, it encounters this error:
I also try to set CreatePath = false, then I can transfer the files successfully. Please, anyone knows how to figure this out?
Thanks for helping :)
I'm interested in integrating MP-QUIC with Chrome so that I can test out the protocols performance with HD video streaming.
Would this be possible without a lot of changes?
Thanks, and sorry if this is a vague question.
I want to install MPQUIC in a real environment instead of in Mininet.Has anyone finished installing MPQUIC in a real environment successfully?
$go run example/client/main.go https://clemente.io
GET https://clemente.io
Starting new connection to clemente.io ([::]:36759 -> 18.65.116.106:443), connectionID fae96b208619c577, version 512
Closing session with error: HandshakeTimeout: Crypto handshake did not complete in time.
Connection fae96b208619c577 closed.
panic: Get https://clemente.io: HandshakeTimeout: Crypto handshake did not complete in time.
goroutine 5 [running]:
main.main.func1(0xc420067290, 0xc420012660, 0x7ffceead91f1, 0x13)
/home/frank/go/src/github.com/lucas-clemente/quic-go/example/client/main.go:56 +0x312
created by main.main
/home/frank/go/src/github.com/lucas-clemente/quic-go/example/client/main.go:53 +0x332
exit status 2
These are available quic-go releases,
https://github.com/lucas-clemente/quic-go/releases
but none can support this repository on mininet.
If I use 0.24.0, logs are:
mpquic1 imports
github.com/lucas-clemente/quic-go/ackhandler: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/ackhandler
mpquic1 imports
github.com/lucas-clemente/quic-go/congestion: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/congestion
mpquic1 imports
github.com/lucas-clemente/quic-go/internal/crypto: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/internal/crypto
mpquic1 imports
github.com/lucas-clemente/quic-go/qerr: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/qerr
mpquic1/example imports
github.com/lucas-clemente/quic-go/h2quic: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/h2quic
mpquic1 tested by
mpquic1.test imports
github.com/lucas-clemente/quic-go/internal/mocks/mocks_fc: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/internal/mocks/mocks_fc
mpquic1/benchmark tested by
mpquic1/benchmark.test imports
github.com/lucas-clemente/quic-go/integrationtests/tools/testlog: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/integrationtests/tools/testlog
mpquic1/integrationtests/chrome tested by
mpquic1/integrationtests/chrome.test imports
github.com/lucas-clemente/quic-go/integrationtests/tools/testserver: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/integrationtests/tools/testserver
If I use 0.6.0, logs are:
mpquic1 tested by
mpquic1.test imports
github.com/lucas-clemente/quic-go/internal/mocks/mocks_fc: module github.com/lucas-clemente/quic-go@latest found (v0.24.0, replaced by github.com/lucas-clemente/[email protected]), but does not contain package github.com/lucas-clemente/quic-go/internal/mocks/mocks_fc
mpquic1/example imports
github.com/lucas-clemente/quic-go/h2quic imports
golang.org/x/net/lex/httplex: module golang.org/x/net@latest found (v0.0.0-20211216030914-fe4d6282115f), but does not contain package golang.org/x/net/lex/httplex
The middle versions behave just the same.
My go version is 1.16.12
Could the developers provide the version of quic-go they used for the experiment?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.