全部博文(41)
分类: LINUX
2009-08-05 11:18:30
tcp.c文件的tcp_time_wait函数
978计划工作组
/*
* Enter the time wait state.
*/
static void tcp_time_wait(struct sock *sk)
{
tcp_set_state(sk,TCP_TIME_WAIT);
sk->shutdown = SHUTDOWN_MASK;
if (!sk->dead)
sk->state_change(sk);
reset_msl_timer(sk, TIME_CLOSE, TCP_TIMEWAIT_LEN);
}
设置本地socket进入TIME_WAIT状态,并设置定时器2MSL等待时间。
sk:用于通信的sock结构指针。
TCP_TIME_WAIT:该状态被称为2MSL 等待状态。此状态存在的时间被称为2MSL 时间,这一方面是为避免本地发送的应答数据包(断开连接的第4次握手的数据包)丢失,另一方面避免一个新创建的套接字接收到旧套接字中遗留的数据包。如果在等待期间接收到远端发送的FIN 数据包(断开连接的第3次握手的数据包),则表示之前在TCP_FIN_WAIT_2 状态(断开连接的第2次握手完成到第4次握手之间)发送的ACK 应答数据包在传输中丢失或者长时间被延迟,从而造成远端重新发送了FIN 数据包(第3次握手),此时重发ACK 应答数据包(断开连接的第4次握手的数据包)。一旦2MSL 时间到期,则将进入TCP_CLOSED 状态,即完成关闭操作。
tcp_set_state:设置套接字的状态。
SHUTDOWN_MASK:完全关闭。其他状态解释如下:
RCV_SHUTDOWN宏值为1 :接收通道被关闭(远端发送了FIN 数据包)
SEND_SHUTDOWN宏值为2 :发送通道关闭(本地主动发送FIN 数据包)
sk->shutdown:标示sock结构的关闭状态。
sk->state_change(sk);
!sk->dead:等于0表示该sock结构未处于释放状态。
sk->state_change:此函数指针指向了def_callback1,def_callback1的功能是将sk->sleep链表里的节点状态为TASK_INTERRUPTIBLE的改为TASK_RUNNING。
TIME_CLOSE:此为定时类型,2MSL 定时,宏值为2,赋给sock的timeout域。
TCP_TIMEWAIT_LEN:超时的时间长度,此值小于0则系统会给个默认值3,通常是60秒。
reset_msl_timer:是一个宏函数,宏展开后是调用reset_timer函数,此函数将TCP_TIMEWAIT_LEN的值赋给计时器的expires,并把该sock结构的timer加到系统的计时器队列,如果在加入前已经在计时器队列那么需要先从队列中移出后在加入。