본문 바로가기

Network

[Network] 소켓과 소켓 통신

인터넷 프로토콜 스택 4계층을 공부 중 "애플리케이션 계층에서 데이터가 소켓 라이브러리를 통해 인터넷 계층으로 전송된다." 를 보고 소켓은 무엇인지에 대한 의문이 생겼다.

소켓이란?

소켓의 등장

통신이 일어나는 과정을 단계별로 파악하기 위해서 네트워크에서 통신이 일어나는 과정을 7단계로 나누어 네트워크를 관리한다.이를 OSI 7계층이라고 하며, 계층 간에 존재하는 네트워크 통신을 위한 규약인 레이어별 프로토콜이 있다.

 

하지만, 네트워크를 관리하기 위해서 계층만 나누는 걸로는 한계가 있다. 레이어별 프로토콜은 일종의 통신 규약일 뿐 프로토콜 구현을 위해 안에 들어갈 구체적인 구현부인 함수가 필요하기 때문이다. 소켓은 이러한 함수들의 body를 제공한다. 즉 프로토콜의 세부적인 명세를 일일이 정의할 필요없이 소켓을 활용하면 된다.

 

 

소켓은 엔드포인트이다. 

일반적으로, 서버는 특정 컴퓨터 위에서 돌아가고 특정 포트넘버에 할당된 소켓을 갖는다. 이 서버는 클라이언트가 커넥션 요청을 만들기 위한 소켓을 리스닝하며 기다린다. 클라이언트 쪽에서, 커넥션이 성립된 경우, 소켓이 성공적으로 생성되며 클라이언트는 소켓을 서버와 상호작용하기 위해 사용할 수 있다.(소켓 통신 그림 추가)

 

다시 말해 소켓은 프로그램이 네트워크에서 데이터를 주고받을 수 있도록 네트워크 환경에 연결할 수 있게 만들어진 연결부이다. 전송 계층 위에 놓여 전송 계층의 프로토콜 제어를 위한 코드를 제공하기 때문에 애플리케이션 계층에 속하는 프로세스는 반드시 소켓을 거쳐 전송 계층으로 데이터를 전송하거나 응답을 받는다. 즉 소켓은 통신의 양 끝단으로 엔드포인트이다.엔드포인트는 호스트를 식별하는 IP주소와 호스트 내 프로세스를 식별하는 Port 번호의 조합으로 이루어진 최종 목적지를 나타낸다.

 

 

소켓의 종류는 프로토콜의 종류에 의해 결정된다.

소켓의 종류는 프로토콜의 종류에 따라 신뢰성 있는 연결을 하는 TCP를 기반으로 데이터를 전송하는 스트림 소켓과 빠른 속도로 연결을 하는 UDP를 기반으로 데이터를 전송하는 데이터 그램 소켓이 있다.

 


소켓은 무엇인지 찾아보다가 소켓 통신과 HTTP 통신의 차이점을 설명하는 글을 많이 찾았다. HTTP 통신에도 소켓 라이브러리가 사용되는데 뭐가 다르지? 라는 의문이 생겼다.

HTTP 통신과 소켓 통신의 차이

단방향 통신인 HTTP 통신

클라이언트에서 서버로 요청을 보내고 서버가 응답하는 방식(단방향 통신)으로 이루어지며 JSON, HTML, Image 등 다양한 데이터를 주고 받을 수 있다. 서버는 응답한 후 연결을 바로 종료하기 때문에 실시간 연결이 아닌 데이터 전달이 필요한 경우에만 요청을 보내는 상황에 유리하다. 최근에는 Keep Alive 옵션을 주어 일정 시간동안 커넥션을 유지하기도 한다.

 

 

양방향 통신인 소켓 통신

클라이언트와 서버 양쪽에서 특정 포트를 통해 서로에게 데이터를 전달하는 방식(양방향 통신)으로 이루어진다. 소켓 통신에서 서버는 요청을 기다릴 필요가 없다. 데이터 전달 후 연결이 끊어지는 것이 아니라 계속해서 연결을 유지하기 때문에 클라이언트와 서버가 실시간으로 계속해서 데이터를 주고 받아야 하는 경우인 실시간 동영상 스트리밍이나 온라인 게임등에 사용된다. 하지만, 계속해서 연결을 유지한다는 점에서 HTTP 통신에 비해 더 많은 리소스를 소모하게 된다.

 

 

HTTP 통신에도 소켓이 사용되던데?

 

“HTTP 통신도 소켓 통신이다”

 

HTTP 통신도 IP, Port를 통해 호스트와 호스트 내 프로세스를 구분하고 TCP나 UDP 프로토콜을 통해 데이터를 전송하기 때문에 소켓 라이브러리를 통해 소켓을 생성하여 데이터를 전송한다. 하지만 HTTP 통신은 클라이언트에서 요청을 보내고 서버에서 응답을 하는 웹에서 쓰이기 때문에 단방향과 양방향의 차이로 나눌 뿐이다. 즉, 소켓 통신은 HTTP 통신이 아니고 HTTP 통신은 소켓 통신의 한 종류이다.