TCP 出现大量 LAST_ACK 导致apache不能重启解决小结
2015-08-24 11:42
477 查看
前因:有段时间公司oa服务器运行一段时间后出现无法访问的情况,按照控制台的策略此时强制重启
apache使重新运行,此时能再次恢复正常运行。但是这个策略用不久,之后更加出现 httpd.exe 无法
重启的现场,查看日志之下,没任何可用信息。
无奈之下,我在apache的启动bat里面加入了输出netstat 的信息
"2015-08-18 星期二 22:05:20.05 apache can't start ..."
TCP 127.0.0.1:3365 127.0.0.1:8306 LAST_ACK 86424
TCP 127.0.0.1:3477 127.0.0.1:8306 LAST_ACK 144008
TCP 127.0.0.1:3542 127.0.0.1:8306 LAST_ACK 160512
TCP 127.0.0.1:3956 127.0.0.1:8306 LAST_ACK 160512
TCP 127.0.0.1:3967 127.0.0.1:8306 LAST_ACK 144008
TCP 127.0.0.1:4305 127.0.0.1:8306 LAST_ACK 160512
TCP 127.0.0.1:4422 127.0.0.1:8306 CLOSE_WAIT 184944
TCP 127.0.0.1:4424 127.0.0.1:8306 CLOSE_WAIT 184944
TCP 127.0.0.1:4537 127.0.0.1:8306 LAST_ACK 144008
TCP 127.0.0.1:8306 127.0.0.1:4382 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4399 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4400 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4401 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4402 TIME_WAIT 0
由此可见是因为有LAST_ACK存在,导致端口还被占用。
但是进程列表却没有了httpd.exe进程,随即我使用其他内核工具查看网络连接
清晰看到,这里的LAST_ACK没有被正确清除。而且进程没办法管理了
无奈我用OpenProcess(x,x,pid)去获取这里的handle
只有读写有效,其他操作都无效,看来也没办法直接再次干掉进程了
在这样的情况下只能使用Nt系列函数对socket handle操作
通过这样的操作确实可以操作到socket的handle并关闭
但是这样的方式在搞版本的window并没什么卵用
只能另寻他法。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:00000015
这样直接调整Tcp等待延迟时间。
问题基本解决。apache再没出现过无法启动的问题
LAST_ACK也消去。
apache使重新运行,此时能再次恢复正常运行。但是这个策略用不久,之后更加出现 httpd.exe 无法
重启的现场,查看日志之下,没任何可用信息。
无奈之下,我在apache的启动bat里面加入了输出netstat 的信息
"2015-08-18 星期二 22:05:20.05 apache can't start ..."
TCP 127.0.0.1:3365 127.0.0.1:8306 LAST_ACK 86424
TCP 127.0.0.1:3477 127.0.0.1:8306 LAST_ACK 144008
TCP 127.0.0.1:3542 127.0.0.1:8306 LAST_ACK 160512
TCP 127.0.0.1:3956 127.0.0.1:8306 LAST_ACK 160512
TCP 127.0.0.1:3967 127.0.0.1:8306 LAST_ACK 144008
TCP 127.0.0.1:4305 127.0.0.1:8306 LAST_ACK 160512
TCP 127.0.0.1:4422 127.0.0.1:8306 CLOSE_WAIT 184944
TCP 127.0.0.1:4424 127.0.0.1:8306 CLOSE_WAIT 184944
TCP 127.0.0.1:4537 127.0.0.1:8306 LAST_ACK 144008
TCP 127.0.0.1:8306 127.0.0.1:4382 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4399 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4400 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4401 TIME_WAIT 0
TCP 127.0.0.1:8306 127.0.0.1:4402 TIME_WAIT 0
由此可见是因为有LAST_ACK存在,导致端口还被占用。
但是进程列表却没有了httpd.exe进程,随即我使用其他内核工具查看网络连接
清晰看到,这里的LAST_ACK没有被正确清除。而且进程没办法管理了
无奈我用OpenProcess(x,x,pid)去获取这里的handle
只有读写有效,其他操作都无效,看来也没办法直接再次干掉进程了
在这样的情况下只能使用Nt系列函数对socket handle操作
NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddress(hDll,"NtQuerySystemInformation"); hProc = OpenProcess(PROCESS_DUP_HANDLE, true, pi->Handle[i].dwPid); if ( hProc ) { DuplicateHandle(hProc, (HANDLE)pi->Handle[i].HndlOffset, GetCurrentProcess(), &hMyHandle, STANDARD_RIGHTS_REQUIRED, true, 0); CloseHandle( hProc ); } else { printf("DuplicateHandle failed pid = %d \n",pi->Handle[i].dwPid); continue; }
通过这样的操作确实可以操作到socket的handle并关闭
但是这样的方式在搞版本的window并没什么卵用
只能另寻他法。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:00000015
这样直接调整Tcp等待延迟时间。
问题基本解决。apache再没出现过无法启动的问题
LAST_ACK也消去。
相关文章推荐
- 各类 HTTP 返回状态代码详解
- Excel 2007表格内输入http取消自动加上超链接的功能
- httpclient实例
- Android笔记:HTTP相关
- System.Net网络编程--AuthenticationManager和IAuthenticationModule
- 计算机网络系统--Microsoft Lync 与 腾讯通RTX 对比(转载)
- 关于监听网络状态变化,记录而已
- System.Net.HttpWebRequest.GetRequestStream超时问题
- 网络划分与寻址三要素: IP地址、子网掩码和地址分类
- TCP/IP协议族浅谈
- Android与服务器端数据交互(http协议整合struts2+android)
- c++encode http请求带中文参数
- TCP/IP——TCP网络传输数据包1460MSS和1448负载
- Oulipo(http://acm.hdu.edu.cn/showproblem.php?pid=1686)
- 8月第2周网络安全报告:境内被篡改网站增至5421个
- 神经网络训练中的Tricks之高效BP(反向传播算法)
- ASP.NET MVC路由配置(转载自http://www.cnblogs.com/zeusro/p/RouteConfig.html )
- 找呀志_通过开源框架引AsyncHttpClient处理get/post要求
- http二进制流传值,取值
- Http协议提要