2014-09-16 1 views
0

서버와 통신하는 UDP 클라이언트가 있습니다.시간 초과 후 UDP 응답이 수신되었습니다.

서버는 각 요청마다 단일 응답을 제공합니다.

클라이언트가 요청을 보내고 5 초 동안 응답을 기다립니다.

서버의 응답을 5 초간 수신하지 못한 경우 - 클라이언트는 패킷이 네트워크에서 손실되었다고 가정합니다 (UDP ...). 로그에 보고서를 쓰고 다음 요청을 보냅니다.

그러나 때로는 네트워크에서 지연이 발생하고 서버 응답이 5 초 후에 발생합니다.

시나리오 설명 :

클라이언트가 "X"라는 패킷을 보냈습니다.

5 초의 시간 초과가 만료되었으며 클라이언트에서 "X"가 손실 된 패킷이라고보고합니다.

클라이언트가 "Y"라는 다른 패킷을 보냈습니다.

"X"에 대한 서버의 응답이 이제 클라이언트로 전송됩니다.

클라이언트는 응답이 요청과 호환되지 않는다고보고 로그에보고합니다.

클라이언트가 "Z"라는 다른 패킷을 보냈습니다.

이제 "Y"에 대한 서버의 응답이 클라이언트로 전달됩니다.

클라이언트는 응답이 요청과 호환되지 않는다고보고 로그에보고합니다.

그리고 이것은 무한 루프입니다!

우리는 무엇을 할 수 있습니까?

+0

클라이언트가 가장 최근의 요청과 일치하지 않는 응답을 받으면 클라이언트가 실제 응답을 기다리지 않는다는 것을 말합니까? (전체 5 초를 기다리지 않습니다)? – nos

+0

거의 처리가 6 초 이상 걸립니다 (식별 할 수 없음). –

+0

그래, 내가 물었던 질문은 어떨까? 클라이언트가 예기치 않은 응답을받은 직후에 새로운 요청을 보냅니 까? – nos

답변

0

많은 UDP 기반 프로토콜에는 주어진 응답이 속한 요청을 나타내는 식별자가 포함됩니다. 클라이언트는 식별자를 선택하여 요청의 일부로 서버에 전송 한 다음 서버는 응답에서이를 다시 에코합니다. 이를 통해 클라이언트는 요청에 대한 응답을 특히 사용자가 설명하는 것과 같은 상황에서 일치시킬 수 있습니다. 계속 진행 한 후 클라이언트가 X에 대한 응답을 수신 한 경우 해당 응답을 무시할 수 있습니다.

+0

고맙습니다. 시도해 볼게. –

+0

예 - 일명 '시퀀스 번호':) –

관련 문제