ITKeyword,专注技术干货聚合推荐

注册 | 登录

CLOSE_WAIT解决方案及TCP各状态解释

wxl1986622 分享于 2012-05-03

推荐:TCP服务器“拒绝服务攻击” 解决方案

    说这是一个完全的解决方案,其实有点夸大了,但这个方案确实可以缓解TCP服务器遭受“拒绝服务攻击”时表现出的脆弱性。     当服务器以Tcp的方式提供服务时

2020腾讯云“6.18”活动开始了!!!(巨大优惠重现!4核8G,5M带宽 1999元/3年),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1059

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods


2011-04-18 12:59

LISTEN - 侦听来自远方TCP端口的连接请求; 
SYN-SENT -在发送连接请求后等待匹配的连接请求; 
SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认; 
ESTABLISHED- 代表一个打开的连接,数据可以传送给用户; 
FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;
FIN-WAIT-2 - 从远程TCP等待连接中断请求; 
CLOSE-WAIT - 等待从本地用户发来的连接中断请求; 
CLOSING -等待远程TCP对连接中断的确认; 
LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认; 
TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认; 
CLOSED - 没有任何连接状态;

closesocket函数的原型是:

int closesocket(

  SOCKET s

);

该函数用于关闭socket句柄,并释放相关资源。前面说过,关闭socket句柄时会隐含触发TCP连接的关闭过程,那么closesocket触发的是一个优雅关闭过程还是强制关闭过程呢?这个与一个socket选项有关:SO_LINGER 选项,该选项的设置值决定了closesocket的行为。该选项的参数值是linger结构,其定义是:

typedef struct linger {

  u_short l_onoff;

  u_short l_linger;

推荐:sqlite3_close 返回 SQLITE_BUSY 的解决方案

void CSQLiteDB::Close() {     if(m_db)     {         sqlite3 *db = m_db;         m_db = NULL;         int rc = sqlite3_close(db);         while( rc ==

} linger;

当l_onoff值设置为0时,closesocket会立即返回,并关闭用户socket句柄。如果此时缓冲区中有未发送数据,则系统会在后台将这些数据发送完毕后关闭TCP连接,是一个优雅关闭过程,但是这里有一个副作用就是socket的底层资源会被保留直到TCP连接关闭,这个时间用户应用程序是无法控制的。

当l_onoff值设置为非0值,而l_linger也设置为0,那么closesocket也会立即返回并关闭用户socket句柄,但是如果此时缓冲区中有未发送数据,TCP会发送RST包重置连接,所有未发数据都将丢失,这是一个强制关闭过程。

当l_onoff值设置为非0值,而l_linger也设置为非0值时,同时如果socket是阻塞式的,此时如果缓冲区中有未发送数据,如果TCP在l_linger表明的时间内将所有数据发出,则发完后关闭TCP连接,这时是优雅关闭过程;如果如果TCP在l_linger表明的时间内没有将所有数据发出,则会丢弃所有未发数据然后TCP发送RST包重置连接,此时就是一个强制关闭过程了。

另外还有一个socket选项SO_DONTLINGER,它的参数值是一个bool类型的,如果设置为true,则等价于SO_LINGER中将l_onoff设置为0。

注意SO_LINGER和SO_DONTLINGER选项只影响closesocket的行为,而与shutdown函数无关,shutdown总是会立即返回的。

这样我们就可以简单的对目的套接字进行如下设置:

bool   bDontLinger=false;
      setsockopt(s,
                            SOL_SOCKET,
                            SO_DONTLINGER,
                            (char   *)&bDontLinger,
                            sizeof(bool));

      linger   InternalLinger;
      InternalLinger.l_onoff=1;
      InternalLinger.l_linger=0;
      setsockopt(s,
                            SOL_SOCKET,
                            SO_LINGER,
                            (const   char*)&InternalLinger,
                            sizeof(linger));

即可使用closesocket来关闭此端口而不会产生CLOSE_WAIT状态~本文总结了很多篇相关文章的解决方法和问题诠释,希望对大家有所帮助~另感谢多名探讨该技术问题的朋友的文献支持~

推荐:解决方案:SVN状态图标不显示

    在团队开发的时候,使用svn是非常方便的。    所有的文件都是用svn客户端检出(checkout)来的。svn检出的文件都有一个状态                    这个状态,用

2011-04-18 12:59 LISTEN - 侦听来自远方TCP端口的连接请求;  SYN-SENT -在发送连接请求后等待匹配的连接请求;  SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;  ESTABLIS

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。