close_wait 상태의 발생 원인 및 해결

1812 단어 응용 서버socket
최근 에 온라인 이 필요 한 논리 server 는 대량의 배경 server 와 상호작용 을 해 야 하기 때문에 오늘 갑자기 대량의 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

좋은 웹페이지 즐겨찾기