소켓
소켓이란 프로그램이 네트워크 환경에 연결하여 데이터를 주고 받을 수 있게 만들어진 연결부(통신의 양끝단)이다
(일반)소켓은 TCP/IP 프로토콜을 주로 이용하므로, TCP/IP소켓이라고도 불린다. TCP/IP소켓은 OSI 7계층 중 4계층은 전송계층에서 사용되며, 전송 계층의 프로토콜 제어를 위한 코드를 제공한다.
소켓의 등장은 OSI 7계층과 관련이 깊다. 네트워크의 구조파악과 관리를 용이하게 하기 위해 등장한 OSI 7계층은 총 7가지로 네트워크의 계층을 구분한다. 하지만 이렇게 계층을 구분하는 것만으로는 한계가 있다. 왜냐하면 각 계층별 프로토콜은 일종의 약속, 규약일 뿐이고 프로토콜 구현을 위해서는 안에 들어갈 구체적인 구현부 함수가 필요하기 때문이다.
그리고 이때 사용할 수 있는 것이 바로 소켓이다. 소켓은 함수들의 body를 제공하며, 그 결과 별도의 구현없이 소켓을 이용하여 프로토콜의 구현이 가능하다. 즉, 프로토콜의 세부적인 명세를 일일히 정의할 필요가 없이 소켓을 이용하면 된다.
소켓 프로그래밍
프로그램 간 통신에 사용되는 소켓을 이용한 통신 프로그래밍을 socket programming이라고 한다
소켓은 "통신의 양끝단"인 만큼 통신의 송신자와 발신자측 모두에 소켓이 있어야 한다.
따라서 통신 연결 요청을 보내는 소켓을 client socket으로, 통신 연결 요청을 받는 소켓을 server socket이라고 한다
위 그림만 보면 오해하기 쉬운 점이 두 가지 있다.
먼저, 마치 client socket과 server socket이 태생적으로 구조가 다른 별개의 소켓인 것처럼 여겨질 수 있지만, 두 소켓은 본래 동일하다는 점이다. 소켓의 역할과 구현 절차 구분을 위해 상황에 따라 용어를 다르게 부르는 것일 뿐, 형태 자체가 다른 소켓은 아니다
또 소켓 연결이 완료된 다음 클라이언트 소켓과 서버 소켓이 직접 데이터를 주고받는 것은 아니다. 서버 소켓은 클라이언트 소켓의 연결 요청을 받아들이는 역할을 수행한 후에는 소켓 close된다. 즉, 서버 소켓은 클라이언트 소켓의 연결 요청을 받아들이는 역할만 수행할 뿐이고, 데이터 수신은 서버 소켓의 연결 요청 수락 후 데이터 수신의 목적으로 만들어지는 새로운 소켓을 통해 처리된다.
클라이언트 소켓: 실행흐름
1. 클라이언트 소켓 생성
: 소켓의 종류를 TCP소켓에서는 stream타입으로, UDP소켓에서는 데이터그램 타입으로 지정할 수 있다
2. 연결 요청
: IP와 포트번호로 연결대상을 특정하며, connect 요청에 대한 응답이 돌아와야 실행이 종료된다
3. 데이터 송수신
: 연결 요청과 마찬가지로, 응답(결과)가 돌아와야 실행이 종료된다
4. 소켓 닫기
: 데이터 송수신이 완료됐다고 판단되면 소켓을 close한다
서버 소켓: 실행흐름
1. 서버 소켓 생성
2. 바인딩(bind)
: 컴퓨터 실행시에는 동시에 많은 프로세스들이 실행 중이다.
만약 프로세스가 TCP 혹은 UDP 프로토콜을 사용한다면, 각 소켓은 표준에 따라 시스템이 관리하는 포트 중 하나의 포트 번호를 사용하게 된다. 이 때 서로 다른 소켓이 동일한 포트 번호를 사용하게 된다면 어떨까?
컴퓨터 입장에서는 이 데이터를 어느 소켓에서 처리해야 할지를 알 수 없을 것이다.
이러한 혼란을 방지하기 위해서 운영체제는 소켓들이 중복된 포트 번호를 사용하지 않도록, 내부적으로 포트 번호 정보를 관리한다. 이때 bind() API는 해당 소켓이 지정된 포트 번호를 사용할 것임을 운영체제에 요청하는 API이다.
(참고: 하나의 프로세스는 동일한 포트 번호에서 여러 개의 소켓을 만들 수 있다
-> 이를 통해 카톡에서 1번 소켓에는 A와, 2번 소켓에는 B와, 3번 소켓에는 C와 하는 각각의 채팅이 가능한 것)
3. 클라이언트 연결 요청 대기
: 클라이언트의 연결 요청이 올 때까지 기다리다가 연결 요청이 오면 대기 상태를 종료하고 return한다
4. 클라이언트 연결 수립
: 서버 소켓은 연결 요청을 받아들임과 동시에 새로운 소켓을 생성한다
그리고 앞서 말했듯 데이터의 송수신 자체는 이 새로운 소켓이 처리한다. 즉, 서버 소켓의 역할은 클라이언트의 ㅇ녀결 요청을 기다리고 수락하는 것까지이다.
5. 데이터 송수신
6. 소켓 닫기
웹소켓
웹소켓은 http에서 실시간 통신을 할 수 없다는 문제를 해결하기 위해 나온 기술이다.
http는 비연결성, 단방향을 특징으로 한다. 다시 말해, 클라이언트의 응답이 있을 때만 서버가 응답할 수 있으며, 한번 연결되어 응답을 받고 나면 바로 종료된다. 즉, 매번 연결을 맺고 끊는 과정이 있어야 하며, 그 과정의 비용이 크다.
반면 웹소켓은 실시간 통신이 가능하다. 즉, 연결지향(양방향)을 특징으로 하며, 일단 핸드쉐이크로 한 번 연결을 맺으면 수차례의 데이터 송수신이 모두 완료될 때까지 연결이 끊기지 않고 유지된다.
하지만 웹소켓이 http를 대체하는 개념은 아니며, 웹에서 실시간 통신을 해야하는 상황에서 쓸 수 있는 효율적인 프로토콜의 하나라고 생각하면 된다.
웹소켓은 통신 시작 이전에 통신을 확립한다. 즉, hand shaking을 통해 연결을 진행한 후에 데이터 송수신을 시작한다.
이때 최초의 연결(접속)만 http 프로토콜 위에서 hand shaking하는 방식으로 이루어지며, http위에서 진행되므로 http 헤더를 사용한다. 또, 웹소켓을 위한 별도의 포트는 없으며, 기존의 포트(http라면 80, https라면 443)을 사용할 수 있다(호환가능)
웹소켓은 비교적 최근의 기술이므로, 이전 브라우저에서는 기능하지 않을 수 있다.
이를 해결하기 위해 socket. io 등을 이용할 수 있다
참고자료
https://velog.io/@rhdmstj17/posts
'TIL' 카테고리의 다른 글
[TIL 2024. 03. 27] 모의고사 | zip() | 부분문자열 이어붙여 문자열 만들기 (0) | 2024.03.27 |
---|---|
[TIL 2024. 03. 26] 최소 직사각형 | 2차원 리스트에서 요소 추출하기 (0) | 2024.03.26 |
[TIL 2024. 03. 22] OSI 7계층 (0) | 2024.03.22 |
[TIL 2024. 03. 21] 2차원 리스트: 총정리 (0) | 2024.03.21 |
[TIL 2024. 03. 20] 데이터베이스와 DBMS (0) | 2024.03.20 |