TCP重传定时器的疑问

wh593296781 2011-03-15 03:06:25
关于TCP的重传定时器一直有一个疑问,昨天看了一下linux下TCP的實現,其中关键有一个函数:如下
C/C++ codestatic void tcp_event_new_data_sent(struct sock *sk, struct sk_buff *skb)
{
struct tcp_sock *tp = tcp_sk(sk);
unsigned int prior_packets = tp->packets_out;
tcp_advance_send_head(sk, skb);
tp->snd_nxt = TCP_SKB_CB(skb)->end_seq;
/* Don't override Nagle indefinately with F-RTO */
if (tp->frto_counter == 2)
tp->frto_counter = 3;
//关键在这里tp->packets_out += tcp_skb_pcount(skb);
if (!prior_packets)
inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS,
inet_csk(sk)->icsk_rto, TCP_RTO_MAX);
}
可以看到只有当prior_packets为0时才会重启定时器,而prior_packets则是发送未确认的段的个数,也就是说如果
发送了很多段,如果前面的段没有确认,那么后面发送的时候不会重启这个定时器.
如果这样的话 在t0时刻启动定时器,发送0,1,2三个报文段,t1时刻收到了对0的ACK,此时我们可以向网络中增加一个报文段3,因为1.2还没有被确认所以根据上面的情况,不会重启定时器,此时定时器的RTO不变,那么怎么来判断3的超时呢,因为定时器从启动到现在已经经过了t1-t0的时间,所以再经过RTO-(t1-t0)就会超时,如果经过RTO-(t1-t0)超时了,那么3算不算超时呢?
...全文
181 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wenxy1 2011-03-16
  • 打赏
  • 举报
回复
你不如去看RFC文档.
wh593296781 2011-03-15
  • 打赏
  • 举报
回复
多谢楼上的朋友,但是我看TCP/IP详解一书中讲到对于每个连接,同一时刻只会对一个数据包测量RTT的啊
Wenxy1 2011-03-15
  • 打赏
  • 举报
回复
TCP是每发送一个packet,就会启动此packet的重传定时器.

另外,贴代码时,注意把kernel version附上.

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧