본문 바로가기

C#

[HTTP] 웹소켓 핸드쉐이킹

먼저 클라이언트에서 웹소켓 오픈 시, 서버로 아래와 같은 요청이 온다.
(일반적인 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# 코드로 구현하면 아래와 같다.





'C#' 카테고리의 다른 글

[C#] Async,Await의 내부  (0) 2016.08.29
[C#] async void / Task  (0) 2016.07.18
[C#] Mono 환경인지 구분하기  (0) 2016.06.21
[NUnit] Callback 방식의 API 테스트하기  (1) 2016.06.16
[C#] Thread.Abort시에도 안전한 코드 작성하기  (0) 2016.06.13