一心向上 发表于 2014-08-18 17:37

内核2.6.18中关于tcp_sacktag_write_queue函数的疑问

for (i = 0; i< num_sacks; i++) {
                __u32 start_seq = ntohl(sp.start_seq);
                __u32 end_seq =       ntohl(sp.end_seq);

               ........               

               
                        /* D-SACK for already forgotten data...
                       * Do dumb counting. */
                        if (dup_sack &&
                          !after(end_seq, prior_snd_una) &&
                          after(end_seq, tp->undo_marker))
                                tp->undo_retrans--;

prior_snd_una表示接收本次ack之前的snd_una,undo_marker表示发生重传时的snd_una,上述代码的含义为如果有重复sack标志dup_sack,同时prior_snd_una不在sack块的end_seq之后且undo_marker在end_seq之后,则undo_retrans减一。我不理解的是,prior_snd_una代表原先的snd_una,那么其之后的段都是已经被确认的,如果end_seq在其后的话,那么接收端已经确认了。这时候肯定是重复传输了,干嘛还要判断dup_sack呢?
页: [1]
查看完整版本: 内核2.6.18中关于tcp_sacktag_write_queue函数的疑问