Spring Boot의 요청 처리 방식을 보기 위해 controller까지의 함수 flow를 보다가 궁금증이 생겼다. Thread를 만들고 난 후 SocketProcessorBase라는 클래스를 거치는 것이었었다. 이 클래스는 소켓 통신을 처리하는 로직이라고 하는데 기존의 내 지식으로는 HTTP 통신에서 소켓이 왜 나오는지 이해가 되지 않았다.
그래서 어떤 연관성이 있는지 조사해보았다.
TCP/IP 프로토콜

HTTP와 소켓의 연관성을 설명하기 위해 TCP/IP 프로토콜에 대해 간단히 살펴본다.
1. Network Interface 역할
- 데이터를 물리적인 네트워크 매체를 통해 전송(ex. 이더넷 케이블, 무선 신호)
- 네트워크 카드나 드라이버 같은 하드웨어 요소들과 연관됨
- 데이터에 물리 주소(MAC 주소)를 지정하고 데이터 프레임을 전송한다.
주요 프로토콜: 이더넷, 와이파이, ARP 등
2. Internet 역할
- 네트워크 간 데이터 전송 담당
- IP 주소를 지정해 IP 패킷을 구성
- 라우터를 통해 경로를 결정한다
- 호스트 간의 논리적 통신을 지원
주요 프로토콜: IP(IPv4, IPv6), ICMP, IGMP 등
3. Transfort 역할
- 네트워크 양 끝단 호스트 사이에서 전송 기능 제공
- 시스템의 logical address와 포트 번호를 가지고 상위 계층(application) 프로세스를 연결해서 통신 진행
- 두 시스템 간의 logical한 통신을 지원
- 세그먼트 단위로 데이터를 처리 Internet layer와의 차이: Internet layer는 통신할 서버를 찾아주는 단계라면, Transfort layer는 서버에서 어떤 프로세스와 통신해야 하는지 까지 찾아주는 단계
주요 프로토콜: TCP, UDP
4. Application 역할
- 응용 프로그램들이 서비스를 할 수 있도록 표준 인터페이스 제공
- 최종 사용자가 상호 작용하는 계층
- 데이터를 인간이 이해할 수 있는 형태로 변환
- 서비스를 제공하고 받기 위해서 어떤 형식으로 메세지를 주고 받아야 하는지를 정리한 프로토콜 레이어
주요 프로토콜: HTTP, FTP, SMTP, DNS
이 중에 알아봐야 할 것은 HTTP이다. Application layer 이전의 3 계층은 운영 체제에 구현이 되어있기 때문에 개발자가 관여할 부분이 아니다. 따라서 응용 프로그램을 개발하여 통신하기 위해서는 운영체제(커널)에 메세지를 전달하는 과정이 필요하다.
이 과정을 소켓 통신을 통해 진행하게 된다. 즉 application layer에서는 호스트간의 연결에 직접적으로 관여하지 않는다. 결국 HTTP 통신도 HTTP 프로토콜을 따르는 데이터를 TCP 소켓 통신으로 주고 받는 과정인 것이다.
TODO: TCP 연결과정, HTTP 연결과정 비교
TCP 프로토콜 연결 과정
TCP가 통신을 하는 과정을 간단하게 소개하면 아래와 같다.
3-way handshaking
연결을 시작할 때 TCP 통신은 3-way handshaking을 시도한다.
- Client 측에서 server에 접속을 요청한다(SYN).
- Server 측에서 접속을 수락하고 client로의 접속도 요청한다.
- Client에서 접속을 수락한다는 메세지를 보낸다. 위 3단계를 거치고나면 통신이 established 되고 이때부터 데이터를 주고받을 수 있게 된다.
4-way handshaking
4-way handshaking은 TCP 연결을 끝낼 때 진행되는 절차이다.
- Client가 연결을 끊겠다는 메세지를 전달한다.
- Server는 알겠다고 하고 보내던걸 마저 보낸다(WAIT 상태)
- Server가 보내던걸 다 보냈으면 진짜 종료하겠다는 메세지를 보낸다.
- 종료 요청을 받은 client는 메세지를 확인했다는 메세지를 보낸다.
HTTP와의 연관성
HTTP는 application layer에서의 프로토콜이고 실제 데이터를 보내기 위해서는 아래 layer의 프로토콜을 사용할 수 밖에 없다. HTTP는 TCP를 기반으로 만들어진 프로토콜이다. 따라서 TCP 소켓 통신과 마찬가지로 3-way handshaking, 4-way handshaking 두 절차를 모두 수행한다.
결국 이 둘을 구분하는 차이점은 연결을 언제까지 유지할 것이냐 이다. TCP 소켓 통신은 연결 후 연결을 끊고 싶을 때 까지 유지하는 방식이다. 반면, HTTP는 client가 서버로 요청을 보내고 응답을 받는 단방향 통신 방법이다. 즉 응답을 준 직후 바로 연결을 끊는다.
결론
지금까지 HTTP라는 프로토콜을 쉽게 사용하기만 하고 깊게 들여다보기 위한 노력이 부족했던 것 같다. OSI 7계층도 이번 조사를 통해 오랜만에 보게 되었는데 다시 자세히 봐야겠다는 생각을 했다. 웹 소켓과 소켓 통신을 혼동해서 생각 해왔던 것 같아서 이 부분도 정리를 확실해 해봐야겠다.