Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Feb 2016 20:26:26 +0900
From:      Yongmin Cho <yongmincho82@gmail.com>
To:        transport@freebsd.org
Subject:   In TCP recovery state, problem of computing the pipe(amount of data in flight).
Message-ID:  <20160225112625.GA5680@yongmincho-All-Series>

next in thread | raw e-mail | index | archive | help
Hi, all.

I have a question about net.inet.tcp.rfc6675_pipe in sysctl.
The bytes in flight was changed to be like below in r290122.
pipe = snd_max - snd_una - sackhint.sacked_bytes +
sackhint.sack_bytes_rexmit.
I think, The implementation of sackhint.sack_bytes_rexmit is right.
But, I don't think, sackhint.sacked_bytes is right way.
The sackhint.sacked_bytes is computed by array of sack_blocks in
tcp_sack_doack function.
You know, tcp header can have four sacked blocks.
(If tcp uses timestmap option, tcp header can have three sacked
blocks.)
Even if The receiver has sacked blocks greater than three or four,
The receiver can send ack with three or four last sack blocks.
So if the receiver has many sacked blocks, the sender only knows three
sacked_bytes.
the snd_holes tail queue in struct tcpcb has all of sack holes which
is greater than snd_una.
So, i think, sack_bytes_rexmit is correct.
Because sack_bytes_rexmit is computed by snd_holes tail queue in
struct tcpcb.
but sackhint.sacked_bytes is too small.
Because sackhint.sacked_bytes is just computed by ack with three or
four last sacked blocks.
So, the return value of tcp_compute_pipe() function is too big, while
recovery phase.
In recovery state, the sender can send data,
if the return value of tcp_compute_pipe() should be less than
snd_ssthresh.
Sometimes it takes a long time to send data, if the sender knows many
sack holes.
Furthermore, Sometimes the sender can't send data, Because the return
value of tcp_compute_pipe() function.
And retransmission timeout is triggered.

IMO, sackhint.sack_bytes should be computed using snd_holes tail
queue.
Because snd_holes has all of sack holes which is greater than snd_una,
sackhint.sack_bytes can be computed using snd_holes.

Please check my opinion.

I'm sorry, I'm not good at english.
Thank you in advance your answers.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20160225112625.GA5680>