@@ -2073,20 +2073,20 @@ impl<'a> Socket<'a> {
2073
2073
2074
2074
// Handle delayed acks
2075
2075
if let Some ( ack_delay) = self . ack_delay {
2076
- if self . ack_to_transmit ( ) || self . window_to_update ( ) {
2076
+ if self . ack_to_transmit ( ) {
2077
2077
self . ack_delay_timer = match self . ack_delay_timer {
2078
2078
AckDelayTimer :: Idle => {
2079
2079
tcp_trace ! ( "starting delayed ack timer" ) ;
2080
-
2081
2080
AckDelayTimer :: Waiting ( cx. now ( ) + ack_delay)
2082
2081
}
2083
- // RFC1122 says "in a stream of full-sized segments there SHOULD be an ACK
2084
- // for at least every second segment".
2085
- // For now, we send an ACK every second received packet, full-sized or not.
2086
- AckDelayTimer :: Waiting ( _) => {
2082
+ AckDelayTimer :: Waiting ( _) if self . immediate_ack_to_transmit ( ) => {
2087
2083
tcp_trace ! ( "delayed ack timer already started, forcing expiry" ) ;
2088
2084
AckDelayTimer :: Immediate
2089
2085
}
2086
+ timer @ AckDelayTimer :: Waiting ( _) => {
2087
+ tcp_trace ! ( "waiting until delayed ack timer expires" ) ;
2088
+ timer
2089
+ }
2090
2090
AckDelayTimer :: Immediate => {
2091
2091
tcp_trace ! ( "delayed ack timer already force-expired" ) ;
2092
2092
AckDelayTimer :: Immediate
@@ -2199,6 +2199,24 @@ impl<'a> Socket<'a> {
2199
2199
}
2200
2200
}
2201
2201
2202
+ /// Return whether to send ACK immediately due to the amount of unacknowledged data.
2203
+ ///
2204
+ /// RFC 9293 states "An ACK SHOULD be generated for at least every second full-sized segment or
2205
+ /// 2*RMSS bytes of new data (where RMSS is the MSS specified by the TCP endpoint receiving the
2206
+ /// segments to be acknowledged, or the default value if not specified) (SHLD-19)."
2207
+ ///
2208
+ /// Note that the RFC above only says "at least 2*RMSS bytes", which is not a hard requirement.
2209
+ /// In practice, we follow the Linux kernel's empirical value of sending an ACK for every RMSS
2210
+ /// byte of new data. For details, see
2211
+ /// <https://elixir.bootlin.com/linux/v6.11.4/source/net/ipv4/tcp_input.c#L5747>.
2212
+ fn immediate_ack_to_transmit ( & self ) -> bool {
2213
+ if let Some ( remote_last_ack) = self . remote_last_ack {
2214
+ remote_last_ack + self . remote_mss < self . remote_seq_no + self . rx_buffer . len ( )
2215
+ } else {
2216
+ false
2217
+ }
2218
+ }
2219
+
2202
2220
/// Return whether we should send ACK immediately due to significant window updates.
2203
2221
///
2204
2222
/// ACKs with significant window updates should be sent immediately to let the sender know that
@@ -7493,15 +7511,15 @@ mod test {
7493
7511
}
7494
7512
7495
7513
#[ test]
7496
- fn test_delayed_ack_every_second_packet ( ) {
7497
- let mut s = socket_established ( ) ;
7514
+ fn test_delayed_ack_every_rmss ( ) {
7515
+ let mut s = socket_established_with_buffer_sizes ( DEFAULT_MSS * 2 , DEFAULT_MSS * 2 ) ;
7498
7516
s. set_ack_delay ( Some ( ACK_DELAY_DEFAULT ) ) ;
7499
7517
send ! (
7500
7518
s,
7501
7519
TcpRepr {
7502
7520
seq_number: REMOTE_SEQ + 1 ,
7503
7521
ack_number: Some ( LOCAL_SEQ + 1 ) ,
7504
- payload: & b"abc" [ .. ] ,
7522
+ payload: & [ 0 ; DEFAULT_MSS - 1 ] ,
7505
7523
..SEND_TEMPL
7506
7524
}
7507
7525
) ;
@@ -7512,35 +7530,48 @@ mod test {
7512
7530
send ! (
7513
7531
s,
7514
7532
TcpRepr {
7515
- seq_number: REMOTE_SEQ + 1 + 3 ,
7533
+ seq_number: REMOTE_SEQ + 1 + ( DEFAULT_MSS - 1 ) ,
7516
7534
ack_number: Some ( LOCAL_SEQ + 1 ) ,
7517
- payload: & b"def " [ ..] ,
7535
+ payload: & b"a " [ ..] ,
7518
7536
..SEND_TEMPL
7519
7537
}
7520
7538
) ;
7521
7539
7522
- // Every 2nd packet, ACK is sent without delay.
7540
+ // No ACK is immediately sent.
7541
+ recv_nothing ! ( s) ;
7542
+
7543
+ send ! (
7544
+ s,
7545
+ TcpRepr {
7546
+ seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS ,
7547
+ ack_number: Some ( LOCAL_SEQ + 1 ) ,
7548
+ payload: & b"a" [ ..] ,
7549
+ ..SEND_TEMPL
7550
+ }
7551
+ ) ;
7552
+
7553
+ // RMSS+1 bytes of data has been received, so ACK is sent without delay.
7523
7554
recv ! (
7524
7555
s,
7525
7556
Ok ( TcpRepr {
7526
7557
seq_number: LOCAL_SEQ + 1 ,
7527
- ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
7528
- window_len: 58 ,
7558
+ ack_number: Some ( REMOTE_SEQ + 1 + ( DEFAULT_MSS + 1 ) ) ,
7559
+ window_len: ( DEFAULT_MSS - 1 ) as u16 ,
7529
7560
..RECV_TEMPL
7530
7561
} )
7531
7562
) ;
7532
7563
}
7533
7564
7534
7565
#[ test]
7535
- fn test_delayed_ack_three_packets ( ) {
7536
- let mut s = socket_established ( ) ;
7566
+ fn test_delayed_ack_every_rmss_or_more ( ) {
7567
+ let mut s = socket_established_with_buffer_sizes ( DEFAULT_MSS * 2 , DEFAULT_MSS * 2 ) ;
7537
7568
s. set_ack_delay ( Some ( ACK_DELAY_DEFAULT ) ) ;
7538
7569
send ! (
7539
7570
s,
7540
7571
TcpRepr {
7541
7572
seq_number: REMOTE_SEQ + 1 ,
7542
7573
ack_number: Some ( LOCAL_SEQ + 1 ) ,
7543
- payload: & b"abc" [ .. ] ,
7574
+ payload: & [ 0 ; DEFAULT_MSS ] ,
7544
7575
..SEND_TEMPL
7545
7576
}
7546
7577
) ;
@@ -7551,30 +7582,30 @@ mod test {
7551
7582
send ! (
7552
7583
s,
7553
7584
TcpRepr {
7554
- seq_number: REMOTE_SEQ + 1 + 3 ,
7585
+ seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS ,
7555
7586
ack_number: Some ( LOCAL_SEQ + 1 ) ,
7556
- payload: & b"def " [ ..] ,
7587
+ payload: & b"a " [ ..] ,
7557
7588
..SEND_TEMPL
7558
7589
}
7559
7590
) ;
7560
7591
7561
7592
send ! (
7562
7593
s,
7563
7594
TcpRepr {
7564
- seq_number: REMOTE_SEQ + 1 + 6 ,
7595
+ seq_number: REMOTE_SEQ + 1 + ( DEFAULT_MSS + 1 ) ,
7565
7596
ack_number: Some ( LOCAL_SEQ + 1 ) ,
7566
- payload: & b"ghi " [ ..] ,
7597
+ payload: & b"b " [ ..] ,
7567
7598
..SEND_TEMPL
7568
7599
}
7569
7600
) ;
7570
7601
7571
- // Every 2nd (or more) packet, ACK is sent without delay.
7602
+ // RMSS+2 bytes of data has been received, so ACK is sent without delay.
7572
7603
recv ! (
7573
7604
s,
7574
7605
Ok ( TcpRepr {
7575
7606
seq_number: LOCAL_SEQ + 1 ,
7576
- ack_number: Some ( REMOTE_SEQ + 1 + 9 ) ,
7577
- window_len: 55 ,
7607
+ ack_number: Some ( REMOTE_SEQ + 1 + ( DEFAULT_MSS + 2 ) ) ,
7608
+ window_len: ( DEFAULT_MSS - 2 ) as u16 ,
7578
7609
..RECV_TEMPL
7579
7610
} )
7580
7611
) ;
0 commit comments