클라이언트 연결이 끊어졌을 때 TCP 연결이 열린 상태로 유지 될 수 있습니까?


12

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

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

tldr;

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

답변:


13

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

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


아마도 TCP가 상주하는 전송 계층 위에 계층과 세션 계층을 의미했을 것입니다.
Rilindo

1
@Rilindo : 실제로,이 경우에는 TCP 스택을 호출하는 응용 프로그램이 있습니다. TCP의 프로토콜 (HTTP, POP 등)은 일반적으로이 작업을 수행하는 방법을 지정합니다. 이러한 프로토콜의 설계자는 TCP가이 작업을 수행 할 수 없다는 것을 알고 있기 때문입니다.
David Schwartz

으악, 내 실수. 그런 다음 레이어 7입니다.
Rilindo

이 시점에서 Keepalives를 활성화하지는 않겠지 만 옵션이 존재한다는 것을 알면 편리합니다. 이 기사는 이미 2 시간의 타임 아웃이 있음을 시사하는 것 같습니다.
Josh Smeaton

대부분의 경우 Keepalives가 활성화되어 있지 않습니다. 일부 코드는이를 활성화해야합니다. Keepalives를 활성화하지 않고 시간 초과 / 수확 메커니즘이없는 경우 응용 프로그램이 일반 깨진 것처럼 들립니다. 우리는 어떤 프로토콜에 대해 이야기하고 있습니까? (HTTP? SMTP? FTP?)
David Schwartz

8

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

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

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


3
또는 합리적인 시간 제한을 :) 구현하기 위해 공급 업체를 얻을
셰인 매든

5

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


우리는 명백한 문제인 고객을 알고 있습니다. 수백 명의 사용자가 매일 사용하는 데스크톱 앱입니다. 문제는 응용 프로그램 충돌, 하드 리셋 또는 종료 작업이라고 가정합니다. 나는 모든 상황에서 서버가 연결이 끊어진 것을 알 것이라고 생각했습니다.
Josh Smeaton

4
서버에 관한 한, 클라이언트로부터 FIN 또는 RST를 수신하지 않으면 연결이 열려 있습니다. 그렇지 않으면, 서버는 연결이 여전히 설정되어 있지만 클라이언트에 전송할 데이터가 없다고 가정합니다. 서버에 관한 한 반 개방 연결과 유휴 연결에는 차이가 없습니다.
joeqwerty

@joeqwerty : 사실은, 그러나 서버 는 무제한 연결을 열어 둘 싶어하지 않는 것을 결정하고 약간의 타임 아웃 / 닫기 메커니즘을 구현할 수 있습니다. 그것이 David Schwartz가 "응용 프로그램 코드의 책임"이라는 그의 대답에서 의미 한 바입니다. 따라서 원하는 경우 서버 반 개방 연결과 유휴 연결을 다르게 할 수 있습니다 . 그러나 TCP의 경우 반 개방 연결과 유휴 연결 간에는 차이가 없습니다.
sleske

@ sleske : 응용 프로그램 코드 가이 작업을 수행 할 수 있다고 동의했지만 연결 유지 기능을 사용하지 않으면 TCP가 불가능합니다.
joeqwerty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.