[TCP]: question about counter in tcp_mark_head_lost
hi all, In tcp_mark_head_lost() fucntion, when sack enabled and fack disabled, why does the packet counter variable "cnt" increase only when current skb is marked as TCPCB_SACKED_ACKED? code: if (tcp_is_fack(tp) || tcp_is_reno(tp) || (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_ACKED)) cnt += tcp_skb_pcount(skb); Is this right ? I have a question when retransmition queue looks as below: sacked=0 --> sacked=SACK_ACKED --> sacked=0 --> sacked=SACK_ACKED then, when we call tcp_mark_head_lost(sk, 1, 0) this will mark the two skbs, which are previously marked 0 , as TCPCB_LOST. So, this function marks two skbs as lost, although we pass parameter "packets" as "1". I do not know why this function has this semantic , which is not consistent with its declaration. Can anyone explanation this, thanks in advance. ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
Re: [RFC] tcp: How does SACK or FACK determine the time to start fast retransmition?
于 2012/6/21 16:42, Vijay Subramanian 写道: > With SACK, number of dupacks does not have much meaning. What matters is > --how the SACK scoreboard looks like i.e. which packets are tagged > Lost/Sacked/Retransmitted > -- Whether FACK is in use (this assumes holes in between sacked > packets are lost and have left the network and so we can send out more > packets) > > So, stack does not count the number of dupacks that have come in. Only > SACK blocks matter. > You can try to track the following path: > tcp_ack() deals with incoming acks and if it sees a dupack (does not > matter what number), or incoming packet contains SACK it calls > tcp_fastretrans_alert() which calls tcp_xmit_retransmit_queue(). > > tcp_xmit_retransmit_queue() decides which packets to retransmit. The > first packet to start retransmitting from is tracked in > tp->retransmit_skb_hint. > Note that the dupThresh is actually tracked by tp->reordering which > measures the reordering in the network and is not fixed at 3. So, if > more than > tp->reordering packets have been acked above a given packet, this > packet is a candidate for retransmisson. See tcp_mark_head_lost() to > see how the > reordering metric is used to mark packets as lost. This corresponds to > the check you mentioned in the RFC. > > So, window permitting, packets are sent as follows; > (a)-- Packets marked lost as per description above > (b)-- new packets (if any) > (c)-- Holes between sacked packets which are not reliably lost. > > choice between (b) and (c) is made in tcp_can_forward_retransmit(). > > Hope this helps. > Vijay > It is just I wanted! Thanks for your detailed explaination and kindness. ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
[RFC] tcp: How does SACK or FACK determine the time to start fast retransmition?
HI all, When tcp uses reno as its congestion control algothim, it uses tp->sacked_out as dup-ack. When the third dup-ack(under default condition) comes, tcp will initiate its fast retransmition. But how about sack ? According to kernel source code comments, when sack or fack tcp option is enabled, there is no dup-ack counter. See comments for function tcp_dupack_heuristics(): http://lxr.linux.no/linux+v2.6.37/net/ipv4/tcp_input.c#L2300 So , how does tcp know the current dup-ack is the last one which triggers the fast retransmition? According to rfc3517 section 5: "Upon the receipt of the first (DupThresh - 1) duplicate ACKs, the scoreboard is to be updated as normal." "When a TCP sender receives the duplicate ACK corresponding to DupThresh ACKs, the scoreboard MUST be updated with the new SACK information (via Update ()). If no previous loss event has occurred on the connection or the cumulative acknowledgment point is beyond the last value of RecoveryPoint, a loss recovery phase SHOULD be initiated, per the fast retransmit algorithm outlined in [RFC2581]." But these sentences doesn't describe how tcp knows the current ack is the dup-threshold dup-ack. Accorrding to rfc3517 seciton 4 and isLost(Seqnum) function: "The routine returns true when either DupThresh discontiguous SACKed sequences have arrived above ’SeqNum’ or (DupThresh * SMSS) bytes with sequence numbers greater than ’SeqNum’ have been SACKed. Otherwise, the routine returns false." I think this is just what I am searching for, but I still don't know which line of code in Linux tcp protocol does this check. Can any one help me ? thks in advance. ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
How does SACK or FACK determine the time to start fast retransmition ?
HI all, When tcp uses reno as its congestion control algothim, it uses tp->sacked_out as dup-ack. When the third dup-ack(under default condition) comes, tcp will initiate its fast retransmition. But how about sack ? According to kernel source code comments, when sack or fack tcp option is enabled, there is no dup-ack counter. See comments for function tcp_dupack_heuristics(): http://lxr.linux.no/linux+v2.6.37/net/ipv4/tcp_input.c#L2300 So , how does tcp know the current dup-ack is the last one which triggers the fast retransmition? According to rfc3517 section 5: "Upon the receipt of the first (DupThresh - 1) duplicate ACKs, the scoreboard is to be updated as normal." "When a TCP sender receives the duplicate ACK corresponding to DupThresh ACKs, the scoreboard MUST be updated with the new SACK information (via Update ()). If no previous loss event has occurred on the connection or the cumulative acknowledgment point is beyond the last value of RecoveryPoint, a loss recovery phase SHOULD be initiated, per the fast retransmit algorithm outlined in [RFC2581]." But these sentences doesn't describe how tcp knows the current ack is the dup-threshold dup-ack. Accorrding to rfc3517 seciton 4 and isLost(Seqnum) function: "The routine returns true when either DupThresh discontiguous SACKed sequences have arrived above ’SeqNum’ or (DupThresh * SMSS) bytes with sequence numbers greater than ’SeqNum’ have been SACKed. Otherwise, the routine returns false." I think this is just what I am searching for, but I still don't know which line of code in Linux tcp protocol does this check. Can any one help me ? thks in advance. ___ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies