2009-09-29 3 views
0

서버에 tcp 연결을 한 후 리눅스 응용 프로그램을 닫고 Socket.close()가 호출됩니다.TIME_WAIT의 tcp 연결은 재접속을 허용하지 않습니다.

netstat -pant를 확인하면 연결이 TIME_WAIT 상태 인 것으로 확인됩니다.

이렇게하면 동일한 포트를 사용하여 연결하기 때문에 서버에 즉시 연결할 수 없습니다. 대신, 다시 연결하기 전에 TIME_WAIT 상태의 시간 초과 연결을 기다려야합니다.

나는 set-so_timeout(), set_keepalive(), set_so_linger() 및 set_reuseaddr() 소켓 메쏘드를 가지고 놀지 않고 놀았습니다.이 스펠링의 정확한 철자법은이 게시물에서 올바르지 않을 수 있습니다.

내 질문은 어떻게 즉시 연결을 다시 만들 수 있도록 TIME_WAIT 상태에서 연결을 해제합니까?

알려 주시기 바랍니다.

감사합니다, jbu

답변

5

TIME_WAIT에서 연결을 얻을 수있는 가장 좋은 방법입니다 (놀랍게도) TCP/IP를 작동하는 방법 :-)

을 기다려야한다. 세션은 튜플 (sourceIP, sourcePort, destIP, destPort, protocol)으로 식별되며 재사용 할 수없는 이유는 네트워크의 패킷이 어딘가에 남아있을 수 있기 때문입니다.

일반적으로 TIME_WAIT 상태는 최대 패킷 수명의 두 배이며, 이 아니기 때문에은 이전 세션에서 패킷이 표시 될 수 있으므로 (이 경우 현재 세션이 망가질 수 있습니다)

이상적으로 다른 소스 포트에서 연결해야 세션을 즉시 열 수 있습니다.

조심해야 할 또 다른 사항은 잘못 처리 된 세션입니다. 저는 항상 클라이언트가 세션을 종료하고 깨끗이 종료해야한다는 가이드 라인을 구독했습니다. 이렇게하면 수명이 긴 반 폐쇄 세션의 가능성을 최소화 할 수 있습니다.

+0

예, 다른 포트가 문제를 해결하고 지금 사용합니다. 그러나 동일한 소스 포트를 사용하려는 경우 so_linger 메소드 설명이 작동하지 않는 것처럼 보입니다. 왜 그런지 모르겠습니다. – jbu

+1

SO_LINGER는 권장하지 않습니다. 기껏해야 비 -BSD 플랫폼에 대한 지원은 산발적입니다. – paxdiablo

+0

다른 연결 문자열을 사용하는 것이 우아한 해결책이라고 생각하지 않습니다. TCP/IP가 소켓에서 모든 것을 비우고 연결을 닫을 수있는 방법이 있어야합니다. –