본문 바로가기

기타

웹소켓 프레임 구조

WebSocket Data Frame Format



FIN : 현재 패킷이 마지막 조각임을 나타냅니다.
RSV1 ~ 3 : 특별히 지정되지 않은 경우 기본적으로 항상 0이어야 합니다. 0이 아닌 값을 지정할 경우 에러를 발생합니다. (발생시켜야 합니다.)

OPCODE : 패킷의 타입입니다.

MASK : PayloadData가 마스킹되었는지 여부를 나타냅니다. 클라이언트가 서버로 보내는 패킷은 항상 1이어야 합니다. 서버가 클라이언트로 보내는 패킷은 항상 0이어야 합니다.

PAYLOAD_LEN : PayloadData의 길이입니다. 이 값이 125이하일경우 이 필드 자체가 PayloadData의 실제 길이를 나타내며 126/127일 경우 뒤따라올 EXTENDED_PAYLOAD_LEN의 길이를 나타내는 플래그 역할을 합니다.

EXTENDED_PAYLOAD_LEN : PAYLOAD_LEN이 126 또는 127일 때에만 존재합니다. 126일 경우 2바이트 (unsigned short) 값이고 / 127일 경우 8바이트 (long long) 값입니다.

MASKING_KEY : 이 필드는 MASK가 1일때만 존재합니다. PayloadData를 언마스킹 할 때 사용할 키입니다.

PAYLOAD_DATA : 실제 데이터입니다. (UTF-8인코딩된 문자열 또는 바이너리)



주의

PAYLOAD_DATA 필드의 사이즈가 가변인건 당연하지만

EXTENDED_PAYLOAD_LEN 필드와 MASKING_KEY의 사이즈도 가변적인것에 주의해야 합니다.


* EXTENDED_PAYLOAD_LEN : 0바이트일수도 또는 2바이트 / 혹은 8바이트일 수 있습니다.

* MASKING_KEY : 0바이트일수도 / 4바이트일수도 있습니다.


예시

* 클라이언트서버에게 100바이트 문자열을 보낼 경우

PAYLOAD_LEN : 보내려는 사이즈가 125이하이므로 100을 그대로 담습니다.

EXTENDED_PAYLOAD_LEN : 이 필드는 존재하지 않습니다.

MASK : 클라이언트가 보내는 패킷은 항상 마스킹되어야 합니다. 

MASKING_KEY : MASK 값이 1이므로 이 필드는 존재합니다. 클라이언트는 이 키로 PAYLOAD_DATA를 마스킹해야 합니다.

PAYLOAD_DATA : 100바이트의 UTF-8 인코딩된 문자열을 전송합니다. 


패킷의 사이즈는

고정 2바이트(FIN/RSV/OPCODE/MASK/PAYLOAD_LEN)

MASKING_KEY 4바이트

PAYLOAD_DATA 100바이트

총 106바이트입니다.

* 서버클라이언트에게 100바이트 문자열을 보낼 경우

PAYLOAD_LEN : 보내려는 사이즈가 125이하이므로 100을 그대로 담습니다.

EXTENDED_PAYLOAD_LEN : 이 필드는 존재하지 않습니다.

MASK : 서버가 보내는 패킷은 항상 마스킹되면 안됩니다.

MASKING_KEY : MASK 값이 0이므로 이 필드는 존재하지 않아야 합니다. PAYLOAD_DATA는 마스킹되지 않은 채 보내집니다.

PAYLOAD_DATA : 100바이트의 UTF-8 인코딩된 문자열을 전송합니다. 


패킷의 사이즈는

고정 2바이트(FIN/RSV/OPCODE/MASK/PAYLOAD_LEN)

PAYLOAD_DATA 100바이트

총 102바이트입니다.


* 클라이언트서버에게 200바이트 문자열을 보낼 경우

PAYLOAD_LEN : 보내려는 사이즈가 125보다 크고 unsigned short 범위 이내이므로 126으로 설정합니다.

EXTENDED_PAYLOAD_LEN : 이 필드는 2바이트의 길이를 가지게 됩니다. 값은 200을 적습니다.

이하생략



'기타' 카테고리의 다른 글

[C++] ToString() 사용하기  (0) 2016.08.12
[VSCode] 확장 프로그램 작성하기  (0) 2016.07.11
C++의 Nested Namespace  (0) 2016.04.08
[cocos2d-x] Vibration(진동) 기능 사용하기  (0) 2016.02.22
[Lumberyard] What is Cloud Canvas?  (0) 2016.02.11