
socket, bind, listen, accept, send, recv 등)을 통해 소켓을 생성하고 데이터를 송수신한다.어떻게 애플리케이션은 운영체제의 소켓을 통해 데이터를 전달할 수 있을까?
사용자가 요청을 보내면, 서버는 OSI 7계층 관점에서 아래에서 위로 데이터를 전달받는다. 클라이언트가 보낸 요청은 전송 계층에서 TCP 3-way handshake를 통해 연결을 수립한다. 연결이 완료되면 커널 모드에서 유저 모드로 전환되며, 사용자 요청은 소켓을 통해 애플리케이션으로 전달된다.
JVM에서 동작하는 Tomcat은 요청에 따라 쓰레드를 생성하여 운영체제의 소켓 API를 호출한다. 이를 통해 네트워크 데이터를 송수신하며 클라이언트와 통신한다.
만약 TLS(Transport Layer Security)가 활성화된 경우, JVM 내에서 JSSE(Java Secure Socket Extension)와 같은 암호화 라이브러리를 사용하거나 Tomcat의 OpenSSL과 같은 네이티브 라이브러리를 활용하여 TLS 핸드셰이크를 진행한다. 이를 통해 클라이언트와 서버 간의 데이터 전송이 암호화됩니다.
Tomcat은 클라이언트의 요청 데이터를 수신한 후, Spring 애플리케이션의 DispatcherServlet으로 전달하여 비즈니스 로직 처리를 시작한다.

strace -f -e trace=network -p <PID>
리눅스에서 strace 명령어로 실행중인 spring boot의 시스템콜을 확인 할수 있다.
accept 호출
accept 호출은 운영체제의 소켓 API로, Tomcat이 새로운 클라이언트 요청을 처리하기 위해 대기 상태에서 소켓을 수락(accept)하는 과정을 나타낸다.accept(239, ...)는 포트 8080에서 수신 대기 중인 Tomcat의 소켓(239)이 클라이언트 요청을 받아들이고, 새로운 소켓(140, 243, 244)을 생성하여 클라이언트와 통신하도록 준비하는 것을 의미한다.getsockname 호출
getsockname은 소켓의 현재 상태(예: 포트, IP 주소)를 확인하기 위한 시스템 콜이다.setsockopt 호출
setsockopt는 소켓 옵션을 설정하는 시스템 콜로, 여기서는 SO_LINGER와 TCP_NODELAY를 설정하고 있다.
SO_LINGER: 연결이 종료될 때 남아 있는 데이터를 처리하는 방식 지정.TCP_NODELAY: Nagle 알고리즘 비활성화. (지연 없이 데이터 전송)pid 326126 등)가 활동 중인 것을 보면, Tomcat이 요청 처리용 쓰레드(또는 쓰레드 풀)에서 작업을 수행하고 있는 것을 나타낸다.