소켓 통신
소켓 통신은 소켓을 통해 프로세스 간에 데이터를 주고받는 방식이다. IP 주소는 전화 번호에, 포트 번호는 내선 번호에 해당한다고 보면 쉽다. 두 프로세스는 소켓 주소로 연결된다. 소켓 주소는 IP 주소와 포트 번호의 조합이다. 서버는 socket으로 소켓을 만들고…
주요 장면
대본
한 줄 정의
소켓 통신은 소켓을 통해 프로세스 간에 데이터를 주고받는 방식이다.
IP 주소는 전화 번호에, 포트 번호는 내선 번호에 해당한다고 보면 쉽다.
두 프로세스는 소켓 주소로 연결된다. 소켓 주소는 IP 주소와 포트 번호의 조합이다.
TCP 소켓 연결 순서
서버는 socket으로 소켓을 만들고 bind로 IP 주소와 포트를 묶는다.
클라이언트는 socket을 만든 뒤 connect로 서버에 연결을 청한다. 연결은 3-way Handshake로 세운다.
서버는 listen으로 대기하다 accept로 요청을 받고, 양측이 send와 recv로 데이터를 주고받는다.
데이터 교환이 끝나면 close로 연결을 닫는다.
소켓 유형 비교
소켓은 전송 계층 프로토콜에 따라 스트림, 데이터그램, 로우 소켓으로 나뉜다.
스트림 소켓은 TCP 기반으로 연결지향, 신뢰성, 순서 보장을 제공한다.
데이터그램 소켓은 UDP 기반 비연결형이라 오버헤드가 작다. 로우 소켓은 IP 헤더를 직접 다룬다.
TCP 포트와 UDP 포트는 번호가 같아도 서로 다른 소켓으로 취급된다.
WebSocket과 HTTP 비교
앞 문제의 정답은 스트림 소켓(TCP)이다. 연결지향과 순서 보장이 특징이다.
소켓 API는 연결 관리까지 개발자가 맡는다. WebSocket은 핸드셰이크 이후 메시지 단위로 다룬다.
HTTP는 요청마다 연결을 맺고 응답 후 끊는 무상태 방식이다.
WebSocket은 HTTP 핸드셰이크로 시작해 101 Switching Protocols 응답 후 전이중 통신을 한다. HTTP를 완전히 대체하지는 않는다.
한계와 연결 감시
TCP 소켓은 닫기 전까지 열려 있지만, 단절은 데이터를 보내기 전에는 알기 어렵다.
그래서 ping과 pong으로 주기적으로 연결 생존을 확인한다. 응용 계층의 Heartbeat를 두는 것이 일반적이다.
장점은 양방향 통신, 낮은 지연, 서버 푸시다. 단점은 서버가 연결 상태를 유지해야 한다는 점이다.
방화벽과 프록시가 장기 연결을 끊을 수 있어 한계도 함께 봐야 한다.
정리
정리하면 실시간 양방향 통신은 WebSocket, 단순 요청-응답은 HTTP로 나눠 설계한다.
WebSocket은 HTTP를 대체하는 것이 아니라 HTTP 핸드셰이크로 시작한다.
소켓은 IP 주소와 포트 번호로 식별되는 종단점이다. TCP 연결은 3-way Handshake로 세운다.