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는 이 소켓에서 수행한다.