[컴][네트워크] 웹소켓 WebSocket

웹소켓 / 프로토콜 / 정의 / 동작 / 테스트

웹소켓 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

websocket의 packet

예시

Reference

  1. Network Protocols behind Server Push, Online Gaming, and Emails
  2. 쿠…sal: [컴][웹] 간단하게 주기적으로 message 를 수신하는 web page
  3. WebSocket - Wikipedia

댓글 없음:

댓글 쓰기