TCP Connection
#tcp
TCP 연결 순서
- 클라이언트가 SYN 패킷을 전송 -> 서버 미완료 큐에 추가
- 서버 -> SYN + ACK 패킷으로 등답 -> ACK가 다시 돌아오면 미완료 큐에서 완료큐로 이동
- 서버에서
accept()
호출 -> 미완료 큐 맨앞 FIFO(선입선출)에서 꺼내서 사용
왜 큐가 2개인가?
InComplete Connection Queue (SYN Queue, 미완료 연결 큐)
TCP 3-way handshake 에서 아직 최종 ACK를 받지 못한, 완전히 완료 상태가 아닌 연결들이 들어있는 큐
Complete Connection Queue (Accept Queue, 완료 연결 큐)
handshake가 모두 끝나서 완료 상태가 된 커넥션들이 들어 있는 큐
실제로 애플리케이션(Tomcat) 이 NIO/select로 가져가는 대상
- 클라이언트의 ACK 도달 시, 미완료 큐에서 완료 큐로 이동
- 서버 애플리케이션이
accept()
호출 시 큐에서 가장 먼저 들어온 연결을 할당받아 실제 데이터 통신을 시작..
** 미완료 연결을 왜 큐에 저장할까? handshake 중에 상태,IP,타이머 정보등등을 미리 기록해야 삼수 응답 처리, 재전송, 보안 정책등의 서버 네트워크 스택 레벨에서 정확히 처리할 수 있기 때문이다.
Reference
https://arthurchiao.art/blog/tcp-listen-a-tale-of-two-queues/