标签:
杂谈 |
分类: CPP/C |
关闭时状态转变:
client:
server: Close_wait -> Last_ack -> closed
Fin_wait_1 发生在client 发出Fin包后, 并等待server 回 ack 时.
Fin_wait_2 发生在client收到ack包后, 并等待server发出Fin包时.
Time_wait 发生在client收到Fin包并发出ack包后, 在等待2msl的时间时.
Close_wait 发生在server收到client的fin包并且发出ack包后以及自己主动关闭发出fin包前.
Last_ack发生在server发出fin包后, 并等待client回ack时.
经常出现的状态组合:
client: fin_wait_2;
原因: 当client close了,但是server忘记close的时候,
即server在收到client的fin后并没有发送fin包给client, 导致自己处于close_wait状态,
而client在等待server的fin包,处于fin_wait_2状态.
原因: 当client, server都close了, client必须处于time_wait状态等待2msl时间.
于是如果server是处于高并发短连接的状态, 就会有大量的time_wait的连接霸占着. 使得其他的连接连接不了.
解决方法:
用linger强制关闭可以解决此问题(用rst代替fin),但是linger会导致数据丢失,linger值为0时是强制关闭,无论并发多少多能正常连接上,如果非0会发生部分连接不上的情况!(可调用setsockopt设置套接字的linger延时标志,同时将延时时间设置为0。)
TCP/IP的RFC文档。TIME_WAIT是TCP连接断开时必定会出现的状态。
是无法避免掉的,这是TCP协议实现的一部分。
在WINDOWS下,可以修改注册表让这个时间变短一些
time_wait的时间为2msl,默认为4min.
你可以通过改变这个变量:
TcpTimedWaitDelay
把它缩短到30s
PS: Linux 查看 tcp 状态的命令 netstat -an | grep portnumber
Linux close()和shutdown()的区别.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/daeees/archive/2010/07/07/5719285.aspx