- 论坛徽章:
- 0
|
回复 5# jiufei19
tcp_ack会先更新snd_una, 然后调用tcp_clean_rtx_queue()来free skb, 但是它只会free fully acked skb, partially acked skb不会被free掉。所以tck_retransmit_skb会拿到最后一个data + fin的skb,如果如版主所说,receiver只ack了data的话。
但是还有一个问题就是,在tcp_retransmit_skb的前面会trim掉snd_una以前的数据,-
- if (before(TCP_SKB_CB(skb)->seq, tp->snd_una)) {
- if (before(TCP_SKB_CB(skb)->end_seq, tp->snd_una))
- BUG();
- if (tcp_trim_head(sk, skb, tp->snd_una - TCP_SKB_CB(skb)->seq))
- return -ENOMEM;
- }
复制代码 所以跑到后面的话似乎也不太可能出现 tp->snd_una == (TCP_SKB_CB(skb)->end_seq - 1) && skb_len > 0的情况... |
|