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

2011年(1)

2010年(5)

2009年(35)

我的朋友

分类: LINUX

2009-08-05 11:18:30

tcp.c文件的tcp_time_wait函数

978计划工作组 2009-8-5

1函数源码

/*

 *    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);

}

2函数用途

设置本地socket进入TIME_WAIT状态,并设置定时器2MSL等待时间。

3语句注释

3.1 tcp_set_state(sk,TCP_TIME_WAIT);

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设置套接字的状态。

3.2 sk->shutdown = SHUTDOWN_MASK;

SHUTDOWN_MASK:完全关闭。其他状态解释如下:

RCV_SHUTDOWN宏值为1 :接收通道被关闭(远端发送了FIN 数据包)

SEND_SHUTDOWN宏值为2 :发送通道关闭(本地主动发送FIN 数据包)

sk->shutdown:标示sock结构的关闭状态。

3.3 if (!sk->dead)

              sk->state_change(sk);

!sk->dead等于0表示该sock结构未处于释放状态。

sk->state_change此函数指针指向了def_callback1def_callback1的功能是将sk->sleep链表里的节点状态为TASK_INTERRUPTIBLE的改为TASK_RUNNING

3.4 reset_msl_timer(sk, TIME_CLOSE, TCP_TIMEWAIT_LEN);

TIME_CLOSE此为定时类型,2MSL 定时,宏值为2,赋给socktimeout域。

TCP_TIMEWAIT_LEN:超时的时间长度,此值小于0则系统会给个默认值3,通常是60秒。

reset_msl_timer:是一个宏函数,宏展开后是调用reset_timer函数,此函数将TCP_TIMEWAIT_LEN的值赋给计时器的expires,并把该sock结构的timer加到系统的计时器队列,如果在加入前已经在计时器队列那么需要先从队列中移出后在加入。

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