HTTP 통신 과정
시작하기 앞서
과거에 개발하면서 서버와 클라이언트간 통신을 웹에서 ajax 앱에서 OKHTTP 모듈을 사용하며 reqeust response만 주고 받았었다.
사실 부끄러운 얘기지만 공부를 소홀히 한탓과 눈앞의 결과만을 중요시 여기고 정확한 작동원리에 대해서는 크게 관심 갖지 않았다.
그러나 점점 개발 난이도가 올라가면서 기초지식에 대한 중요성을 크게 깨달았고 요즘은 기초에 대해 공부하는데 시간을 많이 사용하고 있다.
그래서 이번 기회에 해당 내용을 좀 간략하게 정리하고자 한다.
요청에 대한 흐름
우리가 인터넷 주소창에 naver.com을 입력하고 접속하면 네이버 화면을 볼 수 있다.
이 과정에 많은 부분들이 생략되어 있다.
1. DNS 서버 조회
일단 첫번째로 naver.com이라는 도메인의 실제 IP주소를 찾기 위해 DNS서버에 요청한다.

그러면 위 그림처럼 등록된 DNS서버(168.126.63.1)에서 해당 도메인의 실제 IP주소를 찾아 다시 브라우저에 반환한다.
2. 3-Way-Handshake
두번째로 실제 IP주소를 알아내었으니 해당서버에 요청한다. 이 과정에서 통신을 맺기 위한 3 Way Handshake가 일어난다.

클라이언트 SYN 패킷 전송 > 서버
서버 SYN, ACK 패킷 전송 > 클라이언트
클라이언트 ACK 패킷 전송 > 서버
좀 간단하게 클라이언트와 서버로 비교하면
클라이언트 : 서버님 통신 가능? (SYN)
서버 : ㅇㅇ 가능(SYN + ACK)
클라이언트 : ㅇㅋ 지금 보낼게요(ACK)
위와 같이 3 Way Handshake가 성공하면 naver.com을 GET방식으로 요청했기 때문에 해당 웹페이지를 볼 수 있게된다.
3. 4-Way-Handshake
그리고 통신이 끝나게 되면 4 Way Handshake를 통해 서로의 연결을 종료한다.

클라이언트 FIN 패킷 전송 > 서버
서버 ACK 패킷 전송 > 클라이언트
서버 FIN 패킷 전송 > 클라이언트
클라이언트 ACK 패킷 전송 > 서버
간단한 설명
클라이언트 : 서버님 저 다 끝냄 (FIN)
서버 : 확인했어요 (ACK)
서버 : 문제없는듯 저도 종료할게요 (FIN)
클라이언트 : 확인이요 (ACK)
마무리
솔직히 위 내용은 엄청 심도있게 다룬다면 HTTP, DNS, tcp Handshake, OSI 등을 카테고리 마다 포스팅하여 깊은 내용을 다루어야 한다.
그러나 나의 개인적인 생각으로는 이 내용을 먼저 알고 자세한 내용에 대해서 카테고리 별로 알아가는게 조금 더 이해하기 쉬웠고 기억에 더 오래남는듯 하다.
그래서 혹시 나와 같은 사람이 존재할지도 모르는 생각에 위와 같이 내용을 정리해봤다.
아직 나도 완벽하게 알고있진 않지만 위 내용을 알고있다면 징검다리를 놓은것이고 세부내용을 전부 알게되면 튼튼한 대교와 같은 다리를 놓은것이라고 생각한다.
추가적으로 HTTPS는 3way 직후 SSL/TLS Handshake가 일어나니 자세한건 검색해보기 바란다.
WireShark라고 리눅스나 윈도우에 설치하여 주고받는 패킷에 대한 정보를 확인 가능한 툴이 있다.
나처럼 패킷이 오고가는 과정을 그림만으로 이해하기 부족하다면 직접 사용해보는 것을 추천한다.