TCP Socket Lifecycle

listen은 문을 열고 accept는 완료된 연결을 꺼낸다

서버의 listening socket은 계속 대기하고, accept가 반환한 connected socket이 실제 데이터 송수신을 담당한다.

bind는 로컬 주소를 고정하고 listen은 passive socket으로 바꾼다.
connect의 3-way handshake가 끝난 연결은 큐에 들어간다.
accept 이후에도 원래 소켓은 계속 새로운 연결을 기다린다.
1
socket()

커널에 TCP 소켓 객체를 만들고 fd를 받는다.

2
bind()

0.0.0.0:8080 또는 특정 IP:port에 묶는다.

3
listen(backlog)

연결을 받을 수 있는 passive socket 상태가 된다.

4
accept()

완료 연결 큐에서 하나를 꺼내 새 fd를 반환한다.

Client side connect() SYN → SYN-ACK → ACK 후 blocking connect가 반환된다.
client fd198.51.100.24:52431
Server queue 완료 연결 대기열 backlog는 accept 전까지 쌓이는 완료 연결 큐 크기에 가깝다.
#1ready for accept
#2ready for accept
server_fd 계속 listen 상태

새 클라이언트를 받기 위한 문이다. 이 fd로 데이터 송수신하지 않는다.

client_fd accept가 반환한 연결 소켓

특정 클라이언트와 묶인 fd다. recv/send는 이 소켓에서 수행한다.