주요 콘텐츠로 건너뛰기

때때로 netstat는 붙어있는 것처럼 보이는 소켓을 표시합니다. 원격 응용 프로그램이 종료되었지만 OpenVOS 응용 프로그램도 종료되었지만 netstat는 여전히 소켓을 표시하고 있습니다. 이 문서에서는 왜 이런 일이 일어나는지, 그리고 이에 대해 무엇을 할 수 있는지 설명해 줄 것입니다.

TCP 상태에 대한 간략한 소개

당신이 구글 경우 "tcp 상태 다이어그램" 당신은 이미지의 과다를 찾을 수 있습니다, 일부 거의 읽을 수있는 다른 사람은 매우 읽을 수. 위키 미디어는 아주 좋은 색상 코딩 하나 (http://commons.wikimedia.org/wiki/File:TCP_state_diagram.png)가 있습니다. TCP RFC (793) (http://www.rfc-editor.org/rfc/rfc793.txt)는 ASCII 아트 다이어그램을 가지고 있으며 물론 상태를 자세히 설명합니다.

소켓은 로컬 응용 프로그램이나 원격 호스트가 작업을 수행하기를 기다리는 동안 달라붙을 수 있습니다. 이 문제가 발생하는 세 가지 상태가 있습니다. FIN_WAIT_2 상태에서 소켓은 원격 호스트가 연결을 닫을 때까지 기다리고 있습니다. CLOSE_WAIT 상태에서는 로컬 응용 프로그램이 소켓을 닫기를 기다리고 있으며 ESTABLISHED 상태에서는 원격 호스트가 송신 창을 열거나 로컬 응용 프로그램이 무언가를 보낼 때까지 기다리고 있습니다. 로컬 TCP 스택이 데이터를 전송하고 원격 호스트가 붙어있을 수 없음을 인정하기를 기다리는 경우 결국 시간 제시간, 로컬 응용 프로그램에 오류를 알리고 소켓을 닫습니다.

FIN_WAIT_2 상태

이것은 아마도 CAC에 호출되는 가장 일반적인 붙어 소켓 케이스입니다. 로컬 응용 프로그램이 소켓을 닫았고 종료되었을 수 있습니다. 소켓이 이 상태에 갇혀있는 전형적인 이유는 원격 응용 프로그램이 중단되고 소켓을 읽지 않기 때문입니다.

STCP 매개 변수 finwait2를 일부 N > 0으로 설정하면 N 초 동안 FIN_WAIT_2 후 소켓이 닫힙습니다. 릴리스 에서 시작 14.7.2bg, 14.7.tl1, 15.2.1aaa, 15.2.tel.af, 15.3.0bd, 15.3.tel.ag, 16.2.1al, 17.0.0ai, 17.1 기본 값은 1200, 그 전에 기본 값은 0 (그래서 당신은 소켓을 설정합니다). list_stcp_params analyze_system 요청으로 현재 값을 볼 수 있으며 set_stcp_param analyze_system 요청으로 값을 변경할 수 있습니다. 이러한 요청에 대한 설명서는 http://stratadoc.stratus.com 사용할 수 있는 OpenVOS 시스템 분석(R073) 설명서를 참조하십시오.

CLOSE_WAIT 상태

이것은 다음으로 가장 일반적인 소켓 상태입니다. CLOSE_WAIT 상태의 소켓은 로컬 응용 프로그램이 소켓을 닫을 때까지 기다리고 있습니다. 소켓이 이 상태에 남아 있는 일반적인 이유는 응용 프로그램이 더 이상 소켓을 읽지 않는다는 것입니다. 소켓을 닫는 가장 쉬운 방법은 로컬 응용 프로그램을 종료하는 것입니다.

로컬 응용 프로그램을 종료하는 것이 옵션이 아닌 경우 RST(재설정) 플래그 세트로 패킷을 만드는 것만이 가능합니다. 이렇게 하려면 소켓에서 사용하는 시퀀스 번호(dump_onetcb analyze_system 요청을 사용하여 사용 가능)를 알고 사용자 지정 IP 패킷을 빌드하고 보낼 수 있는 로컬 서브넷의 다른 호스트에 유틸리티가 있어야 합니다. 이러한 유틸리티는 Windows 및 Linux 시스템에서 사용할 수 있습니다.

기존 상태

대부분의 시간 netstat는 설립 상태에서 소켓을 표시하기 때문에 소켓이 붙어있을 때 어떻게 알 수 있습니까? 원격 호스트가 충돌했거나 로컬 호스트와 원격 호스트 간의 네트워크가 10분 이상 실패했으며 로컬 응용 프로그램이 리모컨을 기다리고 있으면 소켓이 붙어 있는지 확신할 수 있습니다. 이 경우 netstat에서 보고한 전송 큐 값(로컬 IP 주소의 바로 왼쪽에 있는 숫자)이 0이 됩니다. 반면에 보내기 큐 값이 0보다 크고 거기에 남아 있는 경우 원격 호스트가 0 창을 광고하는 경우가 있을 수 있습니다.

첫 번째 경우 는 유지-살아 있는 소켓에 설정 되지 않는 한 로컬 응용 프로그램이 종료 될 때까지 설립 상태로 유지됩니다. 살아있는 유지 타이머가 만료된 후 계속 켜져 있으면 STCP는 살아있는 유지 프로브를 보냅니다. 프로브가 응답되지 않으면 다시 전송되지만 몇 분 후에 몇 번의 재전송 후 연결이 종료됩니다. 기본적으로 인터페이스에는 계속 살아 있는 집합이 있지만 기본적으로 소켓은 그렇지 않습니다. 소켓에서 계속 유지하려면 응용 프로그램은 setockopt 함수 호출을 사용해야 합니다. 자세한 내용은 자세한 내용은 http://stratadoc.stratus.com 제공되는 OpenVOS STREAMS TCP/IP 프로그래밍(R420) 설명서를 참조하십시오. 기본 유지 시간은 2시간입니다. 즉, 마지막 TCP 세그먼트가 원격 호스트로부터 수신된 후 2시간 후에 첫 번째 살아있는 프로브가 전송되므로 인내심을 가져야 합니다. 그렇게 인내심이 없는 사람들을 위해 당신은 analyze_system 내에서 set_stcp_parameter 요청으로 프로브와 프로브의 수 사이의 유지 시간과 시간을 조정할 수 있습니다. 자세한 분석 없이 이러한 매개 변수를 변경하는 것이 좋습니다.

소켓에 유지-살아 있는 설정이 없는 경우 유일한 간단한 옵션은 소켓을 소유 하는 응용 프로그램을 종료 하는 것입니다. 옵션이 아닌 경우 RST 플래그가 설정된 세그먼트를 전송하여 소켓을 닫을 수 있습니다.

두 번째 케이스를 확인하려면 dump_onetcb analyze_system 요청에 의해 표시되는 sndws값을 확인합니다. 0 값은 닫힌 창을 나타냅니다. packet_monitor 실행하여 연결을 추적하고 원격 호스트의 세그먼트에서 TCP 헤더의 창 값을 확인할 수도 있습니다. "n.a"의 값은 0을 나타냅니다.

나는 이것이 회복 가능한 상태가 될 수 있다는 것을 강조하고 싶다. 응용 프로그램이 지연되고 TCP 스택이 창을 닫으면 응용 프로그램이 스택에 잡힐 때 창이 열립니다. 그러나 대부분의 경우 몇 분 후에 응용 프로그램이 복구되지 않으면 작동하지 않을 것이라고 가정하는 것이 안전하다고 생각합니다. 예외는 종이에 없는 프린터와 다를 수 있습니다. 이 상태의 소켓은 생성된 VOS 응용 프로그램이 종료되더라도 이 상태로 남아 있습니다.

이 소켓은 tcp_zerowin_abort_interval $를 일부 N > 0으로 설정하여 정리될 수 있습니다. 소켓은 0 창이 수신된 다음 TCP 세그먼트가 수신된 후 N초를 정리합니다. 창 프로브는 100초마다 전송되어 원격 호스트의 수신 창이 여전히 닫혀 있는지 확인하므로 최악의 경우 100초 이내에 회신이 수신됩니다. tcp_zerowin_abort_interval $의 기본 값은 0이며 소켓을 정리할 필요가 없는 경우 0으로 유지되는 것이 좋습니다. 그 시점에서 나는 작은 값으로 설정하는 것이 좋습니다, 말 10 초, 소켓이 정리되면 0으로 재설정. 나는 이것이 복구 가능한 소켓을 지우는 위험을 줄인다고 생각합니다.

이 값을 설정하려면 analyze_system set_longword 요청을 사용해야 하므로 N이 육사에 있을 것임을 기억하십시오. 예를 들어 요청을 10으로 설정하는 것은 다음과 같은 것입니다.
set_longword tcp_zerowin_abort_interval $ a

© 2024 스트라투스 테크놀로지스.