全部博文(41)
分类: LINUX
2009-08-12 17:17:02
tcp.c文件的tcp_retransmit函数
978计划工作组
/*
* 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);
}
重传函数。
tcp_retransmit被retransmit_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
tcp_retransmit_time:具体参见《tcp.c文件的tcp_retransmit_time函数(8).doc》。
all:值为0表示出现了拥塞,1表示未出现拥塞。
sk->ssthresh:慢启动阀值,ssthresh被用来确定是用慢启动还是用拥塞避免算法来控制数据传送,具体用法如下:当cong_window
sk->ssthresh=sk->cong_window>>1:拥塞窗口的一半赋给了慢启动阀值。
sk->cong_window:拥塞窗口大小, 表示的是本地最大可同时发送但未得到应答的数据字节个数。
sk->cong_window=1:将拥塞窗口大小设为1, 表示进入了慢启动阶段了。
sk->cong_count:。
sk->cong_count=0:。