您的位置:首页 > 理论基础 > 计算机网络

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操作

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也消去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: