FIN_WAIT1 상태에서 소켓을 어떻게 제거합니까?


18

죽이는 프로세스에 의해 차단 된 포트가 있습니다. (충돌 한 작은 텔넷 데몬). 프로세스가 성공적으로 종료되었지만 포트는 여전히 'FIN_WAIT1'상태입니다. 그것은 나오지 않습니다. 그것의 타임 아웃은 '10 년 '으로 설정된 것 같습니다.

포트를 비우는 유일한 방법은 전체 머신을 재부팅하는 것입니다. 물론 원하지 않는 일입니다.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

아무도 재부팅하지 않고이 포트를 차단 해제하는 방법을 알고 있습니까?

답변:


18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1

2
$whateveritwas덮어 쓰기 전에 먼저 기록해두면 답이 향상 됩니다.
43

7

로 시간 초과를 설정할 수 있어야합니다 /proc/sys/net/ipv4/tcp_fin_timeout.

실제로 소켓을 수동으로 지우는 방법이없는 것 같습니다.


6
이 답변은 정확하지 않습니다. tcp_orphan_retries는 FIN_WAIT1에 영향을 미치고 tcp_fin_timeout은 FIN_WAIT2에 영향을 미칩니다.
suprjami 2016 년

suprjami가 올 바르면 tcp_fin_timeout이 FIN_WAIT2에 영향을줍니다. SO_LINGER를 사용할 때만 트리거됩니다.
Matt

@innaM이 답변을 제거 할 수 있습니까? 다운 보트가 정확하고 누적되지 않습니다. 나는 당신이 여전히 활동적이라는 것을 알기 때문에 대답을 제거하는 것이 가장 합리적입니다.
Andrew B

@Andrew B : 허용 된 답변을 삭제할 수없는 것 같습니다.
innaM

6

tcp_orphan_retries 설정은 서버리스 포트가 해제되기 전에 시도 할 횟수를 제어하는 ​​것으로 보입니다. 1로 설정 한 후 포트가 사라졌습니다.

HTH


1
밀접하게 관련 : 0은 기본값 8을 의미합니다. serverfault.com/a/408882/152073
Andrew B

5

/proc/sys/net/ipv4/tcp_fin_timeoutFIN-WAIT-1이 아니라 FIN-WAIT-2 상태의 시간 초과입니다. tcpkill 경로를 따라 가거나 /proc/sys/net/ipv4/tcp_keepalive_*SO에 의해 강제 종료하기 위해 keepalive 시간을 가지고 놀 수 있습니다 .


2

루트 ID로 다음 단계를 실행하면 나에게 지워졌습니다.

커널 설정을 캡처하여 변수를 변경

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

최대 고아를 일시적으로 0으로 설정

$ sysctl -w net.ipv4.tcp_max_orphans=0

문제가있는 포트가 더 이상 사용되지 않는지 확인하십시오

$ netstat -np|grep 9716

위 명령이 줄을 반환하지 않을 때까지 조금 기다렸다가 필요한 경우 위 단계를 반복하십시오.

tcp_max_orphans 커널 매개 변수를 위 변수의 원래 값으로 다시 재설정하십시오.

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans

안녕하세요, Serverfault에 오신 것을 환영합니다. 귀하의 답변 형식을이 사이트의 다른 답변과보다 일치하도록 게시물을 편집했습니다. 다음 답변을 위해 여기에서 한만큼 제목을 사용하지 말고 다른 답변을 자신의 답변에 대한 템플릿으로 고려하십시오. 귀하의 기여에 감사드립니다. serverfault를 즐기십시오.
Richard

1

FIN_WAIT1

로컬 컴퓨터의 응용 프로그램이 연결을 닫았습니다. 이 표시는 원격 시스템으로 전송되었습니다.

응용 프로그램이 연결 측면을 닫았으며 소켓은 이제 원격 쪽이 닫힘을 확인하기를 기다리고 있습니다. 많은 소켓이 FIN_WAIT1 에 유지되는 데 문제가 있으면 위의 Manni의 조언을 따라야합니다.


0

Linux 커널> = 4.9에서는 ssiproute2 의 명령을 키 -K와 함께 사용할 수 있습니다

ss -K dst 192.168.1.214 dport = 49029 커널은 CONFIG_INET_DIAG_DESTROY 옵션을 활성화하여 컴파일해야합니다.

/unix//a/511691/43898을 통해



-4

이것은 도움이 될 수 있습니다 :

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0

6
그것이 무엇인지 설명하면 도움이 될 수 있습니다. 우리는 전문가이므로 맹목적으로 내용을 붙여 넣지 않고 도움이되기를 바랍니다.
Michael Hampton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.