close_wait 상태의 발생 원인 및 해결
우선 서버 프로그램 이 CLOSE 에 있다 면WAIT 상태 라면 소켓 이 수 동적 으로 닫 혔 다 는 뜻 입 니 다!
CLIENT 엔 드 가 현재 연결 을 자발적으로 끊 으 면 이 TCP 연결 을 닫 으 려 면 모두 네 개의 패 킷 이 필요 하기 때 문 입 니 다.
Client ---> FIN ---> Server
Client <--- ACK <--- Server
Client FIN_WAIT_2 ; Server CLOSE_WAIT 。
Client <--- FIN <--- Server
Server FIN Client,Server LAST_ACK 。
Client ---> ACK ---> Server
Client ACK, Server CLOSED 。
서버 프로그램 이 CLOSE 에 있 음LAST 가 아 닌 WAIT 상태ACK 상 태 는 아직 클 라 이언 트 에 FIN 을 보 내지 않 았 다 는 것 을 설명 합 니 다. 연결 을 닫 기 전에 보 낼 데이터 가 많 거나 다른 일 을 해 야 하기 때문에 이 FIN 패 킷 을 보 내지 않 았 을 수도 있 습 니 다.
일반적으로 하나의 CLOSEWAIT 는 최소 2 시간 동안 유 지 됩 니 다.만약 어떤 건달 이 특별히 프로그램 을 썼 다 면, 당신 에 게 많은 CLOSE 를 만들어 줄 것 입 니 다.WAIT, 소모
당신 의 자원 은 일반적으로 방출 되 는 순간 을 기다 리 지 못 하면 시스템 은 이미 붕 괴 를 해결 합 니 다.
TCP / IP 인 자 를 수정 하여 이 시간 을 단축 시 킬 수 있 습 니 다: tcp 수정keepalive_*시리즈 매개 변 수 는 이 문 제 를 해결 하 는 데 도움 이 된다.
그러나 사실은 우리 의 프로그램 코드 에 문제 가 있 기 때문에 다음 과 같은 문제 가 있 습 니 다.
예 를 들 어 수 동적 으로 닫 힌 것 은 클 라 이언 트 입 니 다.
상대방 이 closessocket 을 호출 할 때, 당신 의 프로그램 은
int nRet = recv(s,....);
if (nRet == SOCKET_ERROR)
{
// closesocket(s);
return FALSE;
}
많은 사람들 이 그 closessocket 을 잊 어 버 렸 는데, 이런 코드 는 너무 흔 하 다.
제 가 이해 하 는 것 은 주동 적 으로 닫 힌 쪽 에서 FIN 을 수 동적 으로 닫 은 쪽으로 보 낸 후에 수 동적 으로 닫 힌 TCP 는 바로 하나의 ACK 에 응답 하고 위 응용 프로그램 에 ERROR 를 제출 하여 위의 SOCKET 의 send 또는 recv 를 SOCKET 으로 되 돌려 줍 니 다.ERROR, 정상 적 인 상황 에서 위 에서 SOCKET 로 돌아 가면ERROR 후 closessocket 을 호출 하면 수 동적 으로 닫 힌 쪽 의 TCP 는 FIN 을 보 내 고 자신의 상 태 는 LAST 로 변 합 니 다.ACK.
전재 출처 를 밝 혀 주세요.http://www.vimer.cn
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
최근 문제가 되고 있는 서버 스레드 중단 문제 해결우리의 응용 프로그램은 인터넷 하드디스크와 같은 다운로드 도구로 사이트의 방문량이 비교적 적지만 문제가 우리를 계속 괴롭히고 있다. 바로was 서버가 일정 시간 간격으로 라인을 끊고 시간이 길고 짧으며 5분 안에 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.