Webserver 와 채팅 서버를 구현하면서 TCP 소켓, 웹 소켓을 모두 다뤄봤지만 정확한 차이와 개념을 공부해보자,,
우선 TCP/IP 소켓과 web소켓이 동작하는 layer가 다르기 때문에 OSI 7계층에 대한 이해가 필요하다
OSI 모델이란?
네트워크 통신을 위한 표준 규격 (ISO 국제표준화기구에서 정의함)
1. 일련번호
와 확인 응답 번호
일련번호
는 송신 측에서 수신 측에 이 데이터가 몇 번째 데이터인지 알려주는 역할을 한다.확인 응답 번호
는 수신 측이 몇 번째 데이터를 수신했는지 송신 측에 알려주는 역할을 한다. 예를 들어 10번 데이터를 수신하면 11번 데이터를 송신 측에 요청한다. 이를 확인 응답이라고 한다.→ 일련번호와 확인 응답 번호를 사용해서 데이터가 손상되거나 유실된 경우에 데이터를 재전송하는데 이를 재전송 제어 라고 한다.
2. 윈도우 크기
1. 포트번호
TCP통신에서는 소켓을 이용한 연결방식을 사용한다. 그로인해, 양방향 통신이 가능하게 되는데 양방향 통신이란, 클라이언트단과 서버단이 한번의 연결(connection) 확립 후 서로에게 요청을 보내 통신을 할 수 있게 해주는 것이다. (서버 -> 클라이언트, 또는 클라이언트 -> 서버) 또한, 클라이언트단과 서버단의 연결이 끊어지지않고 계속 연결을 유지해주어 실시간 소통이 가능하다.
일반적으로, 서버는 특정 컴퓨터 위에서 돌아가고 특정 포트넘버에 할당된 소켓을 갖는다. 이 서버는 클라이언트가 커넥션 요청을 만들기 위한 소켓을 리스닝하며 기다린다.
클라이언트 쪽에서, 커넥션이 성립된 경우, 소켓이 성공적으로 생성되며 클라이언트는 소켓을 서버와 상호작용하기 위해 사용할 수 있다.
소켓이란 네트워크 위에서 돌아가는 두 프로그램 간의 양방향 통신링크의 엔드포인트입니다. 소켓은 포트 넘버를 할당받아 TCP 레이어가 데이터의 목적지인 애플리케이션을 식별하도록 합니다. 엔드포인트는 IP 주소와 포트넘버의 조합이다.
즉 소켓은 엔드포인트. 즉 IP와 포트 넘버를 활용하여 만들어진 통신의 양 끝이다. 우리가 보통 웹서버를 만들때 80포트를 이용해서 만드는데, 이때 쓰는 엔드포인트도 IP + 포트 의 조합으로 소켓을 통한 통신을 하게된다.
위에서 TCP소켓 통신은 양방향 통신이며 실시간 통신이 가능하다고 했는데 왜 http통신은 단방향이 되는 것일까?
TCP통신이나 HTTP통신이나 데이터를 전송할 때 소켓이 사용되는것은 동일한데. 우선, HTTP통신이 소켓 기반인 이유는 애초에 HTTP는 TCP에 기반하여 만들어졌기 때문이다. 그렇기에, HTTP통신은 3-way handshake를 거치고 데이터 전송에도 동일한 소켓이 사용되는데, 이때 데이터전송에 사용되는 소켓의 통신방식이 TCP통신의 데이터전송에서 사용되는 소켓통신과는 다른 방식으로 사용이 된다. HTTP통신은 클라이언트-서버 모델로 클라이언트가 요청을 보내고 서버가 응답하는 형태로 이루어진다. 즉 서버는 클라이언트의 요청이 있을 때에만 클라이언트에게 데이터를 전송할 수 있는 것이다. (양방향 통신이라고 말할 수 있으려면 서버도 클라이언트에게 별도에 요청이 없을 때에도 데이터 전송이 가능해야 한다.)
양방향 통신을 위해서 소켓을 사용하도록 하는 프로그래밍을 소켓 프로그래밍이라 했는데, 반대로 HTTP통신을 하기 위한 프로그래밍을 HTTP 프로그래밍이라고도 한다. 하지만, HTTP 통신에서도 소켓을 사용한다고 했으니 꼭 소켓을 사용한다고 해서 소켓 프로그래밍이라고는 하지 않는다. 즉, 해당 소켓이 어떠한 용도로 사용되느냐에 따라 HTTP 프로그래밍이 될 수도 있고, 소켓 프로그래밍이 될 수도 있는것이다.
기존의 HTTP통신은 connectionless로 기본적으로 연결이 유지되지 않으며 단방향이라는 특징을 갖고있다. 그렇기에 이를 극복하고 양방향이면서 실시간 통신이 필요한 기능들에 대해 여러가지 시도들이 있었다.
대표적으로, http polling, http streaming등이 시도되었다. 하지만, 비효율적이며 HTTP통신에서의 한계점 때문에 다른 대안이 제시되었다.
두가지 방법 모두 Http를 통해 통신하기 때문에 요청과 응답시 둘 다 Header가 불필요하게 크다는 단점이 있다.
또한 Streaming 방식의 경우 서버에서 클라이언트로 메세지를 보낼수는 있지만 클라이언트에서 서버로 메세지를 보내는것에는 조금 어렵다는 문제점이 있다.
따라서 Http 환경에서 클라이언트와 서버간에 어려움 없이 양방향으로 통신이 가능하게 하기 위해서 HTML5 표준의 일부로 WebSocket이 만들어지게 되었다. (TCP 기반의 어플리케이션에선 그냥 TCP 소켓으로 양방향 통신 채팅서버 구현 가능 ex: IRC 서버)
웹 소켓은 일반 소켓(TCP 기반 소켓)처럼 양방향에 실시간 통신이 가능하며, IP와 포트를 사용한 통신을 한다는점에서 공통점을 갖고 있다. 하지만, 웹 소캣은 기본적으로 HTTP 기반 계층(7 layer)에서 작동한다는점에서 일반 소켓이 TCP 기반 계층(4 layer) 에서 작동한다는 점에서 다르다. 따라서 WebSocket과 TCP Socket은 엄연히 다른 것으로 보아야 한다.
웹 소켓을 기반으로 하는 통신은 WebSocket 프로토콜이라는 새로운 규약에서 이루어진다. 하지만, 웹 소켓 통신을 위한 별도의 포트는 없으며 포트 80,443(http:80, https:443)을 사용하도록 설계되어져 있다. 그렇기에 HTTP 프로토콜, HTTPS 프로토콜과도 호환이 되도록 설계되어져 있다고 하는 것이다.
WebSocket 프로토콜은 최초 접속시 HTTP, HTTPS 위에서 TCP connection을 거치고 그 이후에 웹 소켓을 이용해야하는 경우에 HTTP Upgrade header라는 걸 사용하여 HTTP 프로토콜에서 혹은 HTTPS 프로토콜에서 WebSocket 프로토콜로 전환시킨다.
따라서, WebSocket 프로토콜이 HTTP 프로토콜을 대체하는 개념은 아니고 상호보완하는 개념으로 볼 수 있다.
참고