네트워크 프로토콜 -웹소켓
웹소켓이 뭡니까?
WebSocket은 네트워크 통신을 위한 포로토콜 중 하나로, 웹 어플리케이션에서 실시간 양방향 통신을 지원하는데 많이 사용된다. 클라이언트와 서버 간에 지속적인 연결을 유지하고, 데이터를 실시간으로 주고 받을 수 있게 해준다.
일반적인 HTTP 통신과는 다르게, 연결이 맺어진 후 끊어지지 않고 유지되며, 이를 통해서 더 적은 지연시간으로 데이터를 주고받을 수 있다.
양방향 통신(Full-duplex)
- 웹소켓은 클라이언트와 서버가 동시에 서로에게 데이터를 보낼 수 있는 양방향 통신을 지원한다. 클라이언트가 서버에 요청을 보낸 후, 서버가 응답하는 일반적인 HTTP 통신과 구별된다. (일반적인 HTTP 통신: 기존 ajax 통신등도 당연히 포함된다)
실시간 통신
- 웹소켓은 실시간 통신에 최적화 되어 있어, 데이터를 매우 빠르게 송수신할 수 있다. Ajax의 경우 주기적으로 서버에 요청을 보내고, 받아야하기 때문에 실시간 통신에는 제약이 있다.
- 한번의 연결 설정 후, 클라이언트 - 서버는 연결이 계속 유지되고, 즉각적인 데이터 이동이 가능하다. 이 연결은 어느 한쪽이 명시적으로 연결을 종료시킬 때 까지 유지된다.
- 또한, AJAX는 주로 클라이언트 - 서버로의 요청에 의해 데이터가 전송되는 "반응형" 통신을 사용하지만, 웹소켓은 서버와 클라이언트가 항상 서로 데이터를 주고받을 수 있는 양방향 통신을 지원한다.
오버헤드 감소
- 웹소켓 연결은 초기 핸드셰이크를 통해 HTTP 프로토콜에서 웹소켓 포로토콜로 전환된 후에 추가적인 HTTP 헤더 없이 순수한 데이터를 송수신하는데 이는 네트워크 지연을 줄이고, 효율을 높인다.
핸드셰이크?
통신 포로토콜에서 클라이언트와 서버 간의 초기 연결을 설정하는 과정이 바로 핸드셰이크다. 이 과정에서 두 통신 단말은 서로의 존재를 확인하고, 통신을 시작하기 전에 필요한 설정 정보를 교환하는데 웹소켓에서는 http 프로토콜을 기반으로 하여금 웹소켓 연결로 설정을 바꾸는 과정이 포함된다.
클라이언트의 요청 : 클라이언트는 서버에 HTTP 요청을 보내며, 이 요청은 특별한 헤더를 포함하여 웹소켓 연결을 요청한다. ( websocket, upgrade가 포함된 헤더 )
-> 서버 응답 : 서버가 이 요청을 받고, 웹소켓이 지원될 경우 '101' 코드와 함께 연결을 전환시킨다. 그렇게 되면 핸드셰이크가 성공적으로 완료되며, 이후부터 HTTP 포로토콜에서 웹소켓 연결로 변환되어 데이터가 송수신된다.
핸드셰이크가 오버헤드를 감소시키는 방법
핸드세이크가 일어날 직후는 추가적인 정보를 교환하는 과정이므로, 오버헤드가 발생하나 그 후에 연결은 HTTP 헤더를 반복적으로 보내지 않아도 되므로 전체적으로는 오버헤드를 감소시킨다.
일반적으로 HTTP 요청은 헤더를 포함히기 때문에 많은 수의 데이터 패킷을 주고받을 경우 비효율적이게 된다.
이러한 비효율적인 작은 데이터패킷들을, 핸드셰이크 이후에 웹소켓으로 연결된다면 헤더를 포함하지 않는 전송을 하게되니 효율이 좋아지고 오버헤드가 감소되는 것이다.
데이터 전송
연결이 웹소켓으로 전환되면, 서버 - 클라이언트는 메시지를 프레임 단위로 주고받을 수 있게된다. 이 프레임은 텍스트, BINARY DATA를 포함할 수 있고 서버와 클라이언트는 이를 통해 실시간으로 데이터를 교환할 수 있다.