웹소켓 WebSocket
http 에서 server쪽에서 client 쪽에 update 를 하려면?
이것은 기본적으로 불가능하다. 단순하게 생각하면, server 가 request 를 보낸다고 하면, 그것을 받아줄 server가 존재해야 한다. 그럼 어떻게 할까?
예전에는 이것을 위해서 계속 client 에서 물어보는 방법을 택했다.
1. polling
- 계속 client 에서 server에게 물어보는 것이다. 너 나한테 뭐 보낼것 없니? 라고. 그러다 서버가 그래 이것좀 처리해줘 하고 주면, 그것을 받아서 처리한다.
- 이것의 문제는 쓸데없이 자꾸 server에게 request 를 보내야 한다는 것이다. 그냥 단순히 물어보기만 하는 request 라도 서버는 그것이 단순히 물어보는 request인지를 판별하기 위한 resource를 소모한다. 그러므로 많은 client 가 동시에 그런일을 한다고 가정한다면 이것은 꽤나 부하가 될 수 있다.
- ref. 1 에 long polling 이 있는데, 그것은 short polling 보다 비효율적이다. long polling 은 request 를 받은 서버가 client 와 connection 을 오랜시간동안 유지한다는 이야기인데, 이렇게 되면 특정시간내에 더 적은client를 처리할 수 밖에 없다.
그런데 이제 browser에서 SSE 라는 것을 지원하기 시작했다.(2009년 4월)
2. SSE(Server Sent Event)
- client 에서 한번 서버와 연결한 이후 주기적으로 서버는 이벤트를 보낼 수 있게 된다.
- 양방향(full duplex)는 아니다. 서버에서만 보내게 된다.
- 예를 들어, 주식의 실시간차트 같은 것들을 이 SSE로 구현할 수 있다.
3. WebSocket
- WebSocket protocol 은 2011년에 표준화 됐다.[ref. 3]
- 서버측에서 client 로 event를 보내는 방법을 제공해 준다.
- 기본적으로 http 가 사용하는 TCP 는 양방향 통신이 가능했지만, HTTP 는 그렇지 않다.
- 그래서 이 WebSocket은 TCP 위에 새로운 protocol 을 만들어서, polling을 하지 않고, client server간의 event를 수시로 아무때나 주고받을 수 있도록 connection 을 열어놓도록 설계했다.
WebSocket
connection 을 맺을 때는 http header에 특정 field를 넣어줘야 한다. 그러면 browser에서 이 header를 보고 WebSocket protocol 로 전환한다. 그리고 나서 browser가 서버쪽에 Sec-WebSocket-Key
에 random하게 만든 key를 base64-encoding 해서 보내게 된다. 그러면 서버는 응답에 Sec-WebSocket-Accept
를 보내준다. 그리고 이후로 data를 WebSocket protocol 을 이용해서 주고받게 된다.(아래 그림 참고)
client --> server
--------------->
Sec-WebSocket-Version: 13\r\n
Sec-WebSocket-Key: lXp6HCmTm4HP8Roz/CmoOA==\r\n
Connection: Upgrade\r\n
Upgrade: websocket\r\n
Host: localhost:8080\r\n
client <-- server
<----------------
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: K/PoUF1zivlox8EW6nXD9C9qYDM=\r\n
댓글 없음:
댓글 쓰기