免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6315 | 回复: 8
打印 上一主题 下一主题

对SOCKET中TIME_WAIT状态有了解的请进 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-04 20:20 |只看该作者 |倒序浏览
SOCKET关闭后,使用netstat查看,发现该SOCKET在内核中的状态长期处于TIME_WAIT;
而CLIENT和SERVER端都已经close了连接

哪位高人也遇到同样的问题?请赐教

论坛徽章:
0
2 [报告]
发表于 2006-07-04 21:47 |只看该作者
TIME_WAIT时间是协议要求的。solaris8下缺省为4分钟。solaris9以后为30秒吧。可以调整

论坛徽章:
0
3 [报告]
发表于 2006-07-05 05:38 |只看该作者
有人知道在linux下怎么调整这个值吗?

论坛徽章:
0
4 [报告]
发表于 2006-07-05 09:30 |只看该作者
似乎是要改内核吧。
请高人指点。

论坛徽章:
0
5 [报告]
发表于 2006-07-05 11:13 |只看该作者
等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。


  1. int sock, ret, on;struct sockaddr_in servaddr;

  2. /* Create a new stream (TCP) socket */

  3. sock = socket( AF_INET, SOCK_STREAM, 0 ):


  4. /* Enable address reuse */

  5. on = 1;

  6. ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );

  7. /* Allow connections to port 8080 from any available interface */

  8. memset( &servaddr, 0, sizeof(servaddr) );

  9. servaddr.sin_family = AF_INET;

  10. servaddr.sin_addr.s_addr = htonl( INADDR_ANY );


  11. servaddr.sin_port = htons( 8080 );


  12. /* Bind to the address (interface/port) */

  13. ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );

复制代码

[ 本帖最后由 anhongkui 于 2006-7-5 11:18 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-07-05 15:03 |只看该作者
记得写Unix网络编程的大师说过一句话:不要试图避免 TIME_WAIT 状态,它对我们开发网络程序是有益的

论坛徽章:
0
7 [报告]
发表于 2006-07-05 22:10 |只看该作者

回复 5楼 anhongkui 的帖子

anhongkui
精灵

你所说的这种情况一般用在HTTP服务器上,HTTP协议上服务器主动关闭连接。
但是这种情况会不会造成数据丢失呢?

论坛徽章:
0
8 [报告]
发表于 2006-07-05 22:30 |只看该作者
原帖由 linuxiang 于 2006-7-5 15:03 发表
记得写Unix网络编程的大师说过一句话:不要试图避免 TIME_WAIT 状态,它对我们开发网络程序是有益的



UNIX网络编程书上的确讲过这句话

从协议的角度上考虑,我们的确不应该试图强制清除TIME_WAIT状态。

但是从实际的考虑,我们是应该合理消除TIME_WAIT状态的。
我找到了一个很好的办法:那就是

总是让CLIENT端先关闭SOCKET连接

说说下面几种情况:
1 CLIENT端向服务器发送数据,流程如下

CLIENT                             SERVER

请求连接                  接受连接
写数据                     读数据
关闭连接                   关闭连接

这种情况下比较CLIENT与SERVER哪个关闭连接先执行,显然是CLIENT端。所以这种情况下,
TIME_WAIT存活的时间很短,我们没必要做特别处理.

2.CLIENT端接受服务器数据,流程如下

CLIENT                      SERVER

请求连接               接受连接
写数据                 读数据
关闭连接               关闭连接
     
这种情况下比较CLIENT与SERVER哪个关闭连接先执行,显然是SERVER端。所以这种情况下,
TIME_WAIT存活的时间很长,我们要进程特殊处理,保证CLIENT端关闭后再关闭。方法有很多,但是有一点可以利用的就是当CLIENT端关闭了连接后,服务器的连接就变得可读,这个时候再关闭连接。


以上是个人的一点经验,希望哪位高手能从TCP/IP协议层面上解释一下,为什么情况一的TIME_wait时间很短而情况二的TIME_WAIT的存在时间很长??

论坛徽章:
0
9 [报告]
发表于 2006-07-06 08:54 |只看该作者
原帖由 ping17909 于 2006-7-5 22:10 发表
anhongkui
精灵

你所说的这种情况一般用在HTTP服务器上,HTTP协议上服务器主动关闭连接。
但是这种情况会不会造成数据丢失呢?



确切的说应该在TCP服务上服务器端
解决的问题是:如果状态是TIME_WAIT, 则不能bind成功
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP