나도 들은 이야기이긴하지만 현직자님으로부터 들은 거니 신뢰성은 있다고 생각한다. 프론트 개발자에게 web 개발 흐름 질문은 정말 밥 먹듯이 들어오고, cs지식 중 가장 첫번째 질문으로 많이 물어본다고 한다. 그런데 여기서부터 막힌다면 뒤는 들을 필요도 없어질 정도로 기본적이면서도 중요도가 상당한 부분이라고 이해하면 좋을 것 같다. 보통 블로그에서는 DNS 부터 과정을 시작하고는 하는데, 정리하다보니 DHCP부터 시작하게 되었다. 아무튼 과정은 다음과 같다.
구글페이지에 접속하는 과정
- 인터넷 연결 - DHCP(IP주소 할당)
- 접속하는 노트북은 IP주소 필요
- DHCP - UDP - IP - ETH 로 이루어진 frame을 DHCP request
- broadcast ⇒ DHCP 서버가 받음
- 서버측에서 Demuxed 함
- DHCP ACK [ client IP주소, first-hop-router IP주소, DNS name & IP주소 ] 생성
- 다시 encapsulate 하고, self-learning한 스위치를 통해 client에게 전달 ⇒ client demuxed
- client는 성공적으로 DHCP ACK를 받아 IP주소를 할당받음
- 구글 주소 파악 - APR / DNS / 라우팅 프로토콜
- DNS서버는 LAN에 있지 않으므로 라우터를 거쳐야함. 이 말은 즉슨 Frame을 라우터로 보내야하고 그럴거면 mac dest addr이 라우터의 mac addr이어야하니 APR 필요
- DNS-UDP-IP-ETH로 encapsulate된 DNS 쿼리 생성 (아직 전송 못함)
- client가 라우터 IP주소 정보를 담은 ARP query를 broadcast함. (이때, DHCP에 의해 first-hop-router의 IP주소를 알고 있는 상태)
- 해당 라우터가 받아서 MAC주소를 ARP reply함.
- 이제 MAC주소도 알았으니 DNS 쿼리를 포함한 frame을 전송할 수 있게됨.
- 라우터에서 라우팅 프로토콜에 의해 라우트된 path로 포워딩되어 DNS서버에 접근
- DNS 서버측에서 demuxed 하고 구글의 IP주소를 응답으로 client에게 보내줌
- 성공적으로 그 응답을 client가 받아 구글 주소를 알게 됨
- TCP 3WAY handshaking
- client - TCP socket OPEN
- TCP SYN segment를 서버에게 보냄
- 서버는 TCP SYNACK을 보냄
- TCP 연결 완료
- HTTP 요청, 응답
- TCP socket을 통해 HTTP 요청 보냄
- 요청을 포함하고있는 datagram이 구글서버에 route됨
- 구글서버가 웹페이지를 HTTP reply로 응답보냄
- datagram이 client에게 route됨
- 이제 웹페이지가 보임