[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