Socket Lifecycle

소켓 API 수명 주기

소켓 API는 파일처럼 읽고 쓰는 인터페이스지만 서버와 클라이언트가 준비, 연결, 송수신, 종료 단계를 다르게 거칩니다.

01

socket 생성

주소 패밀리, 타입, 프로토콜을 정해 커널에 소켓 객체를 만듭니다.

AF_INET/SOCK_STREAM
02

bind/listen

서버는 로컬 IP와 포트에 묶고 연결 대기 큐를 엽니다.

server ready
03

connect

클라이언트는 서버 주소로 연결을 시도하며 TCP handshake가 시작됩니다.

active open
04

accept

서버는 대기 큐의 연결을 꺼내 통신용 새 소켓을 얻습니다.

connected socket
05

send/recv/close

바이트 스트림을 주고받고 FIN 또는 close로 연결을 정리합니다.

stream
bind
로컬 주소 점유 서버가 어느 인터페이스와 포트에서 받을지 정하며 중복 점유와 권한 문제가 생길 수 있습니다.
SO_REUSEADDR 한계
accept
새 연결 분리 accept 뒤에는 listen fd가 아니라 새 연결 fd에서 read/write가 반복된다는 점을 표시합니다.
반복 호출
recv
바이트 스트림 읽기 한 번의 recv가 애플리케이션 메시지 하나와 일치한다고 가정하면 안 됩니다.
메시지 경계 필요

소켓 구현 기준

타임아웃 무한 blocking을 피하려면 timeout이나 non-blocking 전략을 둡니다.
부분 송수신 send와 recv는 요청한 길이를 한 번에 처리하지 못할 수 있습니다.
자원 해제 예외와 정상 종료 모두에서 소켓을 닫는 경로를 둡니다.