WebSocket 업그레이드 실패 PCAP 분석: 101개의 스위칭 프로토콜, 프록시 헤더, TLS 및 연결 끊김
HTTP 101, 업그레이드 헤더, 연결 헤더, 프록시 스트리핑, TLS, 재설정 및 유휴 시간 초과를 포함한 패킷 캡처로 WebSocket 업그레이드 실패 문제를 해결하는 방법입니다.
WebSocket 실패는 종종 일반 브라우저 또는 애플리케이션 메시지 뒤에 숨어 있습니다. "WebSocket 연결 실패", "예기치 않은 응답 코드", "핸드셰이크 응답을 받기 전에 연결이 닫혔습니다.", "101 스위칭 프로토콜 누락" 또는 "소켓 연결이 끊어졌습니다." HTTP가 작동하는 것처럼 보이지만 실시간 트래픽이 작동하지 않는 경우 사용자는 "WebSocket 업그레이드 실패 pcap", "101 전환 프로토콜이 반환되지 않음", "nginx websocket 프록시 헤더" 및 "WebSocket 연결 재설정"을 검색합니다.
패킷 캡처는 HTTP 업그레이드 요청이 전송되었는지 여부, 서버가 '101 스위칭 프로토콜'을 반환했는지 여부, 프록시가 필수 헤더를 제거했는지 여부, TLS 성공 여부, 업그레이드 후 연결이 끊어졌는지 여부를 표시할 수 있습니다.
WebSocket 추적에는 종종 HTTP 핸드셰이크와 업그레이드 후 TCP 타임라인이 모두 필요하기 때문에 PCAP 수술이 유용합니다.
건강한 WebSocket 업그레이드의 모습
클라이언트는 업그레이드 헤더와 함께 HTTP 요청을 보냅니다.
GET /socket HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ...
Sec-WebSocket-Version: 13
The server replies:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: ...
그 후에는 연결이 더 이상 일반적인 HTTP 요청/응답 트래픽이 아닙니다. WebSocket 프레임을 전달합니다.
일반적인 업그레이드 실패
일반적인 원인은 다음과 같습니다.
- 프록시는
Upgrade헤더를 제거합니다. - 프록시는 '연결: 업그레이드'를 제거하거나 다시 작성합니다.
- 백엔드 경로는 WebSocket을 지원하지 않습니다.
- TLS 종료가 잘못된 업스트림으로 요청을 보냅니다.
- HTTP/2에서 HTTP/1.1로의 업그레이드 동작이 잘못 구성되었습니다.
- 101 대신 인증 리디렉션이 발생합니다.
- 백엔드는 400, 403, 404, 426, 502 또는 504를 반환합니다.
- 업그레이드 후 연결이 재설정됩니다.
- 유휴 시간 초과로 인해 자동 WebSocket이 닫힙니다.
상태 코드와 헤더가 중요합니다.
프록시 헤더 문제
역방향 프록시는 WebSocket 업그레이드 헤더를 올바르게 전달해야 합니다. 백엔드에 Upgrade: websocket이 표시되지 않으면 요청을 일반 HTTP로 처리할 수 있습니다.
패킷 증거:
- 클라이언트-프록시 요청에는 업그레이드 헤더가 포함됩니다.
- 프록시-백엔드 요청에 해당 항목이 없습니다.
- 백엔드는 101 대신 일반 HTTP 응답을 반환합니다.
이는 WebSocket 클라이언트 버그가 아니라 프록시 구성 문제입니다.
TLS와 SNI
보안 WebSocket(wss://)의 경우 TLS는 HTTP 업그레이드 전에 발생합니다. TLS가 실패하면 WebSocket 핸드셰이크가 시작되지 않습니다. DNS, TCP, TLS ClientHello, SNI 및 모든 TLS 경고 또는 재설정을 유지합니다.
TLS 경로가 입증될 때까지 업그레이드 헤더를 진단하지 마십시오.
101 이후 연결이 끊김
때때로 업그레이드가 성공한 다음 연결이 닫힙니다. 그것은 다른 실패입니다.
다음을 찾으세요:
- FIN 또는 RST 발신자.
- 유휴 시간 초과 기간.
- WebSocket 핑/퐁 활동.
- 프록시 읽기 시간 초과.
- TCP 재전송.
- 제로 창.
- 백엔드 프로세스를 다시 시작합니다.
고정된 간격으로 삭제가 발생하면 시간 초과 정책이 적용될 가능성이 높습니다.
Checklist
다음 워크플로를 사용하세요.
- DNS 및 TCP 연결을 유지합니다.
wss://에 대한 TLS 핸드셰이크를 확인하세요.- 클라이언트 업그레이드 요청 헤더를 검사합니다.
- 서버 응답 상태를 검사합니다.
- 예상되는 경우 '101 스위칭 프로토콜'을 확인하세요.
- 클라이언트-프록시 요청과 프록시-백엔드 요청을 비교합니다.
- 리디렉션 또는 인증 응답을 찾으세요.
- 업그레이드가 성공하면 업그레이드 후 FIN/RST/시간 초과를 검사합니다.
- 표시되는 경우 WebSocket 핑/퐁 타이밍을 유지합니다.
- 완전한 악수를 유지한 후에만 트림하십시오.
최종 진단
WebSocket 업그레이드 실패는 일반적으로 101 전환 프로토콜이 입증될 때까지 HTTP 핸드셰이크 또는 프록시 전달 문제입니다. 업그레이드 후 실패는 장기간 지속되는 TCP 시간 초과, 재설정 또는 애플리케이션 프로토콜 문제가 됩니다.
PCAP 수술은 두 단계를 모두 보존하는 데 도움이 되므로 모호한 WebSocket 오류를 헤더, 프록시 동작, TLS, 백엔드 응답 또는 연결 수명으로 추적할 수 있습니다.