[Programming] HTTP
1. http는 단방향통신
- http는 양방향이 되지 않는 모델
- request, response 형태로 단방향만 가능
- 또한 http는 서버에서 원하는 타이밍에 클라이언트에게 데이터를 보낼 수가 없음
- 애초에 클라이언트만이 서버에 request를 보낼 수 있고 서버는 요청에 응답하는 것만 가능
2. http를 양방향으로 하고 싶다면?
- 웹에서 서버가 반대로 클라이언트에게 요청하고 싶은 일들이 많아짐
- 현재는 웹소켓을 사용하지만 http만 있었을 때 해결하는 방안들
2.1. polling
- 주기적으로 서버에서 클라이언트한테 일정한 간격으로 응답
- 주기적으로 몰아서 물어보는게 가능하므로 자동으로 배치프로세싱(일괄처리)되어서 db튜닝하는 효과가 있음
- 실시간으로 주는 건 불가능
- 보낼 데이터가 없어도 계속해서 데이터를 줘야 하기 떄문에 서버의 리소스 낭비
- 단점
- 주기적으로 물어보는 것은 좋으나 실시간성이 문제
- 실시간 느낌을 주기 위해 시간 간격을 줄이면 http는 header가 매우 무거운 프로토콜 중 하나라 서버에 매우 부하를 주게 됨
2.2. long polling
- polling의 단점을 극복하기 위해 만든 새로운 기법
- 기본방식은 polling 처럼 무한히 물어보는 것
- 차이점은 polling은 주기적으로 물어본다면 long polling은 일단 보내고 timeout 될 때까지 무한정 기다림
- 서버가 클라이언트한테 연결을 끊어도 되는지 물어보고 클라이언트가 다시 연결 여부를 알려줌
- 항상 연결이 유지
- 변경에 민감하여 사실상 실시간으로 통신이 가능
- 데이터가 주어지는 즉시 바로 응답이 가능하기 때문에 채팅을 구현할 때 많이 사용하는 기술 중 하나
- 단점
- 클라이언트에서 요청이 매우 잦으면 polling의 주기보다 훨씬 데이터를 많이 보내게 되어 서버 과부하가 생길 수 있음
2.3. streaming
- 클라이언트가 request를 보내면 connection을 맺고, 이를 유지하면서 서버가 계속 데이터를 보내는 방식
- 단점
- 클라이언트가 서버에 메시지를 보내고 싶다면 새로운 connection을 맺어야 함
3. Websocket
- HTML5 표준 기술로, 사용자의 브라우저와 서버 사이의 양방향 연결 채널을 구성
- 웹소켓 API를 통해 서버로 메세지를 보내고, 요청 없이 응답을 받아오는 것이 가능(실시간)
- 웹소켓은 매우 단순한 API로 구성되어 있으며, 하나의 HTTP 접속으로 양방향 메시지를 자유롭게 주고받을 수 있음
- http request 헤더에 비해 엄청 가벼움
- HTTP와의 차이점
- 웹소켓은 접속 확인에 HTTP를 사용하지만 그 후의 통신은 WS라는 프로토콜을 이용해서 header가 작아 오버헤드가 적다는 특징이 있음
- 장시간 접속을 전제로 connection이 맺어진 상태라면 클라이언트나 서버로부터 데이터 송신이 가능
- 또한, 데이터 송수신에 각각 connection을 따로 맺을 필요가 없어 하나의 connection으로 데이터를 송수신할 수 있음
- 웹소켓을 사용하는 경우
- 실시간 양방향 데이터 통신이 필요할 때
- 많은 수의 동시 접속자를 수용해야 할 때
- 브라우저에서 TCP 기반의 통신으로 확장해야 할 때
- 개발자에게 사용하기 쉬운 API가 필요할 때
- Service Oriented Architecture로 확장해야 할 때
참고
This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄.
댓글남기기