1. WebSocket 프레임의 기본 구조
- WebSocket 프레임은 TCP 기반의 스트림 지향 프로토콜에서 메시지 단위의 통신을 가능하게 하는 핵심 구조입니다.
- RFC 6455에 정의된 WebSocket 프레임의 구조는 다음과 같습니다.
- 클라이언트에서 서버로(또는 그 반대) 전송되는 모든 프레임은 같은 구조를 가지고 있습니다.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
- FIN
- 프레임의 마지막 프래그먼트 여부를 나타냅니다.
- 1이면 마지막 프래그먼트, 0이면 연속 프래그먼트가 있음을 의미합니다.
- RSV1, RSV2, RSV3: 확장을 위한 예약 비트
- Opcode: 메시지 타입 (text, binary, ping, pong, close, continuation)
- Mask: 클라이언트 → 서버 메시지에만 사용되는 마스킹 여부
- 클라이언트가 전송하는 프레임은 반드시 마스킹 필요
- 클라이언트에서 오는 메시지는 반드시 마스킹되어야 하므로, 서버는 이 값이 1일 것으로 예상해야 합니다
- 실제로 스펙에 따르면 서버는 클라이언트가 마스킹되지 않은 메시지를 보내는 경우 해당 클라이언트와의 연결을 끊어야 합니다.
- Payload Length: 페이로드 길이 표현
- Masking Key: 마스킹 키 (4바이트)