[RFC] Implementing an additional TCP congestion control algorithm (TCP-PR)
michi1 at michaelblizek.twilightparadox.com
michi1 at michaelblizek.twilightparadox.com
Mon Aug 17 15:32:58 EDT 2015
Hi!
On 16:41 Sun 16 Aug , Richard Sailer wrote:
> Hi,
>
> > If reordering causes TCP to believe packets are lost, there will
> > probably be other issues as well, like sending of useless retransmits. I would
> > rather try to detect this kind of reordering and ignore dupacks and rely only
> > on timeouts to detect loss.
> Well this is exactly how TCP-PR works :).
> But maybe this misunderstanding is my fault for writing a much to long
> and detailed mail. I will try to write shorter mails in future.
>
> == About: Doing this inside Congestion control (CC) ==
>
> Well I think sending retransmit is part of CC.
> Strictly CC is "everything done to adapt the amount of data sent to the
> transmission capacity of the network". But I'm not entirely sure if
> saying retransmission is part of this is 100% correct.
>
> Well in the end practically it doesn't matter how one classifies the
> "not sending of retransmits" it has to be implemented.
This is what confused me: To me congestion control is only about adapting
the send speed.
> And from an implementation point of view I think you are right.
> None of the existing CC modules interferes with reacting on DUPACKs
> or sending retransmits.
> Also looking at the function pointer interface for modules
> /tcp_congestion_ops/ :
>
> struct tcp_congestion_ops {
> struct list_head list;
> u32 key;
> u32 flags;
>
> /* initialize private data (optional) */
> void (*init)(struct sock *sk);
> /* cleanup private data (optional) */
> void (*release)(struct sock *sk);
>
> /* return slow start threshold (required) */
> u32 (*ssthresh)(struct sock *sk);
> /* do new cwnd calculation (required) */
> void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked);
> /* call before changing ca_state (optional) */
> void (*set_state)(struct sock *sk, u8 new_state);
> /* call when cwnd event occurs (optional) */
> void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
> /* call when ack arrives (optional) */
> void (*in_ack_event)(struct sock *sk, u32 flags);
> /* new value of cwnd after loss (optional) */
> u32 (*undo_cwnd)(struct sock *sk);
> /* hook for packet ack accounting (optional) */
> void (*pkts_acked)(struct sock *sk, u32 num_acked, s32 rtt_us);
> /* get info for inet_diag (optional) */
> size_t (*get_info)(struct sock *sk, u32 ext, int *attr,
> union tcp_cc_info *info);
>
> char name[TCP_CA_NAME_MAX];
> struct module *owner;
> };
>
> doesn't look that promising.
> Well there is (*cwnd_event) which be meaningfull in
> "not reducing cwnd after a retransmission has been sent"
> and perhaps even for "not stopping the timer".
> But I'm not sure if sending retransmit packets can be prevented
> from here.
> Currently it looks like I will have to make some further parts
> of tcp_input.c and tcp_output.c available for CC modules.
> But I have to look deeper into this the next few days to know and do
> this for sure.
This is what I meant when I said congestion control is probably not what you
want to mess with.
-Michi
--
programing a layer 3+4 network protocol for mesh networks
see http://michaelblizek.twilightparadox.com
More information about the Kernelnewbies
mailing list