웹이란?
HTTP 프로토콜을 이용하여 데이터를 주고 받을 수 있는 환경
HTTP란?
'Hyper Text Transfer Protocol'의 약자로 Hyper Text를 전송하는 규약
Hyper Text란?
초월한다는 의미인 'hyper'와 문서라는 의미인 'text'의 합성어로 문서를 초월하여 다른 문서로 이동할 수 있는 문서
소켓이란?
우리말로 콘센트, 꽂는 곳, 구멍이라는 의미로 서로 다른 무언가가 연결되는 부분을 의미함
컴퓨터에서 소켓이란 데이터를 주고 받는 통로/구멍이라고 생각하면 됨
웹 소켓이란?
웹 상에서 지속 가능한 양방향 통신 통로
웹소켓 프로토콜은 2011년 IETF에서 RFC 6455로 표준화되었고, Web IDL의 웹소켓 API는 W3C에서 표준화 되었다.
웹 소켓의 등장배경?
초기의 웹은 http를 이용한 간단한 문서요청만 있었지만 시간이 지나면서 동적인 문서를 요청하기 시작하였고 서버와 실시간으로 데이터를 주고 받기 위한 것도 필요하게 되었다. 그래서 polling, long polling, streaming과 ajax와 같은 방식을 이용하여 서버와 클라이언트가 실시간으로 통신하는 것 처럼 보이게 되었지만 http의 근본적인 한계인 단방향통신을 극복하지 못했다. 그래서 HTML5에서 웹소켓이 등장하게 되었다.
소켓의 구조는 어떻게 발전했나?
Java OIO 방식으로 소켓 통신을 하게 된다면 서버입장에서 하나의 client당 하나의 Thread가 필요하게 된다.
이런 구조는 접속자 수에 따라 많은 양의 Thread가 생성될 수 있고 그것은 바로 많은 Context-switching과 Heap 사용을 초래하게 된다.
Java OIO 방식의 비효율을 개선하기 위해 Java NIO가 등장했다.
NIO 방식은 client의 연결마다 Thread를 생성하지 않는다.
Selector라는 클래스가 가지고 있는 Key에 대한 I/O 이벤트를 감시하고 있으며 Accept, Read, Write, Connection Closed와 같은 이벤트를 감시해서 non-blocking하게 동작한다.
/**
* Selector를 open하고 ServerSocket을 configureBlocking(false)로 주게 되면 non-blocking하게 동작하게됨
*/
try (final Selector selector = Selector.open();
final ServerSocketChannel serverSocket = ServerSocketChannel.open();) {
final InetSocketAddress hostAddress =
new InetSocketAddress(Constants.HOST, Constants.PORT);
serverSocket.bind(hostAddress);
serverSocket.configureBlocking(false);
serverSocket.register(selector, serverSocket.validOps(), null);
while (true) {
final int numSelectedKeys = selector.select();
if (numSelectedKeys > 0) {
handleSelectionKeys(selector.selectedKeys(), serverSocket);
}
}
}
JAVA OIO (Old I/O)
JAVA NIO (New / Non-blocking IO)
'Web Server' 카테고리의 다른 글
Netty를 이용한 http 서버랑 websocket을 구현 (0) | 2020.04.12 |
---|---|
동기/비동기란? (0) | 2020.04.08 |
Event-Driven (0) | 2020.03.11 |
오버헤드 (Overhead) (0) | 2020.03.11 |