Closed synctext closed 2 months ago
For the task to get the uTP transfer going, should we just make a completely fresh project and somehow already integrate it into the current project?
uTP Thesis - link
First task, get uTP working, minimal changes. No superapp integration yet.
Sprint goal this week: structural measurement table of uTP. read example table Quality of networking protocol determines the performance. Read background thesis with details investigate tc utility, or netem wrapper
Measurement environment with packet loss and latency with reproducible performance test. One script to produce the example table with various conditions: 2 laptop and 1% packet loss rate
MICROS_WAIT_BURST
is only parameter being changedFROM python:3.8-alpine
RUN apk add iproute2 vim iputils-ping python3 py3-pip openjdk11 bash
ToDo:
Varying Package size/mode
Skipped packages needed before fast retransmit
Target Delay of Congestion Control
Test performed with 1% package loss under 250 ms latency, transfer speed taken as average of 10 runs
Benchmark Program Location: https://github.com/iiljkic/utp4j/blob/master/src/main/java/net/utp4j/examples/configtest/ConfigTestWrite.java
We've actually contacted the author of the utp4j library and he personally suggested to rewrite it from scratch. Main reasons being code quality issues and being in quite experimental state.
Still in the contact about some other details, but this was his main reply about the maintenance/taking over the project. -- EDIT: After further conversation, the author agreed to transfer ownership (to me for now)
Current versions:
Current week progress update:
Current view in the app:
Week Update:
Starting off this week updates:
Attempted to implement sending over IPv8 socket
Current app version: apk
Callum: Was sick for most of last week so will need to do some catching up the upcoming week(s). Some issues getting our forked repositories working based on space issues with my laptop (Michals contributions), got it working for physical device so managed to get some front-end changes in. Will be looking to pick up the lost hours of last week in the upcoming week(s).
Weekly Update Benchmarking Team:
Benchmark results (performed on 4mB file): (Default parameters coloured blue) (Benchmark script: https://github.com/PieterCarton/UTPBenchmark/blob/186d5a8a10a0e6afb857330ed2d96cdbaac05663/benchmark.bash)
At 500ms delay, with 10ms jitter and 1% pkt loss
At 50ms delay, with 2ms jitter and 1% pkt loss
At 0ms delay with 1% pkt loss
max congestion window gain
seem to be optimised in simulations, not 4G and 5G networks.private void updateWindow()
function which contains lots of complexity ?
UDP socket()
! deep integration with IPv8 requires big stripping actionsend_binary()
. Make sure to re-try the initial request for a uTP transmission, if nobody is answering you.This week:
Week 6 Report Benchmarking team: Last week there were Prof. Pouwelse addressed some concerns about the complex piece of code that controls the congestion window
This week:
Current UI Design Proof of Concept:
For the next week:
The UI looks a bit rough. Need to keep working on it
The receive button is irrelevant, needs to removed, or hidden. The server for receiving is running all times
Separate port for UTP is used but there are still issues. Own public address/port not know, and there is reliable way to know if other peer is running UTP. One simplest option might be use third party to help bootstrap and discover UTP port. Any ideas, @qstokkink, what is the simplest and most elegant way to integrate UTP and IPv8?
Focus on the demo with an app for the next week.
The colours show the Pv8 status to see if peer is online.
Think how to combine two status of the peer: UTP and IPv8
Start working on the documentation.
@qstokkink, what is the simplest and most elegant way to integrate UTP and IPv8?
These are two opposites. The simple way is not elegant and the elegant way is not simple.
First, the difficult/elegant way would be to have channel separation for control logic and data streaming. You would have to puncture the NAT in a separate community with a separate socket and "hand off" this socket to your uTP streaming protocol. In a fantasy world, this would be on a separate physical channel as well (but this is obviously not realistic for consumer connections). You would need to use some form of DHT to couple the peer identity in the streaming community to the identity in your control logic community.
Second, the simple way: create a new IPv8 message to wrap your uTP packets. You will not get optimal performance, you will hinder other communities, and you will not have nice logical separation.. but it works 🤷 If your goal is to "just get something running", pick this option.
@qstokkink
I think that still the "difficult" solution would be actually easier if we're supposed to reuse the library code. As right now all the socket stuff, threads and listeners are quite coupled with the logic of uTP making it hard to just reuse the existing IPv8 socket. I've already attempted it and made quite a bit of progress, but still there would need to be quite a lot of refactoring required in the library to actually get it working well, which then makes it even less sense to use the library and probably just better to rewrite it from scratch with the separation (due to other known issues).
For now I was able to get the separate socket and everything working on local networks only reusing the IPv8 to exchange status messages about file transfer request and other metadata, then the separate socket is used to actually send binary data. I'm now considering what would be the way to actually properly get the NAT puncture to work. Do you have any suggestion on what to use for it to work in a simple way? I don't think it's possible to somehow open another port with the existing p2p connection, we'd still have to use 3rd party to establish the external ports and that's what I'm currently considering.
Weekly update:
introduction-request
message trigger 3 packet transfers (DoS :-1:).Here is the demo of how it looks at the moment, as soon as we receive a package from one of these peers, the status indicator should turn to green. Red: status idle Orange: sent Green: received.
Post-meeting notes: These will be changed to the following: Sent without ack: yellow Sent with ack: Green More than a minute without communication: yellow More than 3 minutes without communication: red
This week progress:
Great progress. The apk is working with speed up to 1 MB/s
For next week:
Download APK here.
For documented details regarding the app usage, click here.
For documented details regarding benchmarking done over the course time, click here.
For documented details on relevant changes and benchmarking, click here.
For more documented details about the uTP integration, click here
Project assignment for Delft University of Technology master course called "blockchain engineering". Democracy-1: Blockchain networking
Replay historical voting rounds on the live network. Emulate 10..50 identities from a single smartphone.Understand and re-use existing ready-to-go datasets with DAO votes.Create transaction blocks within Trustchain in a custom IPv8 community using Kotlin superappBackground reading:
Upcoming sprint assignment