Chinaunix首页 | 论坛 | 博客
  • 博客访问: 154545
  • 博文数量: 41
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-14 10:16
文章分类
文章存档

2011年(1)

2010年(5)

2009年(35)

我的朋友

分类: LINUX

2009-08-12 17:17:02

tcp.c文件的tcp_retransmit函数

978计划工作组 2009-8-12

1函数源码

/*

 *    A timer event has trigger a tcp retransmit timeout. The

 *    socket xmit queue is ready and set up to send. Because

 *    the ack receive code keeps the queue straight we do

 *    nothing clever here.

 */

 

static void tcp_retransmit(struct sock *sk, int all)

{

       if (all)

       {

              tcp_retransmit_time(sk, all);

              return;

       }

 

       sk->ssthresh = sk->cong_window >> 1; /* remember window where we lost */

       /* sk->ssthresh in theory can be zero.  I guess that's OK */

       sk->cong_count = 0;

 

       sk->cong_window = 1;

 

       /* Do the actual retransmit. */

       tcp_retransmit_time(sk, all);

}

2函数用途

重传函数。

3调用关系

tcp_retransmitretransmit_timer调用,retransmit_timer函数的入参就是sock结构,通过此结构获得why(重传类型),当类型为TIME_WRITE(超时重传)时调用sk->prot->retransmit实现重传,而sk->prot根据不同的协议被初始化为不同的处理函数集,如使用的是tcp协议则sk->prot被全局结构体实例tcp_prot初始化,而tcp_prot结构体的retransmit域被tcp_retransmit初始化,所以使用tcp协议时调用sk->prot->retransmit相当于调用tcp_retransmit函数。tcp_retransmit函数调用tcp_retransmit_time函数,tcp_retransmit_time又调用tcp_do_retransmit函数,tcp_do_retransmit调用链路层函数dev_queue_xmit实现具体的数据重传。函数调用关系图如下:

retransmit_timer

|__ tcp_retansmit

              |__tcp_retransmit_time

                     |__tcp_do_retransmit

                            |__dev_queue_xmit

4语句注释

4.1 if (all)

       {

              tcp_retransmit_time(sk, all);

              return;

       }

tcp_retransmit_time具体参见《tcp.c文件的tcp_retransmit_time函数(8.doc》。

all值为0表示出现了拥塞,1表示未出现拥塞。

4.2 sk->ssthresh = sk->cong_window >> 1;

       sk->cong_count = 0;

       sk->cong_window = 1;

sk->ssthresh慢启动阀值ssthresh被用来确定是用慢启动还是用拥塞避免算法来控制数据传送,具体用法如下:cong_window时使用慢启动算法;cong_window>ssthresh时使用拥塞避免算法;当cong_window=ssthresh时,发送端既可以使用慢启动也可以使用拥塞避免。

sk->ssthresh=sk->cong_window>>1拥塞窗口的一半赋给了慢启动阀值

sk->cong_window拥塞窗口大小, 表示的是本地最大可同时发送但未得到应答的数据字节个数

sk->cong_window=1:将拥塞窗口大小设为1, 表示进入了慢启动阶段了

sk->cong_count

sk->cong_count=0

 

阅读(1570) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~