Previously TLP may send multiple probes of new data in one flight. This happens when the sender is cwnd limited. After the initial TLP containing new data is sent, the sender receives another ACK that acks partial inflight. It may re-arm another TLP timer to send more, if no further ACK returns before the next TLP timeout (PTO) expires. The sender may send in theory a large amount of TLP until send queue is depleted. This only happens if the sender sees such irregular uncommon ACK pattern. But it is generally undesirable behavior during congestion especially. The original TLP design restrict only one TLP probe per inflight as published in "Reducing Web Latency: the Virtue of Gentle Aggression", SIGCOMM 2013. This patch changes TLP to send at most one probe per inflight. Note that if the sender is app-limited, TLP retransmits old data and did not have this issue.
Showing the changes to include/linux (1 of 3 files). Show all
Unified · Split
| @@ -220,7 +220,9 @@ struct tcp_sock { · 219 unmodified lines | ||
| 220 | 220 | } rack; |
| 221 | 221 | u16 advmss; /* Advertised MSS */ |
| 222 | 222 | u8 compressed_ack; |
| 223 | − u8 dup_ack_counter; | |
| 223 | + u8 dup_ack_counter:2, | |
| 224 | + tlp_retrans:1, /* TLP is a retransmission */ | |
| 225 | + unused:5; | |
| 224 | 226 | u32 chrono_start; /* Start time in jiffies of a TCP chrono */ |
| 225 | 227 | u32 chrono_stat[3]; /* Time in jiffies for chrono_stat stats */ |
| 226 | 228 | u8 chrono_type:2, /* current chronograph type */ |
| @@ -243,7 +245,7 @@ struct tcp_sock { · 16 unmodified lines | ||
| 243 | 245 | save_syn:1, /* Save headers of SYN packet */ |
| 244 | 246 | is_cwnd_limited:1,/* forward progress limited by snd_cwnd? */ |
| 245 | 247 | syn_smc:1; /* SYN includes SMC */ |
| 246 | − u32 tlp_high_seq; /* snd_nxt at the time of TLP retransmit. */ | |
| 248 | + u32 tlp_high_seq; /* snd_nxt at the time of TLP */ | |
| 247 | 249 | |
| 248 | 250 | u32 tcp_tx_delay; /* delay (in usec) added to TX packets */ |
| 249 | 251 | u64 tcp_wstamp_ns; /* departure time for next sent data packet */ |