'WebSocket'에 해당되는 글 2건

  1. 2016.06.30 웹소켓 프레임 구조
  2. 2016.06.28 [HTTP] 웹소켓 핸드쉐이킹 (2)

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
웹소켓 프레임 구조  (0) 2016.06.30
C++의 Nested Namespace  (0) 2016.04.08
[cocos2d-x] Vibration(진동) 기능 사용하기  (0) 2016.02.22
[Lumberyard] What is Cloud Canvas?  (0) 2016.02.11
Posted by pjc0247
먼저 클라이언트에서 웹소켓 오픈 시, 서버로 아래와 같은 요청이 온다.
(일반적인 HTTP 요청의 형태에 몇몇 추가적인 헤더를 담아서 보내는 방식이다.)


여기서 살펴보야아 할 값은 Sec-WebSocket-Key인데, 이 값은 서버가 웹소켓 프로토콜을 제대로 이해하고 있는지를 구별하는 역할을 한다.

이제 서버에서는 프로토콜 업그레이드에 대한 응답을 보내주어야 한다.
상태 코드는 101번이고, 반드시 Sec-WebSocket-Accept 헤더에 알맞은 값을 채워서 보내야한다.

클라이언트로부터 받은 Sec-WebSocket-Key 값에 고정 GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 를 이어 붙인 후 SHA-1 해싱 -> base64로 인코딩한다.
(위의 GUID는 웹소켓 스펙에 정해진 고정 문자열이다.)

아래는 올바른 리스폰스의 예시 


이 요청을 보낸 후부터는 HTTP/1.1 프로토콜이 아닌 웹소켓 프로토콜로 데이터를 주고받는다.



이걸 C# 코드로 구현하면 아래와 같다.





Posted by pjc0247
TAG C#, HTTP, WebSocket