728x90
DNS (Domain Name System)
DNS는 애플리케이션 계층 프로토콜로, 인터넷에서 도메인 이름을 IP 주소로 변환하는 시스템
웹사이트 주소를 입력할 때, DNS는 그 도메인 이름을 컴퓨터가 이해할 수 있는 숫자 형태인 IP 주소로 변환
EX) 도메인인 이름: www.example.com 👉 IP주소: 93.184.216.34
역할
- 도메인 이름을 IP 주소로 변환하여 브라우저가 서버에 접속할 수 있게 함
- 인터넷 자원의 위치를 쉽게 찾을 수 있도록 함 (사람들이 기억하기 쉬운 이름을 사용)
TCP와 UDP 중 어떤 것을 사용하는가?
DNS는 기본적으로 UDP를 사용, 일부 경우에 따라 TCP도 사용됨
UDP (User Datagram Protocol) 사용
- 빠르고 간단한 요청/응답을 처리하는 데 적합하기 때문에 기본적으로 DNS질의는 UDP를 사용함
- DNS는 짧은 메시지를 처리하며, 연결을 설정할 필요가 없고 빠른 응답을 제공
- 기본 포트: UDP 53번 포트
TCP (Transmission Control Protocol) 사용
- 큰 응답 메시지(예: 많은 레코드나 데이터를 반환하는 경우)에 대해서는 UDP에서 처리할 수 없는 경우 TCP로 전환
- EX) DNS 응답이 512바이트를 초과하는 경우, 클라이언트는 TCP를 통해 DNS 서버와 통신
- 기본 포트: TCP 53번 포트
"www.github.com" 을 브라우저에 입력하면?
이 과정은 DNS 요청부터 웹 서버 응답까지 이루어짐
- 브라우저가 URL을 입력
- 사용자가 **www.github.com**을 브라우저에 입력하고 엔터를 칩니다.
- 브라우저는 URL 파싱을 통해 해당 주소가 HTTP/HTTPS로 시작하는지 확인합니다.
- HTTPS는 보안 연결을 의미하며, 브라우저는 먼저 DNS 요청을 통해 해당 도메인의 IP 주소를 찾습니다.
- DNS 요청
- 브라우저는 **DNS 리졸버(Resolver)**에 **www.github.com**에 대한 IP 주소를 요청합니다.
- 이때 브라우저가 DNS 캐시를 가지고 있다면, 바로 캐시된 IP 주소를 사용할 수 있습니다. 없다면, DNS 요청이 로컬 DNS 서버로 전송됩니다.
- DNS 서버와의 상호작용
- 로컬 DNS 서버는 **www.github.com**에 대한 IP 주소를 찾기 위해, DNS 루트 서버부터 시작하여 최상위 도메인(TLD) 서버(예: .com), 그 후 권한 있는 DNS 서버(www.github.com을 관리하는 서버)로 순차적으로 요청을 보냅니다.
- DNS 서버가 **www.github.com**에 대한 IP 주소를 찾으면, 그 결과를 브라우저에 반환합니다.
- 서버의 IP 주소 확인
- 예를 들어, DNS 서버가 192.30.255.113과 같은 GitHub의 IP 주소를 반환합니다.
- 브라우저는 이제 GitHub 서버의 IP 주소를 알고 있으므로, 해당 주소로 TCP 연결을 시작합니다.
- TCP 연결을 위한 3-way 핸드셰이크 (3단계 연결 과정)
- 브라우저는 GitHub 서버의 IP 주소로 TCP 연결 요청을 보냅니다.
- 이 과정은 3-way 핸드셰이크로 이루어집니다:
- SYN: 브라우저는 GitHub 서버에 SYN 패킷을 보내 연결 시작을 요청합니다.
- SYN-ACK: GitHub 서버는 SYN-ACK 패킷을 응답하여 연결을 수락합니다.
- ACK: 브라우저는 ACK 패킷을 보내 연결을 확립합니다.
- 이렇게 TCP 연결이 완성됩니다.
- TLS/SSL 핸드셰이크 (HTTPS 연결 시)
- HTTP/HTTPS는 보안 연결을 위해 TLS/SSL 핸드셰이크를 사용합니다. 이 과정은 HTTPS가 안전하게 데이터를 암호화하고 무결성을 보장할 수 있도록 합니다.
- 클라이언트 Hello: 브라우저는 GitHub 서버에 TLS ClientHello 메시지를 보내, 지원하는 암호화 알고리즘, 세션 ID 등을 포함하여 서버에 TLS 설정 요청을 합니다.
- 서버 Hello: GitHub 서버는 TLS ServerHello 메시지를 보내, 서버가 선택한 암호화 알고리즘과 공개 키 등을 전송합니다.
- 서버 인증서 전송: GitHub 서버는 서버 인증서(SSL 인증서)를 브라우저로 전송하여, 서버의 신뢰성을 인증합니다.
- 키 교환: 클라이언트와 서버는 세션 키를 안전하게 교환합니다. 일반적으로 디피-헬만(Diffie-Hellman) 키 교환 알고리즘을 사용합니다.
- 암호화된 통신 시작: 이 과정을 마친 후, 클라이언트와 서버는 대칭키를 사용하여 암호화된 통신을 시작합니다.
- HTTP 요청 전송
- 이제 브라우저는 HTTPS 연결을 통해 GitHub 서버에 HTTP 요청을 보냅니다.
- 이 요청은 GET 메서드로 웹 페이지나 리소스를 요청하는 내용이 포함됩니다.
- 예를 들어, / (홈페이지 요청) 또는 /index.html와 같은 리소스를 요청할 수 있습니다.
- GitHub 서버의 응답
- GitHub 서버는 HTTP 응답을 반환합니다. 응답에는 HTML 파일, CSS 파일, JavaScript 파일, 이미지 등 다양한 리소스가 포함될 수 있습니다.
- 서버는 웹 페이지의 HTML과 필요한 스타일 시트(CSS), 스크립트 파일(JavaScript) 등을 전송합니다.
- 서버는 HTTP 응답에 200 OK와 함께 웹 리소스를 반환하거나, 페이지가 없으면 404 Not Found와 같은 오류 코드를 반환할 수 있습니다.
- 브라우저가 응답 처리
- 브라우저는 받은 HTML, CSS, JavaScript 등을 해석하여 웹 페이지를 렌더링합니다.
- 만약 추가적인 리소스(이미지, 폰트 등)를 로드해야 한다면, 추가 HTTP 요청을 보내어 필요한 자원을 받습니다.
- 연결 종료 (TCP)
- 모든 요청과 응답이 완료되면, 브라우저와 GitHub 서버 간의 TCP 연결은 FIN 패킷을 통해 종료됩니다.
- 4-way 핸드셰이크를 통해 연결이 닫히며, 서버와 브라우저는 연결을 종료합니다.
728x90