클라이언트 연결이 끊어졌을 때 TCP 연결이 열린 상태로 유지 될 수 있습니까? 후 클라이언트가 끊긴 경우에도 일부 연결이 열린

약 4000 개의 연결에서 TCP 소진 문제에 직면 한 서버 응용 프로그램이 있습니다. 이것은 대략 3 주 또는 4 주마다 발생합니다. 이 서버 응용 프로그램을 만든 공급 업체는 netstat -b의 출력을 검사 한 후 클라이언트가 끊긴 경우에도 일부 연결이 열린 상태로 남아 있음을 알려줍니다.

특정 클라이언트 응용 프로그램이 TCP 연결을 올바르게 닫지 않는 이유를 조사하는 작업을 받았습니다. 클라이언트 컴퓨터가 종료되면 서버에서 해당 클라이언트와의 TCP 연결이 여전히 설정되어 있다고보고 할 수 없습니다. 불행히도 내 견해를 확인할 정보를 찾을 수 없습니다. 나는 생각조차 할 수없는 잠재적 인 문제를 조사하는 데 더 이상 시간을 낭비하고 싶지 않습니다.

tldr;

서버가 꺼져있는 컴퓨터에 대한 연결을보고 할 수 있습니까?



답변

TCP는 데이터를 전송하는 쪽을 제외하고 연결 끊김을 감지하려고하지 않습니다. 이를 위해 TCP 스택을 호출하는 것은 애플리케이션 코드의 책임입니다. 어떤 프로토콜이 관련되어 있습니까? (TCP 위에있는 것)

끔찍한 추악한 “솔루션”이지만 TCP keepalives 를 사용할 수 있습니다 . 이 기사 에는 더 많은 내용이 있습니다.


답변

네 가능합니다. David와 Paul이 답변에서 언급했듯이 TCP에는 반 개방 연결을 감지하는 메커니즘 (선택 사항 인 TCP keep-alives 제외)이 없습니다. 연결 상태를 확인하고 그에 따라 적절한 조치를 취하는 것은 응용 프로그램 공급 업체의 책임입니다.

TCP에 관한 한, 반 개방 연결과 긴 유휴 연결은 감지되지 않습니다.

OSI 모델의 계층 1 (물리적)에서 계층 7 (애플리케이션)까지이 문제를 해결해야 문제가 발생한 위치를 파악할 수 있습니다. 문제가 발생할 때까지 영향을받는 클라이언트 중 하나에 패킷 캡처 프로그램을 설치하고 실행 한 다음 캡처를 분석하여 클라이언트가 연결을 닫지 않는 원인을 확인하는 것이 좋습니다.


답변

워크 스테이션이 서버와의 연결을 닫으려고 할 때 TCP FIN을 보냅니다. 클라이언트가 올바르게 작동하지 않고 연결을 닫지 않으면 실제로 서버에 설정된 상태로 남아있을 수 있습니다. 원인을 찾는 것이 더 좋지만 서버에서 열린 연결에 대한 제한 시간을 설정하여이를 정리할 수 있습니다. 열린 연결은 어떤 포트로 제공됩니까? 어떤 서비스에 액세스하고 있는지 알면 서버를 때리는 클라이언트 앱을 식별 할 수 있습니다.


답변