호출은 410/3112로 종료됩니다.
호출이 410/3112 오류로 끝나는 이유는 클라이언트가 다른 엔드포인트에 연결할 수 없고 릴레이 후보가 수집되지 않기 때문입니다. 이 410/3112 오류 코드는 네트워크 문제, 방화벽 제한 또는 잘못된 구성 설정으로 인해 미디어 경로를 설정할 수 없는 경우에 발생할 수 있습니다. 따라서 피어가 직접 또는 릴레이 연결을 설정할 수 없습니다.
클라이언트가 다른 피어에 직접 연결할 수 있는 경우에는 릴레이 후보가 필요하지 않습니다. 그러나 WebRTC가 릴레이 후보를 수집하지 못하는 경우 TURN(NAT에 대해 릴레이를 사용하는 순회) 서버 구성 또는 네트워크 제한에 문제가 있는 경우가 많습니다. 릴레이 후보는 제한적인 네트워크 환경에서 연결을 설정하는 데 매우 중요합니다.
SDK를 사용하여 검색하는 방법
다음 코드 조각을 사용하여 호출이 종료되는 이유를 알아볼 수 있습니다.
call.on('stateChanged', () => {
if (call.state === 'Disconnected') {
if (call.callEndReason.code === 410 && call.callEndReason.subCode === 3112) {
// show error message
}
}
});
코드 및 하위 코드를 이해하려면 호출 코드 및 하위 코드 오류에 대한 이해를 참조 하세요.
미디어 경로를 설정할 수 없으면 코드 410 및 하위 코드 3112로 호출이 종료됩니다.
또한 SDK는 networkRelaysNotReachable UFD 이벤트를 트리거합니다.
이벤트를 캡처하는 방법을 보여 주는 코드 조각은 networkRelaysNotReachable UFD
다음과 같습니다.
call.feature(Features.UserFacingDiagnostics).network.on('diagnosticChanged', (diagnosticInfo) => {
if (diagnosticInfo.diagnostic === 'networkRelaysNotReachable') {
if (diagnosticInfo.value === true) {
// show a warning message on UI
} else {
// The networkRelaysNotReachable UFD recovered, notify the user
}
}
});
Log Analytics 또는 통화 진단 도구로 문제를 분석하는 방법
사용자가 전화를 걸 수 없다고 보고하면 통화 진단 도구를 사용하여 오류 원인을 분석할 수 있습니다. 사용자 호출을 디버그하려면 호출 ID가 필요합니다. 방화벽이 릴레이 연결을 차단하여 사용자의 호출이 실패한 경우 호출 개요 페이지에서 최종 코드 및 하위 코드가 410 및 3112로 표시됩니다.
또한 호출 문제 페이지에서 networkRelaysNotReachable UFD 이벤트를 찾을 수도 있습니다.
사용자 작업 또는 이벤트의 타이밍을 이해하려면 타임라인 페이지에서 세부 정보를 확인할 수 있습니다.
이 예제에서 사용자는 16:41:47에 이벤트를 수신 networkRelaysNotReachable UFD
하고 16:41:49에 상태 변경 이벤트를 호출합니다.
통화 진단 도구는 단일 호출을 디버깅하는 데 필요한 개요 및 정보를 제공합니다. 이 문제가 발생하는 사용자 수 또는 사용자가 문제를 경험하는 빈도를 이해하려면 Log Analytics 도구를 사용하여 이 문제에 대한 인사이트를 얻을 수 있습니다.
예를 들어 지난 7일 동안 하위 코드 3112와 연결이 끊긴 호출 ID를 가져오려면 다음 쿼리를 실행할 수 있습니다.
ACSCallSummary
| where ParticipantEndSubCode == 3112
| project TimeGenerated, CorrelationId, ParticipantId, Identifier, CallType
시간 차트를 렌더링하여 하위 코드 3112로 끝나는 일별 호출 수를 이해할 수도 있습니다.
ACSCallSummary
| where ParticipantEndSubCode == 3112
| summarize count() by bin(TimeGenerated, 1d)
| render timechart
시간 차트는 동일한 ACS 리소스 ID 아래의 사용자 개요만 제공합니다. 보다 구체적인 쿼리를 실행하면 시간 차트에서만 즉시 표시되지 않는 패턴 또는 변칙을 식별하여 문제의 근본 원인을 보다 정확하게 파악할 수 있습니다.
예를 들어, 하위 코드 3112로 끝나는 호출 수가 급증하면 문제의 발생 비율이 동일하게 유지되는 동안 호출의 양이 많기 때문일 수 있습니다. 또는 급증은 여러 번 재시도한 특정 사용자에 기인할 수 있으며 모든 시도가 하위 코드 3112로 실패했습니다.
이 쿼리에서는 앱이 각 개인에 대해 동일한 사용자 식별자를 유지한다고 가정하여 사용자 식별자를 기반으로 데이터를 분석합니다.
ACSCallSummary
| summarize Total = count(), SuccessCount = countif(ParticipantEndSubCode == 0), SubCode3112Count = countif(ParticipantEndSubCode == 3112) by Identifier
| where SubCode3112Count > 0
| order by SubCode3112Count desc
이 예제에서는 한 사용자가 총 180건의 호출을 수행했으며, 그 중 160건의 호출이 성공했으며 하위 코드 3112로 두 번의 호출만 실패했습니다. 이 패턴은 다시 시도하여 해결할 수 있는 일시적인 네트워크 문제를 제안합니다. 반면에 다른 사용자에게는 총 6개의 호출이 있었는데 모두 하위 코드 3112로 실패했습니다. 이 하위 코드 값의 일관성은 재시도에 도움이 되지 않는 해당 사용자에 대한 네트워크 구성 문제가 발생할 가능성이 있음을 나타냅니다.
완화 또는 해결 방법
사용자에게 410/3112 오류가 지속적으로 발생하는 경우 방화벽 설정을 확인하는 것이 좋습니다. 사용자는 네트워크 권장 사항 문서에 설명된 방화벽 구성 지침을 따라야 합니다. 사용자 또는 관리자가 NAT(네트워크 주소 변환) 설정을 확인하고 방화벽 정책이 UDP(사용자 데이터그램 프로토콜) 패킷을 차단하는지 확인합니다. 방화벽 설정은 사용자의 컴퓨터로 제한되지 않습니다. 사용자가 회사 환경에 있는 경우 회사의 방화벽도 구성해야 할 수 있습니다.
또한 애플리케이션에서 사용자 지정 TURN 서버를 사용하는 경우 지정된 IP, 포트 및 프로토콜이 방화벽에 의해 차단되지 않도록 합니다.
애플리케이션의 경우 사용자 연결 진단 기능의 이벤트를 처리하고 그에 따라 사용자에게 알리는 것이 중요합니다. 이렇게 하면 사용자는 문제를 인식하고 네트워크 환경을 해결할 수 있습니다.
드물게 사용자의 방화벽 설정이 올바른 경우에도 이 오류 코드가 임의로 표시됩니다. 동일한 사용자가 이전에 연결하고 성공적으로 호출할 수 있었던 경우 이 문제는 네트워크 조건의 변경 때문일 수 있습니다. 일시적인 문제일 수 있습니다. 통화를 시작하거나 다시 참가해 보세요.