内核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]