안녕하세요. Harry입니다.
본 포스팅의 목적은, 보다 깊은 CS지식을 공부하면서 배운 내용을 정리하기 위함입니다.
1. HTTP란?
HTTP.
풀어 쓰면 Hyper Text Transfer Protocol이라고 한다. 좀 더 풀어쓰면 인터넷 상에서 데이터를 주고받을 수 있는 프로토콜이다.
나는 HTTP를, 인터넷 상에서 정보를 교환할 때 필요한 약속이라고 이해하고 정의했다.
HTTP는 사용자 측에서 브라우저를 통해 url 등으로 요청(request)을 하면 서버에서는 해당 요청에 부합하는 결과를 찾아서 사용자에게 응답(response)하는 형태로 동작한다.
이런 통신 약속을 정한 이유는, 요청과 응답이 원하는 사람에게, 원하는 시간 안에, 내용의 변질없이 온전히 전달되어야 하기 때문이다.
태어날 때부터 인터넷을 접한 세대이기 때문에 그냥 (지금은 고인이 되버린) 인터넷 익스플로러만 더블클릭하면 내가 원하는 것들을 검색할 수 있다고 간단하게 생각했다.
하지만 개발자의 세계로 들어서기로 한 순간, 인터넷은 마냥 단순하고 간편한 개념이 아니었음을 느끼기 시작했다.
그리고 네트워크라는 분야를 처음 접하면서 들었던 의문은 당연했다.
www.google.com... 이게 뭐지?
우리가 쉽게 브라우저 주소창에 URL을 입력했을 때 그 뒤에서 어떤 과정을 거쳐서 내가 "요청"한 것이 "응답"되는지 궁금해졌다.
그래서 배운 내용에 대해 정리하고자 이 포스팅을 남기게 됐다.
2. 그래서, https://www.google.com 을 치면 뭔 일이 생기는데?
먼저 답부터 하자면, 위 url을 입력하면 구글 검색이 가능한 화면이 나온다. google을 naver로 단어를 바꾸면 네이버 포털사이트가 뜰 것이다. (당연)
근데 위와 같은 결과는 아래 6가지 통신 과정을 거쳐서 나타난다.
- 브라우저 창에서 url을 입력하면, 브라우저가 url을 파싱하여 HTTP Request Message를 생성하여 OS에 전달한다.
- OS는 DNS Lookup 과정을 통해 요청 url과 부합하는 ip주소를 찾는다.
- 부합하는 ip가 존재하는 서버로 이동한다.
- 웹 서버와 TCP 연결을 진행한다.
- 서버가 요청메세지에 대한 응답을 반환한다.
- 연결이 종료된다.
순서대로 살펴보자
1. 브라우저 창에서 url을 입력하면, 브라우저가 url을 파싱하여 HTTP Request Message를 생성하여 OS에 전달한다.
브라우저에 접속해서 https://www.google.com을 입력했다고 하자. 입력 후 엔터를 누른다면 브라우저는 해당 url을 파싱(해석)하기 시작한다.
(물론 URL을 세분화하여 분석하면 각각이 가지는 의미가 있지만, 일단 큰 틀에서 파악하도록 하자.)
브라우저는 해석한 내용을 토대로 HTTP Request Message를 만들어 OS에 전달한다.
2. OS는 DNS Lookup 과정을 통해 요청 url과 부합하는 ip주소를 찾는다.
DNS란, Domain Name System이라는 뜻이다.
DNS Loopup 과정은 크롬을 기준으로 브라우저 캐시파일 -> 내 PC 내 hosts파일 -> DNS cache 파일 순으로 요청받은 도메인에 매칭되는 ip를 찾는다.(도착지 주소 찾기)
앞서 생성한 HTTP Request Message 요청은 이제 "프로토콜 스택"이라는 OS 내 내장된 네트워크 제어 SW에 의해 목적지 ip 주소와 함께 데이터를 전달하는 패킷에 담긴다.
이후 LAN 어댑터에 의해 패킷은 전기신호로 변환되어 송출되고, 엑세스 회선에 의해 통신사용 라우터로 운반되어 인터넷 핵심부로 전달된다.
3. 부합하는 ip가 존재하는 서버로 이동한다.
인터넷 핵심부까지 이동한 후, 패킷은 목적지 ip까지 이동하게 된다.
패킷이 최종적으로 웹 서버측의 LAN에 도착하게 되면, 웹 서버의 방화벽이 패킷을 검사한다.
방화벽을 통과하면 먼저 캐시서버에서 응답할 수 있는 데이터인지 확인하고, 아니라면 웹서버로 이동하여 이를 처리한다.
4. 웹서버와 TCP 연결을 진행한다.
클라이언트와 서버가 TCP 연결을 시도하여 성공 한다는 것은 현재 통신이 연결되어 있음을 보장한다는 뜻이다.
TCP 통신 절차는 3-way handshake 과정을 거친다.
3-way handshake란, 데이터 전송의 정확성을 보장하기 위한 프로토콜이다.
일단은 그림으로 대체한다. (추후 자세한 설명 포스팅 작성)
5. 서버가 요청메세지에 대한 응답을 반환한다.
패킷이 웹 서버 기계에 도착하면 패킷을 추출하여 클라이언트에서 보낸 Request Message 를 복원하고 웹 서버 애플리케이션에 넘긴다. (이 때 클라이언트와 마찬가지로 OS에 내장된 프로토콜 스택이 이 역할을 수행한다.)
그리고 웹 서버 애플리케이션이 Request Message을 해석하여 요청에 부합하는 데이터를 응답 메시지에 넣어 클라이언트에 회송한다.
여기서 주의깊게 볼 것은, 응답 메시지가 클라이언트에 도착하기까지의 동작은 지금까지와는 정반대가 된다는 것이다.
6. 연결이 종료된다.
서버의 응답메세지가 정상적으로 클라이언트에게 전달되면, 정상적으로 클라이언트와 서버 간의 연결이 종료된다.
이 때 정상적인 종료를 보장하기 위한 4-way-Handshaking이 작동한다.(마찬가지로 자세한 건 추후 포스팅 할게요 ㅠㅠ)
자세히 설명하지 못하고 넘어간 개념도 있지만, 일단 큰 흐름은 위와 같이 정리했다.
물론 아직 배우는 중이라 틀린 부분도 있겠지만, 점차 보완해 나갈 예정!!
그럼, 봐주셔서 감사합니다..!